Coccinelle release 1.0.0-rc13
authorCoccinelle <cocci@diku.dk>
Mon, 2 Jul 2012 19:32:42 +0000 (21:32 +0200)
committerRene Rydhof Hansen <rrh@cs.aau.dk>
Mon, 2 Jul 2012 19:32:42 +0000 (21:32 +0200)
** Language:
- Addition of initializer list metavariables.  Thanks to Michael Stefaniuc
  for noticing the need for them.
- Allow multiple position variables per token
- ++ can now be associated with - code
- Allow /* */ comments as smpl comments, not only as + code
- Add support for && (label addresses)
- local idexpression metavariable no longer matches static local x
- Consider using to be a comment in C++ code.  Patch submitted by Jani Monoses.
- Command line cocci
- print_main etc for ocaml Coccilib
- =~ not ~= is used to indicate a regular expression constraint on an
  identifier.  And !~ for a nonmatch.
- allow long double, short int, long int, and long long int in SmPL code.
- gcc constructors allowed in SmPL.  Thanks to Uwe Kleine-Koenig for
  pointing out the problem.
- Allow ! to appear before () in depends.  Thanks to SF Markus Elfring for
  noticing the problem.
- Can add code containing #pragma or #line.
- Multicharacter command-line options now begin with -- and contain -
  rather than _.
- Allow multiple types of hidden metavariables, each preceded by @.
  Position variables can be attached to these.
- Python code now receives a structure containing a list of matched
  elements for list metavariables.  Thanks to Michael Stefaniuc for
  suggesting this features.
- Python code now receives expressions and identifiers as ordinary strings,
  not as elements of specific structures.
- Allow size_t as the type of an array index in smpl code.  Reported by
  Mansour Moufid.
- Allow exp@id
- Allow renaming an expression as an identifier (@i)

** Features:
- Preserve spacing before // comments when not at the beginning of a line
- Adjusted parsing of endif to put it after jump code
- Improve warning message when using -use_cache
- More helpful initial value for exported variables in python
- Support - on expression nests
- Better handling of the case of a matched declaration that should only
  be replaced by other top level things.
- Allow a semantic patch beginning and ending with braces to match the
  complete body of a function if the braces are not removed and if nothing
  is added before the first brace or after the last one.
- Add -cache_prefix option, to specify where to put cached files.
- Allow module_init(foo); to match module_init(foo) (or likewise for any
  declarer), when no transformation is specified on the semicolon.
- Add Coccilib.exit() for ocaml code and cocci.exit() for python code,
  to abort the treatment of the current file.
- Don't multiply print the same patch for the same file
- Drop date in diff
- Don't repeat smpl type warnings
- -sp_file/-cocci_file are now optional.  If not present an argument that
  ends in .cocci is assumed to be the name of the file containing the
  semantic patch.
- Allow limiting the size of a named cache using -cache_limit
- Cache name specified with -cache_prefix is extended according to the
  index (parallelism), if any.
- Allow multi-character constants in C code and SmPL code.  Thanks to Kamil
  Pilch for pointing out the problem.
- Better parsing of K&R C functions.  No longer convert all parameters to
  typedefs.
- Implement newes as a hash table, for more efficiency on big sets of
  environments.
- A local variable that is declared without a type is not considered to be
  a local variable.  Actually, such a variable is probably really a macro
  that expends to a declaration, and this macro is not the variable name.
- Allow iteration to make modifications when the modifications are done
  inplace.
- -debug gives information about defined virtual rules and about virtual
  identifier bindings.
- no more crashing on c++-like code without the c++ argument.
- dependencies can have ! on ()
- Give ocaml code access to Flag and thus the current file name.
- Slightly more efficient handling of lists.
- Slightly better error message in the case of inconsistent paths
- Improve limited size caching
- Remove zero #ifdefs when everything else is removed
- Mac OSX compatibility (tested on OSX Lion)
- 'Make depend' is called automatically when starting from a cleaned source
- Configure flag --enable-release makes 'make' build the optimized version of
  coccinelle if possible.
- The installed 'bin/spatch' calls spatch.opt or spatch with default parameters
  for iso/headers/python. 'bin/spatch.opt' and 'bin/spatch.byte'
- The bundled packages are now in the 'bundles' subdirectory and in the
  form of their original tarballs. These are extracted and used on-demand.
- Compatibility with python 2 and python 3. Also, a small bug is fixed in the order
  of library includes that caused sometimes trouble when building the pycaml library.
- Dropped the dependency on Perl in the Makefiles
- The configure script uses pkg-config and ocaml findlib and provides many
  flags for tuning/overriding the build process (including the ocaml
  compiler and the C compiler and preprocessor).
- Add line number directives to the .ml file generated from a .cocci file
- Added 'make check' as an alternative to 'make test'. It can run after
  building spatch, checks whether some featues work (python and ocaml scripts,
  regexes) if these features are enabled, and then launches the test suite
  with a 75% success rate requirement. It also does not ask for user input
  and can be used in autonomous builds.
- Added an experimental --reverse flag to invert the semantic patch before application.
  Note that not all patches can be inverted, nor is it guaranteed that applying
  a patch followed by applying its inverse is an identity operation.

** Bugfix:
- Corrected parsing of script strings delimited by a single quote.  Thanks
  to Eugeniy Meshcheryakov for reporting the problem.
- Improved indentation of added ifdefs.
- Allow added comments and #ifdefs to precede other added code.  Thanks to
  Jani Monoses for noticing the problem.
- Corrected failure to due missing ocamlfind. Thanks to Derek M. Jones for
  reporting the problem.
- Allow fake nodes to be - in the allminus case, to drop tokens related to
  a function definition or forward declaration but before the first code
  mentioned in the semantic patch.
- Drop __init etc when deleting a whole function.
- Cause appropriate newlines to be preserved when multiple matches (trees)
  contain adjacent modifications derived from the same SmPL code.
- check_meta takes into account fresh identifier seed information.
- Types for worth-trying optimization should not be followed by space
- Improved filtering of result of matching atomic patterns
- Drop positions before creating function prototype rules
- Adjust position of { introduced by adding multiple statements in a
  single-statement position
- Drop newline after function call ( when all arguments on that line are
  eliminated
- Accept removal of a single declaration, replaced by arbitrary,
  non-declaration code
- smpl_spacing takes into account newlines, indentation
- Improved prevention of transformations on toplevel { ... } from causing
  changes outside function boundaries; also outside ifs, whiles, etc.
  Changes are still allowed on { ... } present for other reasons.
- Fix bug in include_match that caused everything to halt when all matches
  were discarded
- Don't call Insert_plus on rules that cannot be evaluated due to failed
  dependencies.
- Allow variable declaration right after a case in switch.
- The top of a loop is also after the body of a loop, for ... in loop body
- Do not anchor Str regexp at the beginning of the string to check
- Type annotation for C code uses most recent env for typedefs when
  possible.  Thanks to Andrea Canciani for pointing out the problem.
- Pretty print pointer types without a trailing space.  Thanks to Michael
  Stefaniuc for pointing out the problem.
- Propagate dependencies further in get_constants2
- Make lexer more dos friendly
- slightly better handling of long long
- Strip constraints from metavariables in function prototype treatment
  before comparison, due to incomparability of pcre regexps.
- Fixed obsolete regexp doc, thanks to Dmitry Osmakov
- Improved x || ... || y to avoid double modification
- Transparently allow \( \| and \) to be on lines beginning with -.  The -
  has no effect.
- Remove memory leak related to pr2_once management.  Thanks to Robert
  Gomulka for helping to solve the problem.  Don't use once hashtable if
  messages won't be printed anyway.
- Change the type of subtraction mixing pointer and array to have int result.
  Thanks to Robert Gomulka for noticing the problem.
- Fix interpretation of dependencies in the presence of virtual rules.
  Ignore constraints on inherited position metavariables in a rule that
  will be ignored.
- Better support meta iterator and meta declarer tokens, and symid tokens.
- Better indentation after added noindent.
- Fixed length bug in the treatment of structures.
- Allow inheriting declaration/field metavariables.
- Don't drop spaces after parentheses in when no minus code present.
  Thanks to Terry Wilson for reporting the problem.
- Keep inherited metavariables in asttomember (preprocessing for matching)
- allminus for types, to allow removing const, not just matching it
- improved pretty printing when something is added before a closed brace
- Allow matching on nameless structs.  Thanks to Ron Minnich for reporting
  the problem.
- Pretty printing of const/volatile arrays in smpl code.
- Don't allow just dropping an exp or type
- Avoid removing #endif when surrounded by - code
- Print some important error messages even with the --very-quiet flag.
- Fixed parallel building in the Makefiles
- Fixed the compilation of the "pure bytecode" version. If you use the
  bundled pycaml or ocaml-pcre, you'll need their stub libraries in
  your LD_LIBRARY_PATH.
- For get_constants, virtuals should be false, not true
- C parsing of top-level declarers with initializations.
- Remove constraints in predicates in match result, to avoid PCRE equality
  problems
- Enum assignment matching an enum value shouldn't cause a failure

477 files changed:
Makefile
Makefile.am [new file with mode: 0644]
Makefile.common [new file with mode: 0644]
Makefile.config.in
Makefile.libs
Makefile.release
aclocal.m4 [deleted file]
autogen.sh [deleted file]
bundles/extlib/Makefile
bundles/menhirLib/Makefile
bundles/menhirLib/menhir-20120123/AUTHORS [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/CHANGES [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/INSTALLATION [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/LICENSE [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/Makefile [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/Makefile.arch [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/demos/Makefile [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/demos/Makefile.auto [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/demos/Makefile.shared [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/demos/OMakefile.shared [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/demos/calc-param/Makefile [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/demos/calc-param/OMakefile [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/demos/calc-param/OMakeroot [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/demos/calc-param/README [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/demos/calc-param/calc.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/demos/calc-param/lexer.mll [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/demos/calc-param/parser.mly [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/demos/calc-param/tokens.mly [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/demos/calc-two/Makefile [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/demos/calc-two/OMakefile [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/demos/calc-two/OMakeroot [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/demos/calc-two/README [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/demos/calc-two/algebraic.mly [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/demos/calc-two/calc.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/demos/calc-two/common.mly [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/demos/calc-two/lexer.mll [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/demos/calc-two/reverse.mly [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/demos/calc-two/tokens.mly [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/demos/calc/.omakedb [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/demos/calc/.omakedb.lock [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/demos/calc/Makefile [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/demos/calc/OMakefile [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/demos/calc/OMakefile.omc [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/demos/calc/OMakeroot [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/demos/calc/OMakeroot.omc [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/demos/calc/README [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/demos/calc/calc.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/demos/calc/lexer.mll [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/demos/calc/parser.mly [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/demos/ocamldep.wrapper [new file with mode: 0755]
bundles/menhirLib/menhir-20120123/manual.pdf [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/menhir.1 [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/.marker [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/Fix.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/Fix.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/IL.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/IO.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/IO.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/META [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/Makefile [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/action.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/action.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/back.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/back.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/breadth.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/breadth.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/checkOCamlVersion.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/codeBackend.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/codeBackend.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/codeBits.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/codeBits.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/codePieces.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/codePieces.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/compressedBitSet.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/compressedBitSet.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/concreteSyntax.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/conflict.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/conflict.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/convert.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/convert.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/coqBackend.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/coqBackend.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/cst.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/cst.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/derivation.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/derivation.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/dot.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/dot.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/engine.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/engine.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/engineTypes.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/error.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/error.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/fancy-parser.mly [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/front.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/front.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/gMap.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/gSet.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/grammar.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/grammar.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/infer.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/infer.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/infiniteArray.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/infiniteArray.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/inliner.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/inliner.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/installation.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/interface.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/interface.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/internalSyntax.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/interpret.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/interpret.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/invariant.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/invariant.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/item.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/item.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/keyword.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/keyword.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/lexdep.mll [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/lexer.mll [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/lexmli.mll [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/lineCount.mll [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/listMonad.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/listMonad.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/lookahead.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/lr0.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/lr0.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/lr1.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/lr1.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/lr1partial.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/lr1partial.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/mark.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/mark.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/misc.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/misc.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/nonTerminalDefinitionInlining.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/nonTerminalDefinitionInlining.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/nonpositiveCycles.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/nonpositiveCycles.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/option.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/option.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/packedIntArray.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/packedIntArray.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/parameterizedGrammar.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/parameterizedGrammar.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/parameters.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/parser.mly [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/parserAux.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/parserAux.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/partialGrammar.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/partialGrammar.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/patricia.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/patricia.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/positions.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/positions.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/pprint.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/pprint.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/preFront.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/preFront.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/printer.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/printer.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/rawPrinter.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/rawPrinter.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/reachability.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/reachability.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/reductionGraphs.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/referenceInterpreter.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/referenceInterpreter.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/rowDisplacement.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/rowDisplacement.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/sentenceLexer.mll [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/sentenceParser.mly [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/settings.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/settings.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/slr.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/slr.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/standard.mly [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/stretch.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/stringMap.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/stringMap.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/stringSet.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/stringSet.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/syntax.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/tableBackend.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/tableBackend.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/tableFormat.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/tableInterpreter.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/tableInterpreter.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/tarjan.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/tarjan.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/time.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/time.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/tokenType.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/tokenType.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/traverse.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/unionFind.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/unionFind.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/unparameterizedPrinter.ml [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/unparameterizedPrinter.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/unparameterizedSyntax.mli [new file with mode: 0644]
bundles/menhirLib/menhir-20120123/src/version.ml [new file with mode: 0644]
bundles/pcre/Makefile
bundles/pycaml/Makefile
bundles/pycaml/Makefile.debian [copied from bundles/pycaml/Makefile with 86% similarity]
bundles/pycaml/chemoelectric-pycaml-8614105.tar.gz [new file with mode: 0644]
bundles/pycaml/chemoelectric-pycaml-8614105/.marker [new file with mode: 0644]
bundles/pycaml/chemoelectric-pycaml-8614105/COPYING [new file with mode: 0644]
bundles/pycaml/chemoelectric-pycaml-8614105/META.in [new file with mode: 0644]
bundles/pycaml/chemoelectric-pycaml-8614105/Makefile [new file with mode: 0644]
bundles/pycaml/chemoelectric-pycaml-8614105/README [new file with mode: 0644]
bundles/pycaml/chemoelectric-pycaml-8614105/examples/floatproduct.ml [new file with mode: 0644]
bundles/pycaml/chemoelectric-pycaml-8614105/examples/log.ml [new file with mode: 0644]
bundles/pycaml/chemoelectric-pycaml-8614105/examples/log.py [new file with mode: 0644]
bundles/pycaml/chemoelectric-pycaml-8614105/examples/ocamlpill.ml [new file with mode: 0644]
bundles/pycaml/chemoelectric-pycaml-8614105/gentoo-support/pycaml-9999.ebuild [new file with mode: 0644]
bundles/pycaml/chemoelectric-pycaml-8614105/old-doc/pycaml.html [new file with mode: 0644]
bundles/pycaml/chemoelectric-pycaml-8614105/pycaml.ml [new file with mode: 0644]
bundles/pycaml/chemoelectric-pycaml-8614105/pycaml_stubs.c [new file with mode: 0644]
bundles/pycaml/chemoelectric-pycaml-8614105/pycaml_stubs.h [new file with mode: 0644]
bundles/pycaml/pycaml_0.82-14.debian.tar.gz [deleted file]
bundles/pycaml/pycaml_0.82.orig.tar.gz [deleted file]
bundles/pycaml/python3-compat-fix.patch [new file with mode: 0644]
bundles/readme.txt
bundles/sexplib/Makefile
bundles/sexplib/sexplib-7.0.5/lib/conv.mli
bundles/sexplib/sexplib-7.0.5/lib/conv_error.mli [new file with mode: 0644]
bundles/sexplib/sexplib-7.0.5/lib/pre_sexp.mli [new file with mode: 0644]
bundles/sexplib/sexplib-7.0.5/lib/sexp.mli
bundles/sexplib/sexplib-7.0.5/lib/sexp_intf.mli [new file with mode: 0644]
bundles/sexplib/sexplib-7.0.5/lib/type.mli [new file with mode: 0644]
changes.txt
cocci.ml
cocci.mli
commons/Makefile
configure
configure.ac
ctl/Makefile
ctl/ast_ctl.ml
ctl/ctl_engine.ml
ctl/ctl_engine.mli
ctl/flag_ctl.ml
ctl/pretty_print_ctl.ml
ctl/pretty_print_ctl.mli
ctl/test_ctl.ml
ctl/wrapper_ctl.ml
ctl/wrapper_ctl.mli
demos/hello/hello-ocaml.cocci [new file with mode: 0644]
demos/hello/hello-python.cocci [new file with mode: 0644]
demos/hello/hello-regexp.cocci [new file with mode: 0644]
demos/hello/hello-smpl.cocci [new file with mode: 0644]
demos/hello/helloworld.c [new file with mode: 0644]
demos/janitorings/remove_cast_kmalloc.cocci
demos/launch.sh
demos/sgrep/run.sh
docs/Makefile
docs/manual/Makefile
docs/manual/main_grammar.pdf
docs/manual/manual.pdf
docs/manual/options.pdf
docs/manual/spatch_options.tex
engine/Makefile
engine/asttoctl.ml
engine/asttoctl.mli
engine/asttoctl2.ml
engine/asttoctl2.mli
engine/asttomember.ml
engine/asttomember.mli
engine/c_vs_c.ml
engine/c_vs_c.mli
engine/check_exhaustive_pattern.ml
engine/check_reachability.ml
engine/check_reachability.mli
engine/cocci_vs_c.ml
engine/cocci_vs_c.mli
engine/ctlcocci_integration.ml
engine/ctlcocci_integration.mli
engine/ctltotex.ml
engine/ctltotex.mli
engine/flag_engine.ml
engine/flag_matcher.ml
engine/isomorphisms_c_c.ml
engine/lib_engine.ml
engine/lib_matcher_c.ml
engine/lib_matcher_c.mli
engine/main.ml
engine/pattern_c.ml
engine/pattern_c.mli
engine/postprocess_transinfo.ml
engine/postprocess_transinfo.mli
engine/pretty_print_engine.ml
engine/pretty_print_engine.mli
engine/sgrep.ml
engine/transformation_c.ml
engine/transformation_c.mli
extra/Makefile
flag_cocci.ml
globals/Makefile
globals/flag.ml
globals/iteration.ml
globals/iteration.mli
globals/regexp_pcre.ml
globals/regexp_str.ml
install-sh [deleted file]
install.txt
main.ml
ocaml/Makefile
ocaml/yes_prepare_ocamlcocci.ml
parsing_c/Makefile
parsing_c/parsing_hacks.ml
parsing_c/unparse_c.ml
parsing_c/unparse_cocci.ml
parsing_cocci/Makefile
parsing_cocci/adjacency.ml
parsing_cocci/adjacency.mli
parsing_cocci/adjust_pragmas.ml
parsing_cocci/adjust_pragmas.mli
parsing_cocci/arity.ml
parsing_cocci/arity.mli
parsing_cocci/ast0_cocci.ml
parsing_cocci/ast0_cocci.mli
parsing_cocci/ast0toast.ml
parsing_cocci/ast0toast.mli
parsing_cocci/ast_cocci.ml
parsing_cocci/ast_cocci.mli
parsing_cocci/check_meta.ml
parsing_cocci/check_meta.mli
parsing_cocci/comm_assoc.ml
parsing_cocci/comm_assoc.mli
parsing_cocci/command_line.ml
parsing_cocci/command_line.mli
parsing_cocci/compute_lines.ml
parsing_cocci/compute_lines.mli
parsing_cocci/context_neg.ml
parsing_cocci/context_neg.mli
parsing_cocci/data.ml
parsing_cocci/data.mli
parsing_cocci/disjdistr.ml
parsing_cocci/disjdistr.mli
parsing_cocci/flag_parsing_cocci.ml
parsing_cocci/free_vars.ml
parsing_cocci/free_vars.mli
parsing_cocci/function_prototypes.ml
parsing_cocci/function_prototypes.mli
parsing_cocci/get_constants.ml
parsing_cocci/get_constants.mli
parsing_cocci/get_constants2.ml
parsing_cocci/get_constants2.mli
parsing_cocci/get_metas.ml
parsing_cocci/get_metas.mli
parsing_cocci/id_utils.ml
parsing_cocci/id_utils.mli
parsing_cocci/index.ml
parsing_cocci/index.mli
parsing_cocci/insert_plus.ml
parsing_cocci/insert_plus.mli
parsing_cocci/iso_compile.ml
parsing_cocci/iso_compile.mli
parsing_cocci/iso_pattern.ml
parsing_cocci/iso_pattern.mli
parsing_cocci/lexer_cli.mll
parsing_cocci/lexer_cocci.ml
parsing_cocci/lexer_cocci.mll
parsing_cocci/lexer_script.ml
parsing_cocci/lexer_script.mll
parsing_cocci/main.ml
parsing_cocci/merge.ml
parsing_cocci/merge.mli
parsing_cocci/parse_aux.ml
parsing_cocci/parse_cocci.ml
parsing_cocci/parse_cocci.mli
parsing_cocci/parser_cocci_menhir.ml
parsing_cocci/parser_cocci_menhir.mly
parsing_cocci/plus.ml
parsing_cocci/plus.mli
parsing_cocci/pretty_print_cocci.ml
parsing_cocci/pretty_print_cocci.mli
parsing_cocci/safe_for_multi_decls.ml
parsing_cocci/safe_for_multi_decls.mli
parsing_cocci/semantic_cocci.ml
parsing_cocci/simple_assignments.ml
parsing_cocci/simple_assignments.mli
parsing_cocci/single_statement.ml
parsing_cocci/single_statement.mli
parsing_cocci/test_exps.ml
parsing_cocci/test_exps.mli
parsing_cocci/top_level.ml
parsing_cocci/top_level.mli
parsing_cocci/type_cocci.ml
parsing_cocci/type_cocci.mli
parsing_cocci/type_infer.ml
parsing_cocci/type_infer.mli
parsing_cocci/unify_ast.ml
parsing_cocci/unify_ast.mli
parsing_cocci/unitary_ast0.ml
parsing_cocci/unitary_ast0.mli
parsing_cocci/unparse_ast0.ml
parsing_cocci/unparse_ast0.mli
parsing_cocci/visitor_ast.ml
parsing_cocci/visitor_ast.mli
parsing_cocci/visitor_ast0.ml
parsing_cocci/visitor_ast0.mli
parsing_cocci/visitor_ast0_types.ml
popl/Makefile
popl/ast_popl.ml
popl/asttopopl.ml
popl/asttopopl.mli
popl/insert_befaft.ml
popl/insert_befaft.mli
popl/insert_quantifiers.ml
popl/insert_quantifiers.mli
popl/popl.ml
popl/popl.mli
popl/popltoctl.ml
popl/popltoctl.mli
popl/pretty_print_popl.ml
popl/pretty_print_popl.mli
popl09/Makefile
popl09/ast_popl.ml
popl09/asttopopl.ml
popl09/asttopopl.mli
popl09/flag_popl.ml
popl09/insert_quantifiers.ml
popl09/insert_quantifiers.mli
popl09/popl.ml
popl09/popl.mli
popl09/popltoctl.ml
popl09/popltoctl.mli
popl09/pretty_print_popl.ml
popl09/pretty_print_popl.mli
python/Makefile
python/coccilib/Makefile
python/coccilib/coccigui/vim.py
python/coccilib/coccigui/vimcom.py
python/coccilib/coccigui/vimeditor.py
python/coccilib/org.py
python/coccilib/output.py
python/coccilib/report.py
python/no_pycocci.ml
python/pycocci.mli
python/pycocci_aux.ml
python/pycocci_aux.mli
python/yes_pycocci.ml
readme.txt
release.nix
scripts/genversion.sh
scripts/glimpseindex_cocci.sh
scripts/spatch.sh.in
setup/cocci.m4
setup/fake-menhir.sh
setup/fake-pdflatex.sh
setup/fake-subst.sh
setup/install-sh [new file with mode: 0755]
setup/replies.txt
standard.h
testing.ml
testing.mli
tests/SCORE_expected.sexp
tests/SCORE_expected_orig.sexp
tests/ifzz.c [new file with mode: 0644]
tests/ifzz.cocci [new file with mode: 0644]
tests/ifzz.res [new file with mode: 0644]
tools/Makefile
tools/alloc_free.ml
tools/bridge.ml
tools/dir_stats.ml
tools/dumper.ml
tools/dumper.mli
tools/extract_c_and_res.ml
tools/generate_dependencies.ml
tools/gitgrep.ml
tools/gitsort.ml
tools/licensify.ml
tools/process_isoprofile.ml
tools/splitpatch.ml
tools/spp.ml
version
version.ml.in

index d6caf58..cdb1ac2 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -104,28 +104,18 @@ EXEC=$(TARGET)
 # Generic ocaml variables
 ##############################################################################
 
-OCAMLCFLAGS=
-
-# for profiling add  -p -inline 0
-# but 'make forprofiling' below does that for you.
-# This flag is also used in subdirectories so don't change its name here.
-# To enable backtrace support for native code, you need to put -g in OPTFLAGS
-# to also link with -g.
-OPTFLAGS= -g
-
 OCAMLC_CMD=$(OCAMLC) $(OCAMLCFLAGS) $(INCLUDES)
 OCAMLOPT_CMD=$(OCAMLOPT) $(OPTFLAGS) $(INCLUDES)
 OCAMLYACC_CMD=$(OCAMLYACC) -v
 OCAMLDEP_CMD=$(OCAMLDEP) $(INCLUDEDIRSDEP:%=-I %)
 OCAMLMKTOP_CMD=$(OCAMLMKTOP) -g -custom $(INCLUDES)
 
-# can also be set via 'make static'
-CFLAGS=-pie -fPIE -fpic -fPIC -static
-STATICCFLAGS=$(CFLAGS:%=-ccopt %)
-STATIC= # $(STATICCFLAGS)
+# these are unused at the moment (todo: remove)
+EXTRA_CFLAGS=   # -static -pie -fpie -fPIE -static-libgcc
+EXTRA_OCAML_CFLAGS=$(EXTRA_CFLAGS:%=-ccopt %)
 
-# can also be unset via 'make purebytecode'
-BYTECODE_STATIC=-custom
+# 'make purebytecode' unsets this definition
+BYTECODE_EXTRA=-custom $(EXTRA_OCAML_FLAGS)
 
 ##############################################################################
 # Top rules
@@ -133,6 +123,7 @@ BYTECODE_STATIC=-custom
 .PHONY:: all all.opt byte opt top clean distclean configure opt-compil
 .PHONY:: $(MAKESUBDIRS:%=%.all) $(MAKESUBDIRS:%=%.opt) subdirs.all subdirs.opt
 .PHONY:: all-opt all-byte byte-only opt-only
+.PHONY:: copy-stubs install-stubs install install-man install-python install-common
 
 
 # All make targets that are expected to be an entry point have a dependency on
@@ -141,12 +132,15 @@ BYTECODE_STATIC=-custom
 # In addition, the targets that actually build something have a dependency on
 # '.depend' and 'version.ml'.
 
-# dispatches to either 'all-without-opt' or 'all-with-opt'
-all: Makefile.config .depend $(TARGET_ALL)
+# dispatches to either 'all-dev' or 'all-release'
+all: Makefile.config
+       @$(MAKE) .depend
+       $(MAKE) $(TARGET_ALL)
 
 # make "all" comes in three flavours
-world: Makefile.config .depend version.ml
+world: Makefile.config version.ml
        @echo "building both versions of spatch"
+       $(MAKE) .depend
        $(MAKE) byte
        $(MAKE) opt-compil
        $(MAKE) preinstall
@@ -155,54 +149,61 @@ world: Makefile.config .depend version.ml
        @echo -e "\tcoccinelle can now be installed via 'make install'"
 
 # note: the 'all-dev' target excludes the documentation
-all-dev: Makefile.config .depend version.ml
+all-dev: Makefile.config version.ml
+       @$(MAKE) .depend
        @echo "building the unoptimized version of spatch"
        $(MAKE) byte
-       $(MAKE) preinstall
+       @$(MAKE) preinstall
        @echo ""
        @echo -e "\tcoccinelle can now be installed via 'make install'"
 
-all-release: Makefile.config .depend version.ml
-       @echo building the optimized version of spatch
-       $(MAKE) opt-compil
+all-release: Makefile.config version.ml
+       @echo building $(TARGET_SPATCH)
+       $(MAKE) .depend
+       $(MAKE) $(TARGET_SPATCH)
        $(MAKE) preinstall
        $(MAKE) docs
        @echo ""
        @echo -e "\tcoccinelle can now be installed via 'make install'"
 
-all.opt: Makefile.config opt-only preinstall
+all.opt: Makefile.config
+       @$(MAKE) .depend
+       $(MAKE) opt-only
+       $(MAKE) preinstall
 
 # aliases for "byte" and "opt-compil"
 opt opt-only: Makefile.config opt-compil
 byte-only: Makefile.config byte
 
-byte: Makefile.config .depend version.ml
-       $(MAKE) subdirs.all
-       $(MAKE) $(EXEC)
+byte: Makefile.config version.ml
+       @$(MAKE) .depend
+       @$(MAKE) subdirs.all
+       @$(MAKE) $(EXEC)
        @echo the compilation of $(EXEC) finished
        @echo $(EXEC) can be installed or used
 
-opt-compil: Makefile.config .depend version.ml
-       $(MAKE) subdirs.opt
-       $(MAKE) $(EXEC).opt
+opt-compil: Makefile.config version.ml
+       $(MAKE) .depend
+       $(MAKE) subdirs.opt BUILD_OPT=yes
+       $(MAKE) $(EXEC).opt BUILD_OPT=yes
        @echo the compilation of $(EXEC).opt finished
        @echo $(EXEC).opt can be installed or used
 
 top: $(EXEC).top
 
 subdirs.all:
-       +for D in $(MAKESUBDIRS); do $(MAKE) $$D.all || exit 1 ; done
-       $(MAKE) -C commons sexp.all OCAMLCFLAGS="$(OCAMLCFLAGS)"
+       @+for D in $(MAKESUBDIRS); do $(MAKE) $$D.all || exit 1 ; done
+       @$(MAKE) -C commons sexp.all
 
 subdirs.opt:
-       +for D in $(MAKESUBDIRS); do $(MAKE) $$D.opt || exit 1 ; done
-       $(MAKE) -C commons sexp.opt OPTFLAGS="$(OPTFLAGS)"
+       @+for D in $(MAKESUBDIRS); do $(MAKE) $$D.opt || exit 1 ; done
+       @$(MAKE) -C commons sexp.opt
 
 $(MAKESUBDIRS:%=%.all):
-       $(MAKE) -C $(@:%.all=%) -j1 OCAMLCFLAGS="$(OCAMLCFLAGS)" all
+       @$(MAKE) -C $(@:%.all=%) all
 
 $(MAKESUBDIRS:%=%.opt):
-       $(MAKE) -C $(@:%.opt=%) -j1 OPTFLAGS="$(OPTFLAGS)" all.opt
+       @$(MAKE) -C $(@:%.opt=%) all.opt
 
 #dependencies:
 # commons:
@@ -210,7 +211,7 @@ $(MAKESUBDIRS:%=%.opt):
 # menhirLib:
 # parsing_cocci: commons globals menhirLib
 # parsing_c:parsing_cocci
-# ctl:globals commons
+# ctl:globals commonsg
 # engine: parsing_cocci parsing_c ctl
 # popl09:engine
 # extra: parsing_cocci parsing_c ctl
@@ -218,8 +219,8 @@ $(MAKESUBDIRS:%=%.opt):
 # python:pycaml parsing_cocci parsing_c
 
 clean:: Makefile.config
-       set -e; for i in $(CLEANSUBDIRS); do $(MAKE) -C $$i -j1 $@; done
-       $(MAKE) -C demos/spp $@
+       @set -e; for i in $(CLEANSUBDIRS); do $(MAKE) -C $$i $@; done
+       @$(MAKE) -C demos/spp $@
 
 $(LIBS): $(MAKESUBDIRS:%=%.all)
 $(LIBS:.cma=.cmxa): $(MAKESUBDIRS:%=%.opt)
@@ -229,14 +230,14 @@ $(LNKOPTLIBS) : $(MAKESUBDIRS:%=%.opt)
 $(OBJS):$(LIBS)
 $(OPTOBJS):$(LIBS:.cma=.cmxa)
 
-$(EXEC): $(LIBS) $(OBJS)
-       $(OCAMLC_CMD) $(BYTECODE_STATIC) $(FLAGSLIBS) -o $@ $(SYSLIBS) $(LNKLIBS) $^
+$(EXEC): $(LNKLIBS) $(LIBS) $(OBJS)
+       $(OCAMLC_CMD) -thread $(BYTECODE_EXTRA) $(FLAGSLIBS) -o $@ $(SYSLIBS) $^
 
-$(EXEC).opt: $(LIBS:.cma=.cmxa) $(OPTOBJS)
-       $(OCAMLOPT_CMD) $(STATIC) $(FLAGSLIBS) -o $@ $(SYSLIBS:.cma=.cmxa) $(OPTLNKLIBS) $^
+$(EXEC).opt: $(OPTLNKLIBS) $(LIBS:.cma=.cmxa) $(OPTOBJS)
+       $(OCAMLOPT_CMD) -thread $(OPTFLAGSLIBS) -o $@ $(SYSLIBS:.cma=.cmxa) $^
 
-$(EXEC).top: $(LIBS) $(OBJS) $(LNKLIBS)
-       $(OCAMLMKTOP_CMD) -custom -o $@ $(SYSLIBS) $(FLAGSLIBS) $(LNKLIBS) $^
+$(EXEC).top: $(LNKLIBS) $(LIBS) $(OBJS)
+       $(OCAMLMKTOP_CMD) -custom -o $@ $(SYSLIBS) $(FLAGSLIBS) $^
 
 clean distclean::
        rm -f $(TARGET) $(TARGET).opt $(TARGET).top
@@ -244,28 +245,42 @@ clean distclean::
 .PHONY:: tools configure
 
 configure:
-       ./configure
+       ./configure $(CONFIGURE_FLAGS)
 
-Makefile.config:
-       @echo "Makefile.config is missing. Run ./configure to generate it."
+# the dependencies on Makefile.config should give a hint to the programmer that
+# configure should be run again
+Makefile.config: Makefile.config.in configure.ac
+       @echo "Makefile.config needs to be (re)build. Run  ./configure $(CONFIGURE_FLAGS) to generate it."
        @false
 
 tools: $(LIBS) $(LNKLIBS)
        $(MAKE) -C tools
 
 distclean::
-       if [ -d tools ] ; then $(MAKE) -C tools distclean ; fi
+       @if [ -d tools ] ; then $(MAKE) -C tools distclean ; fi
 
+# it seems impossible to pass "-static" unless all dependent
+# libraries are also available as static archives.
+# set $(STATIC) to -static if you have such libraries.
 static:
        rm -f spatch.opt spatch
-       $(MAKE) STATIC="$(STATICCFLAGS)" opt-only
+       $(MAKE) $(STATIC) opt-only
        cp spatch.opt spatch
 
+# creates a portable version of spatch, which, however, may
+# be dependent on non-portably dynamic libraries. You
+# may need the stubs, see 'copy-stubs'.
 purebytecode:
        rm -f spatch.opt spatch
-       $(MAKE) BYTECODE_STATIC="" byte-only
-       # disabled the following command because it does not match
-       # perl -p -i -e 's/^#!.*/#!\/usr\/bin\/ocamlrun/' spatch
+       $(MAKE) BYTECODE_EXTRA="" byte-only
+       sed -i '1 s,^#!.*$$,#!/usr/bin/ocamlrun,g' spatch
+
+# copies the stubs libraries (if any) to the root directory
+copy-stubs:
+       @if test -f ./bundles/pycaml/dllpycaml_stubs.so; then \
+               cp -fv ./bundles/pycaml/dllpycaml_stubs.so .; fi
+       @if test -f ./bundles/pcre/dllpcre_stubs.so; then \
+               cp -fv ./bundles/pcre/dllpcre_stubs.so .; fi
 
 ##############################################################################
 # Build version information
@@ -283,9 +298,9 @@ version.ml:
 docs:
        @$(MAKE) -C docs || (echo "warning: ignored the failed construction of the manual" 1>&2)
        @if test "x$(FEATURE_OCAML)" = x1; then \
-               if test -f ./parsing_c/ast_c.cmo; then \
+               if test -f ./parsing_c/ast_c.cmo -o -f ./parsing_c/ast_c.cmx; then \
                        $(MAKE) -C ocaml doc; \
-               else echo "note: to obtain coccilib documenation, it is required to build 'spatch' first so that ./parsing_c/ast_c.cmo gets build."; \
+               else echo "note: to obtain coccilib documenation, it is required to build 'spatch' first so that ./parsing_c/ast_c.cm* gets build."; \
                fi fi
        @echo "finished building manuals"
 
@@ -298,6 +313,7 @@ clean:: Makefile.config
 ##############################################################################
 
 preinstall: docs/spatch.1 scripts/spatch scripts/spatch.opt scripts/spatch.byte
+       @echo "generated the wrapper scripts for spatch (the frontends)"
 
 docs/spatch.1: Makefile.config
        $(MAKE) -C docs spatch.1
@@ -373,7 +389,16 @@ install-python:
        $(INSTALL_DATA) python/coccilib/coccigui/pygui.gladep \
                $(DESTDIR)$(SHAREDIR)/python/coccilib/coccigui
 
-install: install-man install-common $(PYTHON_TARGET)
+install-stubs:
+       $(MKDIR_P) $(DESTDIR)$(SHAREDIR)
+       @if test -f ./bundles/pycaml/dllpycaml_stubs.so; then \
+               cp -fv ./bundles/pycaml/dllpycaml_stubs.so $(DESTDIR)$(SHAREDIR); fi
+       @if test -f ./bundles/pcre/dllpcre_stubs.so; then \
+               cp -fv ./bundles/pcre/dllpcre_stubs.so $(DESTDIR)$(SHAREDIR); fi
+
+install: install-man install-common install-stubs $(PYTHON_INSTALL_TARGET)
+       rm -f $(DESTDIR)$(SHAREDIR)/spatch
+       rm -f $(DESTDIR)$(SHAREDIR)/spatch.opt
        @if test -x spatch -o -x spatch.opt; then \
                $(MAKE) install-def;fi
        @if test -x spatch ; then \
@@ -410,7 +435,8 @@ uninstall:
        rm -f $(DESTDIR)$(BINDIR)/spatch
        rm -f $(DESTDIR)$(BINDIR)/spatch.opt
        rm -f $(DESTDIR)$(BINDIR)/spatch.byte
-       rm -f $(DESTDIR)$(LIBDIR)/dllpycaml_stubs.so
+       rm -f $(DESTDIR)$(SHAREDIR)/dllpycaml_stubs.so
+       rm -f $(DESTDIR)$(SHAREDIR)/dllpcre_stubs.so
        rm -f $(DESTDIR)$(SHAREDIR)/spatch
        rm -f $(DESTDIR)$(SHAREDIR)/spatch.opt
        rm -f $(DESTDIR)$(SHAREDIR)/standard.h
@@ -464,17 +490,28 @@ test: $(TARGET)
 testparsing:
        ./$(TARGET) -D standard.h -parse_c -dir tests/
 
-check:
-       ./$(TARGET) --testall --no-update-score-file \
-               --iso-file ./standard.iso \
-               --macro-file-builtins ./standard.h
-
+# the check target runs:
+# * some feature tests (depending on what is enabled)
+# * the test suite
+check: scripts/spatch
+       @echo "testing if spatch works on hello world..."
+       @COCCINELLE_HOME="$$(pwd)" ./scripts/spatch --sp-file demos/hello/hello-smpl.cocci demos/hello/helloworld.c --very-quiet | grep -q '+  printf("world, hello!");'
+       @echo "testing if spatch works with regexes..."
+       @COCCINELLE_HOME="$$(pwd)" ./scripts/spatch --sp-file demos/hello/hello-regexp.cocci demos/hello/helloworld.c --very-quiet | grep -q '+  printf("world, hello!");'
+       @if test "x${FEATURE_OCAML}" = x1 -a -z "${NO_OCAMLFIND}"; then \
+               echo "testing if spatch works with ocaml scripts..."; \
+               COCCINELLE_HOME="$$(pwd)" ./scripts/spatch --sp-file demos/hello/hello-ocaml.cocci demos/hello/helloworld.c --very-quiet | grep -q 'Hello at: 2'; fi
+       @if test "x${FEATURE_PYTHON}" = x1; then \
+               echo "testing if spatch works with python scripts..."; \
+               COCCINELLE_HOME="$$(pwd)" ./scripts/spatch --sp-file demos/hello/hello-python.cocci demos/hello/helloworld.c --very-quiet | grep -q 'Hello at: 2'; fi
+       @echo running the test suite
+       COCCINELLE_HOME="$$(pwd)" ./scripts/spatch --testall --no-update-score-file
 
 # -inline 0  to see all the functions in the profile.
 # Can also use the profile framework in commons/ and run your program
 # with -profile.
 forprofiling:
-       $(MAKE) OPTFLAGS="-p -inline 0 " opt
+       $(MAKE) OPTFLAGS="-p -inline 0 ${EXTRA_OCAML_FLAGS}" opt
 
 clean distclean::
        rm -f gmon.out
@@ -520,7 +557,7 @@ clean distclean::
        rm -f *~ .*~ *.exe #*#
 
 distclean::
-       set -e; for i in $(CLEANSUBDIRS); do $(MAKE) -C $$i -j1 $@; done
+       set -e; for i in $(CLEANSUBDIRS); do $(MAKE) -C $$i $@; done
        rm -f test.ml
        rm -f TAGS
        rm -f tests/SCORE_actual.sexp
@@ -528,15 +565,16 @@ distclean::
        find . -name ".#*1.*" | xargs rm -f
        rm -f $(EXEC) $(EXEC).opt $(EXEC).top
 
+# using 'touch' to prevent infinite recursion with 'make depend'
 .PHONY:: depend
 .depend: Makefile.config test.ml version
-       touch .depend  # prevents infinite recursion with 'make depend'
-       $(MAKE) depend
+       @touch .depend
+       @$(MAKE) depend
 
 depend: Makefile.config test.ml version
        @echo constructing '.depend'
-       rm -f .depend
-       set -e; for i in $(MAKESUBDIRS); do $(MAKE) -j1 -C $$i depend; done
+       @rm -f .depend
+       @set -e; for i in $(MAKESUBDIRS); do $(MAKE) -C $$i depend; done
        $(OCAMLDEP_CMD) *.mli *.ml > .depend
 
 ##############################################################################
@@ -553,16 +591,24 @@ distclean::
        rm -f globals/config.ml
        rm -f globals/regexp.ml python/pycocci.ml ocaml/prepare_ocamlcocci.ml
        rm -f scripts/spatch.sh
+       rm -f aclocal.m4
        @echo "run 'configure' again prior to building coccinelle"
 
 
-# prevent building or using dependencies when cleaning
+# don't include depend for those actions that either don't need
+# depend or that call 'make .depend' explicitly.
+# TODO: find a nicer way to express this
 ifneq ($(MAKECMDGOALS),clean)
 ifneq ($(MAKECMDGOALS),distclean)
 ifneq ($(MAKECMDGOALS),configure)
 ifneq ($(MAKECMDGOALS),prerelease)
 ifneq ($(MAKECMDGOALS),release)
 ifneq ($(MAKECMDGOALS),package)
+ifneq ($(MAKECMDGOALS),all-release)
+ifneq ($(MAKECMDGOALS),all-dev)
+ifneq ($(MAKECMDGOALS),all)
+ifneq ($(MAKECMDGOALS),.depend)
+ifneq ($(MAKECMDGOALS),depend)
 -include .depend
 endif
 endif
@@ -570,3 +616,10 @@ endif
 endif
 endif
 endif
+endif
+endif
+endif
+endif
+endif
+
+include Makefile.common
diff --git a/Makefile.am b/Makefile.am
new file mode 100644 (file)
index 0000000..fc2f9e3
--- /dev/null
@@ -0,0 +1,5 @@
+# This file is not the actual Makefile, as we do not use Automake for
+# our project. The purpose of this file is to instruct autoreconf
+# to include the setup directory.
+
+ACLOCAL_AMFLAGS = -I setup --install
diff --git a/Makefile.common b/Makefile.common
new file mode 100644 (file)
index 0000000..aa00e88
--- /dev/null
@@ -0,0 +1,17 @@
+# Some common definitions that factored out many reoccurring patterns
+# in the Makefiles of the project. This file is included at the bottom
+# so that its implicit rules take precedence over implicit rules in
+# the file  that includes this one.
+
+# this is a "hack" so that we do not have to pass --native to ocamldep
+# and rebuild .depend when building the native version. Since we have
+# .ml files without .mli files, building the .cmo *and .cmx file could
+# cause the .cmi file to be build twice, which could cause trouble when
+# the .cmi file is read by other compilation steps (especially when
+# building in parallel).
+export BUILD_OPT
+ifeq ($(BUILD_OPT),yes)
+%.cmo: %.ml
+%.cmo: %.cmx
+       @echo "skipped building $@ in optimizing mode: $< will be build instead."
+endif
index 08ea24a..0db96b6 100644 (file)
@@ -6,6 +6,7 @@ LNKLIBS=@MODULES_dynlink@ @MODULES_extlib@ @MODULES_sexplib@ @MODULES_menhirLib@
 OPTLNKLIBS=@MODULESOPT_dynlink@ @MODULESOPT_extlib@ @MODULESOPT_sexplib@ @MODULESOPT_menhirLib@ @MODULESOPT_pycaml@ @MODULESOPT_pcre@
 INCLIBS=@PATH_dynlink@ @PATH_extlib@ @PATH_sexplib@ @PATH_menhirLib@ @PATH_pycaml@ @PATH_pcre@
 FLAGSLIBS=@FLAGS_dynlink@ @FLAGS_extlib@ @FLAGS_sexplib@ @FLAGS_menhirLib@ @FLAGS_pycaml@ @FLAGS_pcre@
+OPTFLAGSLIBS=@OPTFLAGS_dynlink@ @OPTFLAGS_extlib@ @OPTFLAGS_sexplib@ @OPTFLAGS_menhirLib@ @OPTFLAGS_pycaml@ @OPTFLAGS_pcre@
 # * end of library variables
 
 # system packages inc libs
@@ -20,6 +21,26 @@ INSTALL=@INSTALL@
 TAR=@TAR@
 PATCH=@PATCH@
 PDFLATEX=@PDFLATEX@
+PATCHELF=@PATCHELF@
+
+# copy of the configure flags
+CONFIGURE_FLAGS=@CONFIGURE_FLAGS@
+
+# differentiate between release and development builds here
+# (typically for improved performance)
+ifneq (@enable_release@, no)
+EXTRA_OCAML_FLAGS=-unsafe
+else
+EXTRA_OCAML_FLAGS=-g -dtypes
+endif
+
+# note that variables are exported and thus cannot be used in
+# definitions of other variables. Use $(EXTRA_OCAML_FLAGS) for that.
+# Todo: since these definitions are not in Makefile.config.in, the
+# defaults can be removed from each individual Makefile in the
+# subdirectories.
+export OCAMLCFLAGS?=$(EXTRA_OCAML_FLAGS)
+export OPTFLAGS?=$(EXTRA_OCAML_FLAGS)
 
 # paths
 prefix=@prefix@
@@ -32,38 +53,41 @@ sysconfdir=@sysconfdir@
 mandir=@mandir@
 
 # C compiler
-CC=@CC@
-CFLAGS=@CFLAGS@
-CPP=@CPP@
-CPPFLAGS=@CPPFLAGS@
+export CC=@CC@
+export CFLAGS=@CFLAGS@
+export CPP=@CPP@
+export CPPFLAGS=@CPPFLAGS@
 
 # portable MKDIR_P
 MKDIR_P=@MKDIR_P@
 
 # the default Make target
 TARGET_ALL=@MAKETARGET_ALL@
+TARGET_SPATCH=@MAKETARGET_SPATCH@
 
 PYTHON_CFLAGS=@PYTHON_CFLAGS@
 PYTHON_LIBS=@PYTHON_LIBS@
+export PYTHON_VERSION=@PYVER@
+export PYTHON_VERSION_MAJOR=@PYVER_MAJOR@
 
 PCRE_CFLAGS=@PCRE_CFLAGS@
 PCRE_LIBS=@PCRE_LIBS@
 
-OCAMLFIND=@OCAMLFIND@
-OCAMLBUILD=@OCAMLBUILD@
-OCAMLC=@OCAMLC@
-OCAMLDEP=@OCAMLDEP@
-OCAMLDOC=@OCAMLDOC@
-OCAMLLEX=@OCAMLLEX@
-OCAMLYACC=@OCAMLYACC@
-OCAMLLIB=@OCAMLLIB@
-OCAMLMKLIB=@OCAMLMKLIB@
-OCAMLMKTOP=@OCAMLMKTOP@
-OCAMLOPT=@OCAMLOPT@
-CAMLP4=@CAMLP4@
-CAMLP4O=@CAMLP4O@
-MENHIR=@MENHIR@
-OCAMLVERSION=@OCAMLVERSION@
+export OCAMLFIND=@OCAMLFIND@
+export OCAMLBUILD=@OCAMLBUILD@
+export OCAMLC=@OCAMLC@
+export OCAMLDEP=@OCAMLDEP@
+export OCAMLDOC=@OCAMLDOC@
+export OCAMLLEX=@OCAMLLEX@
+export OCAMLYACC=@OCAMLYACC@
+export OCAMLLIB=@OCAMLLIB@
+export OCAMLMKLIB=@OCAMLMKLIB@
+export OCAMLMKTOP=@OCAMLMKTOP@
+export OCAMLOPT=@OCAMLOPT@
+export CAMLP4=@CAMLP4@
+export CAMLP4O=@CAMLP4O@
+export MENHIR=@MENHIR@
+export OCAMLVERSION=@OCAMLVERSION@
 
 INSTALL_PROGRAM=$(INSTALL) -m 755
 INSTALL_LIB=$(INSTALL) -m 755
@@ -94,12 +118,15 @@ LOCALLIB_pycaml=@LOCALLIB_pycaml@
 # Features
 FEATURE_PYTHON=@FEATURE_PYTHON@
 FEATURE_OCAML=@FEATURE_OCAML@
+NO_OCAMLFIND=@SUBSTITUTED_OCAMLFIND@
 
 # Include paths
 PCREDIR=@PATH_pcre@
 PYCAMLDIR=@PATH_pycaml@
 MENHIRDIR=@PATH_menhirLib@
 SEXPDIR=@PATH_sexplib@
+EXTLIBDIR=@PATH_extlib@
+DYNLINKDIR=@PATH_dynlink@
 
 # selected ocaml modules
 PYCOCCI_FILE=@PYCOCCI_FILE@
index ba8dd70..7803619 100644 (file)
 #
 
 
+# *Note*
+# Pay attention to the difference between -cclib and -ccopt: although the documentation
+# of -ccopt suggest that it subsumes -cclib, be sure to use -cclib for library includes.
+#
+# *Note*
+# the order in which library includes are specified matters!
+
+
 # pycaml library
-LOCAL_pycaml     = pycaml.cma
-LOCALOPT_pycaml  = pycaml.cmxa
-GLOBAL_pycaml    = pycaml.cma
-GLOBALOPT_pycaml = pycaml.cmxa
-FLAGS_pycaml     = -cclib -lpycaml_stubs -cclib "${PYTHON_LIBS}"
+# Note: we added the pycaml_stubs wrapper twice: once for dynamic and once for
+# static linking. The ocaml compiler should use the static linking with the
+# stubs if possible.
+LOCAL_pycaml     = $(PYCAMLDIR)/pycaml.cma
+LOCALOPT_pycaml  = $(PYCAMLDIR)/pycaml.cmxa
+GLOBAL_pycaml    = $(PYCAMLDIR)/pycaml.cma
+GLOBALOPT_pycaml = $(PYCAMLDIR)/pycaml.cmxa
+FLAGS_pycaml     = $(CFLAGS_pycaml:%=-ccopt %) -dllib -lpycaml_stubs -cclib -lpycaml_stubs $(PYTHON_LIBS:%=-cclib %)
+OPTFLAGS_pycaml  = $(CFLAGS_pycaml:%=-ccopt %) -cclib -lpycaml_stubs $(PYTHON_LIBS:%=-cclib %)
 
 # sexplib library
-LOCAL_sexplib     = sexplib.cmo
-LOCALOPT_sexplib  = sexplib.cmx
-GLOBAL_sexplib    = sexplib.cma
-GLOBALOPT_sexplib = sexplib.cmxa
+LOCAL_sexplib     = $(SEXPDIR)/sexplib.cmo
+LOCALOPT_sexplib  = $(SEXPDIR)/sexplib.cmx
+GLOBAL_sexplib    = $(SEXPDIR)/sexplib.cma
+GLOBALOPT_sexplib = $(SEXPDIR)/sexplib.cmxa
 FLAGS_sexplib     =
+OPTFLAGS_sexplib  =
 
 # pcre library
-LOCAL_pcre     = pcre.cmo
-LOCALOPT_pcre  = pcre.cmx
-GLOBAL_pcre    = pcre.cma
-GLOBALOPT_pcre = pcre.cmxa
-FLAGS_pcre     = -cclib -lpcre_stubs -cclib "${PCRE_LIBS}"
+# Note: see the comment of the pycaml library about the double appearance of the stubs library.
+LOCAL_pcre     = $(PCREDIR)/pcre.cmo
+LOCALOPT_pcre  = $(PCREDIR)/pcre.cmx
+GLOBAL_pcre    = $(PCREDIR)/pcre.cma
+GLOBALOPT_pcre = $(PCREDIR)/pcre.cmxa
+FLAGS_pcre     = $(PCRE_LIBS:%=-ccopt %) -dllib -lpcre_stubs -cclib -lpcre_stubs
+OPTFLAGS_pcre  = $(PCRE_LIBS:%=-ccopt %) -cclib -lpcre_stubs
 
 # dynlink library
 LOCAL_dynlink     =
 LOCALOPT_dynlink  =
-GLOBAL_dynlink    = dynlink.cma
-GLOBALOPT_dynlink = dynlink.cmxa
+GLOBAL_dynlink    = $(DYNLINKDIR)/dynlink.cma
+GLOBALOPT_dynlink = $(DYNLINKDIR)/dynlink.cmxa
+FLAGS_dynlink     =
+OPTFLAGS_dynlink  =
 
 # extlib library
-LOCAL_extlib     = extLib.cma
-LOCALOPT_extlib  = extLib.cmxa
-GLOBAL_extlib    = extLib.cma
-GLOBALOPT_extlib = extLib.cmxa
+LOCAL_extlib     = $(EXTLIBDIR)/extLib.cma
+LOCALOPT_extlib  = $(EXTLIBDIR)/extLib.cmxa
+GLOBAL_extlib    = $(EXTLIBDIR)/extLib.cma
+GLOBALOPT_extlib = $(EXTLIBDIR)/extLib.cmxa
 FLAGS_extlib     =
+OPTFLAGS_extlib  =
 
 # type conv library
 LOCAL_type_conv     = pa_type_conv.cma
@@ -54,3 +72,4 @@ LOCALOPT_type_conv  = pa_type_conv.cmxa
 GLOBAL_type_conv    = pa_type_conv.cma
 GLOBALOPT_type_conv = pa_type_conv.cma
 FLAGS_type_conv     =
+OPTFLAGS_type_conv  =
index 8a612ea..6eacc90 100644 (file)
@@ -15,14 +15,19 @@ DOC=docs/manual/manual.pdf       \
     docs/man                     \
     docs/spatch.1                \
     docs/manual/cocci-python.txt
-BINSRC=spatch env.sh env.csh standard.h standard.iso \
-       *.txt $(DOC) demos/*
+BINSRC=spatch* env.sh env.csh standard.h standard.iso \
+       *.txt $(DOC) demos/* scripts/spatch*
 BINSRC-PY=$(BINSRC) $(PYLIB) python/coccilib/
 
 EXCL=$(EXCLUDE:%=--exclude=%)
 BINSRC2=$(BINSRC:%=$(PACKAGE)/%)
 BINSRC2-PY=$(BINSRC-PY:%=$(PACKAGE)/%)
 
+# TMP should point to a folder that is private to the release
+# process. In addition, it should not be the direct parent of
+# the directory in which the release is performed, because it
+# creates temporary directories that in this case could have
+# a name clash with the current directory.
 ifndef TMP
 TMP=/tmp
 endif
@@ -64,19 +69,19 @@ endif
 # unpushed changes. However, that is probably something you should
 # not do in the first place.
 
-prerelease: Makefile.config
+prerelease:
        @echo "pulling changes from the repository"
        $(GIT) pull --rebase
        $(MAKE) fix-expected
        $(MAKE) distclean KEEP_CONFIG=1
        @echo "\n\tEdit ./version"
        @echo "\tCommit with 'make release'\n"
-       @echo "\tYou can skip the actual commit using 'GIT=echo make release'"
+       @echo "\t(if you don't want to change the repo, use 'GIT=echo make release' instead)"
 
 fix-expected:
        @echo "going to generate: tests/SCORE_expected_orig.sexp"
        $(MAKE) distclean
-       ./configure --disable-python
+       ./configure --enable-release --disable-python
        $(MAKE) opt-only
        yes | ./spatch.opt -testall --iso-file ./standard.iso --macro-file-builtins ./standard.h
        cp tests/SCORE_actual.sexp tests/SCORE_expected_orig.sexp
@@ -105,16 +110,21 @@ package-src:
        $(MAKE) srctar
        $(MAKE) coccicheck
 
+# Reconfigures the project without Python support
+# Note: we disable pcre syntax as well to eliminate the dependency
+# on those libraries.
 package-nopython:
-       $(MAKE) distclean             # Clean project
-       ./configure --disable-python  # Reconfigure project without Python support
+       $(MAKE) distclean
+       ./configure --enable-release --disable-python --disable-pcre-syntax --disable-menhirLib --disable-sexplib --disable-extlib --disable-pycaml
        $(MAKE) bintar
        $(MAKE) bytecodetar
-#      $(MAKE) staticbintar
 
+# Reconfigure project with Python support
+# Note: we disable pcre syntax as well to eliminate the dependency
+# on those libraries.
 package-python:
-       $(MAKE) distclean            # Clean project
-       ./configure --enable-python  # Reconfigure project with Python support
+       $(MAKE) distclean
+       ./configure --enable-release --enable-python --disable-pcre-syntax --disable-menhirLib --disable-sexplib --disable-extlib --disable-pycaml
        $(MAKE) bintar-python
        $(MAKE) bytecodetar-python
 
@@ -134,7 +144,7 @@ srctar: Makefile.config
        if test -f "$(TMP)/$(PACKAGE)/"; then rm -f "$(TMP)/$(PACKAGE)/"; fi # remove it if it is a symlink
        $(MKDIR_P) "$(TMP)/$(PACKAGE)/"
        cp -rfa ./*  "$(TMP)/$(PACKAGE)/"
-       cd $(TMP)/$(PACKAGE); cd parsing_cocci/; $(MAKE) parser_cocci_menhir.ml
+       cd $(TMP)/$(PACKAGE); $(MAKE) -C parsing_cocci parser_cocci_menhir.ml
        rm -f $(TMP)/$(PACKAGE)/Makefile.config
        cd $(TMP); tar cvfz $(PACKAGE).tgz --exclude-vcs $(EXCL) $(PACKAGE)
        rm -rf  $(TMP)/$(PACKAGE)
@@ -143,6 +153,10 @@ bintar: all-dev
        $(MAKE) docs
        rm -f $(TMP)/$(PACKAGE)
        ln -s `pwd` $(TMP)/$(PACKAGE)
+       @if test -n "${PATCHELF}" -a -f spatch; then \
+          $(PATCHELF) --set-interpreter "/lib/ld-linux.so.2" --set-rpath "" spatch; fi
+       @if test -n "${PATCHELF}" -a -f spatch.opt; then \
+          $(PATCHELF) --set-interpreter "/lib/ld-linux.so.2" --set-rpath "" spatch.opt; fi
        cd $(TMP); tar cvfz $(PACKAGE)-bin-x86.tgz --exclude-vcs $(BINSRC2)
        rm -f $(TMP)/$(PACKAGE)
 
@@ -154,30 +168,44 @@ staticbintar: all-release
        cd $(TMP); tar cvfz $(PACKAGE)-bin-x86-static.tgz --exclude-vcs $(BINSRC2)
        rm -f $(TMP)/$(PACKAGE)
 
-# add ocaml version in name ?
 bytecodetar: all-dev
        $(MAKE) docs
        rm -f $(TMP)/$(PACKAGE)
        ln -s `pwd` $(TMP)/$(PACKAGE)
        $(MAKE) purebytecode
-       cd $(TMP); tar cvfz $(PACKAGE)-bin-bytecode-$(OCAMLVERSION).tgz --exclude-vcs $(BINSRC2)
+       $(MAKE) copy-stubs
+       @if test -n "${PATCHELF}" -a -f dllpycaml_stubs.so; then \
+         $(PATCHELF) --set-rpath "" dllpycaml_stubs.so; fi
+       @if test -n "${PATHCELF}" -a -f dllpcre_stubs.so; then \
+         $(PATCHELF) --set-rpath "" dllpcre_stubs.so; fi
+       cd $(TMP); tar cvfz $(PACKAGE)-bin-bytecode-$(OCAMLVERSION).tgz --exclude-vcs $(BINSRC2) $$(find -L $(PACKAGE) -maxdepth 1 -name 'dll*.so')
        rm -f $(TMP)/$(PACKAGE)
+       rm -f dllpycaml_stubs.so dllpcre_stubs.so
 
 bintar-python: all
        $(MAKE) docs
+       @if test -n "${PATCHELF}" -a -f spatch; then \
+          $(PATCHELF) --set-interpreter "/lib/ld-linux.so.2" --set-rpath "" spatch; fi
+       @if test -n "${PATCHELF}" -a -f spatch.opt; then \
+          $(PATCHELF) --set-interpreter "/lib/ld-linux.so.2" --set-rpath "" spatch.opt; fi
        rm -f $(TMP)/$(PACKAGE)
        ln -s `pwd` $(TMP)/$(PACKAGE)
        cd $(TMP); tar cvfz $(PACKAGE)-bin-x86-python.tgz --exclude-vcs $(BINSRC2-PY)
        rm -f $(TMP)/$(PACKAGE)
 
-# add ocaml version in name ?
 bytecodetar-python: all-dev
        $(MAKE) docs
        rm -f $(TMP)/$(PACKAGE)
        ln -s `pwd` $(TMP)/$(PACKAGE)
        $(MAKE) purebytecode
-       cd $(TMP); tar cvfz $(PACKAGE)-bin-bytecode-$(OCAMLVERSION)-python.tgz --exclude-vcs $(BINSRC2-PY)
+       $(MAKE) copy-stubs
+       @if test -n "${PATCHELF}" -a -f dllpycaml_stubs.so; then \
+          $(PATCHELF) --set-rpath "" dllpycaml_stubs.so; fi
+       @if test -n "${PATHCELF}" -a -f dllpcre_stubs.so; then \
+          $(PATCHELF) --set-rpath "" dllpcre_stubs.so; fi
+       cd $(TMP); tar cvfz $(PACKAGE)-bin-bytecode-$(OCAMLVERSION)-python.tgz --exclude-vcs $(BINSRC2-PY) $$(find -L $(PACKAGE) -maxdepth 1 -name 'dll*.so')
        rm -f $(TMP)/$(PACKAGE)
+       rm -f dllpycaml_stubs.so dllpcre_stubs.so
 
 coccicheck:
        cp -a ./scripts/coccicheck $(TMP)/$(CCPACKAGE)
@@ -187,14 +215,13 @@ coccicheck:
 clean-packages::
        rm -f $(TMP)/$(PACKAGE).tgz
        rm -f $(TMP)/$(PACKAGE)-bin-x86.tgz
-#      rm -f $(TMP)/$(PACKAGE)-bin-x86-static.tgz
        rm -f $(TMP)/$(PACKAGE)-bin-bytecode-$(OCAMLVERSION).tgz
        rm -f $(TMP)/$(PACKAGE)-bin-x86-python.tgz
        rm -f $(TMP)/$(PACKAGE)-bin-bytecode-$(OCAMLVERSION)-python.tgz
        rm -f $(TMP)/$(CCPACKAGE).tgz
 
 #
-# No need to licensify 'demos'. Because these is basic building blocks
+# No need to licensify 'demos'. Because these are basic building blocks
 # to use SmPL.
 #
 TOLICENSIFY=ctl engine globals parsing_cocci popl popl09 python scripts tools
@@ -268,6 +295,8 @@ push:
 # Note: configure first
 dist:
        $(MAKE) licensify
+       $(MAKE) distclean KEEP_CONFIG=1
        $(MAKE) docs
+       $(MAKE) -C parsing_cocci parser_cocci_menhir.ml
        $(MAKE) clean
        tar cvfz $(PACKAGE).tar.gz --transform="s,^,$(PACKAGE)/,S" --exclude=$(PACKAGE).tar.gz --exclude-backups --exclude-vcs *
diff --git a/aclocal.m4 b/aclocal.m4
deleted file mode 100644 (file)
index 39122d3..0000000
+++ /dev/null
@@ -1,172 +0,0 @@
-# generated automatically by aclocal 1.11.2 -*- Autoconf -*-
-
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-# 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation,
-# Inc.
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-# pkg.m4 - Macros to locate and utilise pkg-config.            -*- Autoconf -*-
-# 
-# Copyright Â© 2004 Scott James Remnant <scott@netsplit.com>.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-# PKG_PROG_PKG_CONFIG([MIN-VERSION])
-# ----------------------------------
-AC_DEFUN([PKG_PROG_PKG_CONFIG],
-[m4_pattern_forbid([^_?PKG_[A-Z_]+$])
-m4_pattern_allow([^PKG_CONFIG(_PATH)?$])
-AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])dnl
-if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
-       AC_PATH_TOOL([PKG_CONFIG], [pkg-config])
-fi
-if test -n "$PKG_CONFIG"; then
-       _pkg_min_version=m4_default([$1], [0.9.0])
-       AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version])
-       if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
-               AC_MSG_RESULT([yes])
-       else
-               AC_MSG_RESULT([no])
-               PKG_CONFIG=""
-       fi
-               
-fi[]dnl
-])# PKG_PROG_PKG_CONFIG
-
-# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
-#
-# Check to see whether a particular set of modules exists.  Similar
-# to PKG_CHECK_MODULES(), but does not set variables or print errors.
-#
-#
-# Similar to PKG_CHECK_MODULES, make sure that the first instance of
-# this or PKG_CHECK_MODULES is called, or make sure to call
-# PKG_CHECK_EXISTS manually
-# --------------------------------------------------------------
-AC_DEFUN([PKG_CHECK_EXISTS],
-[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
-if test -n "$PKG_CONFIG" && \
-    AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then
-  m4_ifval([$2], [$2], [:])
-m4_ifvaln([$3], [else
-  $3])dnl
-fi])
-
-
-# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES])
-# ---------------------------------------------
-m4_define([_PKG_CONFIG],
-[if test -n "$$1"; then
-    pkg_cv_[]$1="$$1"
- elif test -n "$PKG_CONFIG"; then
-    PKG_CHECK_EXISTS([$3],
-                     [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`],
-                    [pkg_failed=yes])
- else
-    pkg_failed=untried
-fi[]dnl
-])# _PKG_CONFIG
-
-# _PKG_SHORT_ERRORS_SUPPORTED
-# -----------------------------
-AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED],
-[AC_REQUIRE([PKG_PROG_PKG_CONFIG])
-if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
-        _pkg_short_errors_supported=yes
-else
-        _pkg_short_errors_supported=no
-fi[]dnl
-])# _PKG_SHORT_ERRORS_SUPPORTED
-
-
-# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
-# [ACTION-IF-NOT-FOUND])
-#
-#
-# Note that if there is a possibility the first call to
-# PKG_CHECK_MODULES might not happen, you should be sure to include an
-# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac
-#
-#
-# --------------------------------------------------------------
-AC_DEFUN([PKG_CHECK_MODULES],
-[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
-AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl
-AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl
-
-pkg_failed=no
-AC_MSG_CHECKING([for $1])
-
-_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2])
-_PKG_CONFIG([$1][_LIBS], [libs], [$2])
-
-m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS
-and $1[]_LIBS to avoid the need to call pkg-config.
-See the pkg-config man page for more details.])
-
-if test $pkg_failed = yes; then
-        _PKG_SHORT_ERRORS_SUPPORTED
-        if test $_pkg_short_errors_supported = yes; then
-               $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "$2" 2>&1`
-        else 
-               $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors "$2" 2>&1`
-        fi
-       # Put the nasty error message in config.log where it belongs
-       echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD
-
-       ifelse([$4], , [AC_MSG_ERROR(dnl
-[Package requirements ($2) were not met:
-
-$$1_PKG_ERRORS
-
-Consider adjusting the PKG_CONFIG_PATH environment variable if you
-installed software in a non-standard prefix.
-
-_PKG_TEXT
-])],
-               [AC_MSG_RESULT([no])
-                $4])
-elif test $pkg_failed = untried; then
-       ifelse([$4], , [AC_MSG_FAILURE(dnl
-[The pkg-config script could not be found or is too old.  Make sure it
-is in your PATH or set the PKG_CONFIG environment variable to the full
-path to pkg-config.
-
-_PKG_TEXT
-
-To get pkg-config, see <http://pkg-config.freedesktop.org/>.])],
-               [$4])
-else
-       $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS
-       $1[]_LIBS=$pkg_cv_[]$1[]_LIBS
-        AC_MSG_RESULT([yes])
-       ifelse([$3], , :, [$3])
-fi[]dnl
-])# PKG_CHECK_MODULES
-
-m4_include([setup/cocci.m4])
-m4_include([setup/ocaml.m4])
diff --git a/autogen.sh b/autogen.sh
deleted file mode 100755 (executable)
index c895932..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/bin/sh -e
-
-# build the 'configure' script
-echo "running aclocal (requires 'pkg-config' macros)"
-aclocal -I setup
-
-echo "running autoconf"
-autoconf
index bb8e45c..a3b17d5 100644 (file)
@@ -9,12 +9,20 @@ ifneq ($(MAKECMDGOALS),distclean)
 include ../../Makefile.config
 endif
 
+OCAMLCFLAGS ?= -g -dtypes
+OPTFLAGS ?= -g -dtypes
+
 VERSION=1.5.2
 EXTLIB=extlib-$(VERSION)
 EXTMARKER=$(EXTLIB)/.marker
 
-all: depend extLib.cma META
-all.opt: depend extLib.cmxa META
+all: $(EXTMARKER)
+       @$(MAKE) all-build
+all-build: $(EXTMARKER) extLib.cma META
+
+all.opt: $(EXTMARKER)
+       @$(MAKE) all-opt-build
+all-opt-build: $(EXTMARKER) extLib.cmxa META
 
 clean:
        rm -f .depend META extLib.cm[ioxa] extLib.[ao] \
@@ -34,7 +42,7 @@ $(EXTLIB).tar.gz:
        @echo "$@ not found. Please download it and drop it in this directory ($(pwd))."
        @false
 
-.PHONEY: all all.opt clean distclean depend
+.PHONEY: all all.opt all-build all-opt-build clean distclean depend
 
 # SOURCES
 MODULES = \
@@ -48,14 +56,16 @@ SRC=$(MODULES:%=$(EXTLIB)/%.ml) $(EXTLIB)/extLib.ml
 # otherwise errors such as 'module X makes inconsistent assumptions about interface Y' may
 # arise. The dependencies on this marker establishes this sharing.
 .mli-marker: $(MLI) $(SRC)
-       $(OCAMLC) -c -thread -I $(EXTLIB) $(MLI)
+       $(OCAMLC) $(OCAMLCFLAGS) -c -thread -I $(EXTLIB) $(MLI)
        touch .mli-marker
 
 extLib.cma: .mli-marker $(SRC)
-       $(OCAMLC) -a -custom -thread -I $(EXTLIB) -o extLib.cma $(MLI) $(SRC)
+       $(OCAMLC) $(OCAMLCFLAGS) -a -thread -I $(EXTLIB) -o extLib.cma $(MLI) $(SRC)
 
 extLib.cmxa: .mli-marker $(SRC)
-       $(OCAMLOPT) -a -linkall -thread -I $(EXTLIB) -o extLib.cmxa $(SRC)
+       $(OCAMLOPT) $(OPTFLAGS) -a -thread -I $(EXTLIB) -o extLib.cmxa $(SRC)
 
 META: $(EXTLIB)/META
        cp $< $@
+
+include ../../Makefile.common
index cec0a36..b174c61 100644 (file)
@@ -9,17 +9,25 @@ ifneq ($(MAKECMDGOALS),distclean)
 include ../../Makefile.config
 endif
 
+OCAMLCFLAGS ?= -g -dtypes
+OPTFLAGS ?= -g -dtypes
+
 VERSION=20120123
 MENHIRDIR=menhir-$(VERSION)
 MENHIRLIB=$(MENHIRDIR)/src
 MENHIRMARKER=$(MENHIRLIB)/.marker
 
-OCAMLC_CMD=$(OCAMLC) $(OCAMLCFLAGS) -I $(MENHIRLIB) -thread -custom
+OCAMLC_CMD=$(OCAMLC) $(OCAMLCFLAGS) -I $(MENHIRLIB) -thread
 OCAMLOPT_CMD=$(OCAMLOPT) $(OPTFLAGS) -I $(MENHIRLIB) -thread
 OCAMLDEP_CMD=$(OCAMLDEP) -I $(MENHIRLIB)
 
-all: menhirLib.cma META
-all.opt: menhirLib.cmxa META
+all: .depend
+       @$(MAKE) all-build
+all-build: .depend menhirLib.cma META
+
+all.opt: .depend
+       @$(MAKE) all-opt-build
+all-opt-build: .depend menhirLib.cmxa META
 
 clean:
        rm -f menhirLib.cma menhirLib.cmxa META \
@@ -40,7 +48,7 @@ $(MENHIRDIR).tar.gz:
        @echo "$@ not found. Please download it and drop it in this directory ($(pwd))."
        @false
 
-.PHONEY: all all.opt clean distclean depend
+.PHONEY: all all.opt all-build all-opt-build clean distclean depend depend-build
 
 # Sources needed for coccinelle
 MODULES=infiniteArray packedIntArray rowDisplacement engineTypes \
@@ -63,7 +71,7 @@ menhirLib.cmxa: .depend $(MLI:.mli=.cmi) $(SRC:.ml=.cmx)
 .PRECIOUS: $(MLI)
 
 .ml.mli:
-       $(OCAMLC_CMD) -i $< > $@
+       $(OCAMLC_CMD) -for-pack MenhirLib -i $< > $@
 
 .mli.cmi:
        $(OCAMLC_CMD) -for-pack MenhirLib -c $<
@@ -79,10 +87,21 @@ META: $(MENHIRLIB)/META
 
 # the 'depend' target
 .depend depend: $(MENHIRMARKER)
+       @$(MAKE) depend-build
+
+depend-build: $(MENHIRMARKER) $(SRC) $(MLI)
        $(OCAMLDEP_CMD) $(MENHIRLIB)/*.mli $(MENHIRLIB)/*.ml > .depend
 
+# extra dependencies that are needed to generate mli files
+# that are needed for ocamldep
+$(MENHIRLIB)/tableFormat.mli: $(MENHIRLIB)/packedIntArray.cmi $(MENHIRLIB)/engineTypes.cmi
+
 ifneq ($(MAKECMDGOALS),clean)
 ifneq ($(MAKECMDGOALS),distclean)
--include .depend
+ifneq ($(MAKECMDGOALS),depend-build)
+include .depend
+endif
 endif
 endif
+
+include ../../Makefile.common
diff --git a/bundles/menhirLib/menhir-20120123/AUTHORS b/bundles/menhirLib/menhir-20120123/AUTHORS
new file mode 100644 (file)
index 0000000..2def04c
--- /dev/null
@@ -0,0 +1,2 @@
+François Pottier <Francois.Pottier@inria.fr>
+Yann Régis-Gianas <Yann.Regis-Gianas@pps.jussieu.fr>
diff --git a/bundles/menhirLib/menhir-20120123/CHANGES b/bundles/menhirLib/menhir-20120123/CHANGES
new file mode 100644 (file)
index 0000000..afa111c
--- /dev/null
@@ -0,0 +1,172 @@
+2012/01/23:
+
+Fixed a bug whereby a %nonassoc declaration was not respected. This
+declaration requests that a shift/reduce conflict be reduced in favor of
+neither shifting nor reducing, that is, a syntax error must occur. However,
+due to an unforeseen interaction with the "default reduction" mechanism, this
+declaration was sometimes ignored and reduction would take place.
+
+2012/01/09:
+Changes in the (undocumented) Coq back-end so as to match the ESOP 2012
+paper.
+
+2011/10/19:
+The Makefile now tests whether Unix or Windows is used (the test is performed
+by evaluating Sys.os_type under ocaml) and changes a couple settings accordingly:
+- the executable file name is either menhir or menhir.exe
+- the object file suffix is either .o or .obj
+
+2011/10/19:
+Added --strict, which causes many warnings about the grammar and about the
+automaton to be considered errors.
+
+2011/10/19:
+The # annotations that are inserted in the generated .ml file now retain their
+full path. (That is, we no longer use [Filename.basename].) This implies that
+the # annotations depend on how menhir is invoked -- e.g.  "menhir
+foo/bar.mly" and "cd foo && menhir bar.mly" will produce different
+results. Nevertheless, this seems reasonable and useful (e.g. in conjunction
+with ocamlbuild and a hierarchy of files). Thanks to Daniel Weil.
+
+2011/10/06:
+With the -lg 1 switch, Menhir now indicates whether the grammar is SLR(1).
+
+2011/05/24:
+Removed the lock in ocamldep.wrapper. It is the responsibility of the user
+to avoid interferences with other processes (or other instances of the script)
+that create and/or remove files.
+
+2011/04/28:
+The (internal) computation of the automaton's invariant was broken and has
+been fixed. Surprisingly, this does not seem to affect the generated code,
+(which was correct,) so no observable bug is fixed. Hopefully no bug is
+introduced!
+
+2011/04/07:
+The grammar description files (.mly) are now read in up front and stored in
+memory while they are parsed. This allows us to avoid the use of pos_in and
+seek_in, which do not work correctly when CRLF conversion is being performed.
+
+2011/04/05:
+Fixed a bug in the type inference module (for parameterized non-terminals)
+which would cause an infinite loop.
+
+2011/01/24:
+Fixed a bug that would cause an assertion failure in the generated parser
+in some situations where the input stream was incorrect and the grammar
+involved the error token. The fix might cause grammars that use the error
+token to behave differently (hopefully more accurately) as of now.
+
+2009/06/18:
+Makefile changes: build and install only the bytecode version of menhirLib
+when TARGET=byte is set.
+
+2009/02/06:
+Fixed ocamldep.wrapper to avoid quoting the name of the ocaml command.
+This is hoped to fix a compilation problem under MinGW.
+
+2009/02/04:
+A Makefile fix to avoid a problem under Windows/Cygwin.
+Renamed the ocaml-check-version script so as to avoid a warning.
+
+2008/09/05:
+Ocaml summer project: added --interpret, --table, and --suggest-*.
+
+2008/08/06:
+Fixed a problem that would cause the code inliner to abort when a semantic
+value and a non-terminal symbol happened to have the same name.
+
+2008/08/06:
+Removed code sharing.
+
+2008/06/20:
+Removed an incorrect assertion that caused failures (lr1.ml, line 134).
+
+2007/12/05:
+Disabled code sharing by default, as it is currently broken. (See Yann's
+message; assertion failure at runtime.)
+
+2007/12/01:
+Added an optimization to share code among states that have identical
+outgoing transition tables.
+
+2007/08/30:
+Small Makefile change: create an executable file for check-ocaml-version in
+order to work around the absence of dynamic loading on some platforms.
+
+2007/05/20:
+Made a fundamental change in the construction of the LR(1) automaton
+in order to eliminate a bug that could lead to spurious conflicts --
+thanks to Ketti for submitting a bug report.
+
+2007/05/18:
+Added --follow-construction to help understand the construction of the
+LR(1) automaton (very verbose).
+
+2007/05/11:
+Code generation: more explicit qualifications with Pervasives so as
+to avoid capture when the user redefines some of the built-in operators,
+such as (+).
+Added a new demo (calc-param) that shows how to use %parameter.
+
+2007/03/22:
+Makefile improvements (check for PREFIX; bootstrap in bytecode now
+also available). Slight changes to OMakefile.shared.
+
+2007/02/15:
+Portability fix in Makefile and Makefile.shared (avoided "which").
+
+2006/12/15:
+Portability fix in Makefile.shared (replaced "&>" with "2>&1 >").
+
+2006/06/23:
+Made a slight restriction to Pager's criterion so as to never introduce
+fake conflict tokens (see Lr0.compatible). This might help make conflict
+explanations more accurate in the future.
+
+2006/06/16:
+Fixed bug that would cause positions to become invalid after %inlining.
+
+2006/06/15:
+Fixed --depend to be more lenient when analyzing ocamldep's output.
+Added --raw-depend which transmits ocamldep's output unchanged (for
+use in conjunction with omake).
+
+2006/06/12:
+Fixed bug that would cause --only-preprocess to print %token declarations
+also for pseudo-tokens.
+Fixed bug that caused some precedence declarations to be incorrectly
+reported as useless.
+Improved things so that useless pseudo-tokens now also cause warnings.
+Fixed bug that would cause %type directives for terminal symbols to
+be incorrectly accepted.
+Fixed bug that would occur when a semantic action containing $i keywords
+was %inlined.
+
+2006/05/05:
+Fixed problem that caused some end-of-stream conflicts not to be reported.
+Fixed Pager's compatibility criterion to avoid creating end-of-stream conflicts.
+
+2006/04/21:
+Fixed problem that allowed generating incorrect but apparently well-typed
+Objective Caml code when a semantic action was ill-typed and --infer was
+omitted.
+
+2006/03/29:
+Improved conflict reports by factoring out maximal common derivation contexts.
+
+2006/03/28:
+Fixed bug that could arise when explaining a conflict in a non-LALR(1) grammar.
+
+2006/03/27:
+Changed count of reduce/reduce conflicts to allow a comparison with ocamlyacc's diagnostics.
+When refusing to resolve a conflict, report all diagnostics before dying.
+
+2006/03/18:
+Added display of FOLLOW sets when using --log-grammar 2.
+Added --graph option.
+Fixed behavior of --depend option.
+
+2006/01/06:
+Removed reversed lists from the standard library.
+
diff --git a/bundles/menhirLib/menhir-20120123/INSTALLATION b/bundles/menhirLib/menhir-20120123/INSTALLATION
new file mode 100644 (file)
index 0000000..16976f2
--- /dev/null
@@ -0,0 +1,34 @@
+REQUIREMENTS
+
+You need Objective Caml 3.09 or later and GNU make.
+
+HOW TO INSTALL
+
+If you wish to install via ocamlfind, make sure that ocamlfind is in
+your PATH. (Remember that prefixing a command with sudo affects its
+PATH.)
+
+Run the following command:
+
+  make PREFIX=/usr/local install
+
+If your machine does not have the native code Objective Caml compiler
+(ocamlopt), but does have the bytecode compiler (ocamlc), then instead
+of the above command, use:
+
+  make PREFIX=/usr/local TARGET=byte all install
+
+The value of the PREFIX variable can be changed to control where
+the software, the standard library, and the documentation should
+be stored. These files are copied to the following places:
+
+  $PREFIX/bin/
+  $PREFIX/share/menhir/
+  $PREFIX/doc/menhir/
+
+The support library, MenhirLib, is either installed via ocamlfind, if
+available, or placed within $PREFIX/share/menhir. Menhir's --suggest
+options help determine where and how it was installed.
+
+The documentation includes a reference manual and a number of demos.
+
diff --git a/bundles/menhirLib/menhir-20120123/LICENSE b/bundles/menhirLib/menhir-20120123/LICENSE
new file mode 100644 (file)
index 0000000..f7c1ef1
--- /dev/null
@@ -0,0 +1,629 @@
+In the following, "the Library" refers to the following files:
+
+  src/standard.mly
+  src/infiniteArray.{ml,mli}
+  src/packedIntArray.{ml,mli}
+  src/rowDisplacement.{ml,mli}
+  src/engineTypes.ml
+  src/engine.{ml,mli}
+  src/tableFormat.ml
+  src/tableInterpreter.{ml,mli}
+  src/convert.{ml,mli}
+
+while "the Generator" refers to all other files in this archive.
+
+The Generator is distributed under the terms of the Q Public License
+version 1.0 with a change to choice of law (included below).
+
+The Library is distributed under the terms of the GNU Library General
+Public License version 2 (included below).
+
+As a special exception to the Q Public Licence, you may develop
+application programs, reusable components and other software items
+that link with the original or modified versions of the Generator
+and are not made available to the general public, without any of the
+additional requirements listed in clause 6c of the Q Public licence.
+
+As a special exception to the GNU Library General Public License, you
+may link, statically or dynamically, a "work that uses the Library"
+with a publicly distributed version of the Library to produce an
+executable file containing portions of the Library, and distribute
+that executable file under terms of your choice, without any of the
+additional requirements listed in clause 6 of the GNU Library General
+Public License.  By "a publicly distributed version of the Library",
+we mean either the unmodified Library as distributed by INRIA, or a
+modified version of the Library that is distributed under the
+conditions defined in clause 3 of the GNU Library General Public
+License.  This exception does not however invalidate any other reasons
+why the executable file might be covered by the GNU Library General
+Public License.
+
+----------------------------------------------------------------------
+
+                   THE Q PUBLIC LICENSE version 1.0
+
+              Copyright (C) 1999 Troll Tech AS, Norway.
+                  Everyone is permitted to copy and
+                  distribute this license document.
+
+The intent of this license is to establish freedom to share and change
+the software regulated by this license under the open source model.
+
+This license applies to any software containing a notice placed by the
+copyright holder saying that it may be distributed under the terms of
+the Q Public License version 1.0. Such software is herein referred to
+as the Software. This license covers modification and distribution of
+the Software, use of third-party application programs based on the
+Software, and development of free software which uses the Software.
+
+                            Granted Rights
+
+1. You are granted the non-exclusive rights set forth in this license
+provided you agree to and comply with any and all conditions in this
+license. Whole or partial distribution of the Software, or software
+items that link with the Software, in any form signifies acceptance of
+this license.
+
+2. You may copy and distribute the Software in unmodified form
+provided that the entire package, including - but not restricted to -
+copyright, trademark notices and disclaimers, as released by the
+initial developer of the Software, is distributed.
+
+3. You may make modifications to the Software and distribute your
+modifications, in a form that is separate from the Software, such as
+patches. The following restrictions apply to modifications:
+
+      a. Modifications must not alter or remove any copyright notices
+      in the Software.
+
+      b. When modifications to the Software are released under this
+      license, a non-exclusive royalty-free right is granted to the
+      initial developer of the Software to distribute your
+      modification in future versions of the Software provided such
+      versions remain available under these terms in addition to any
+      other license(s) of the initial developer.
+
+4. You may distribute machine-executable forms of the Software or
+machine-executable forms of modified versions of the Software,
+provided that you meet these restrictions:
+
+      a. You must include this license document in the distribution.
+
+      b. You must ensure that all recipients of the machine-executable
+      forms are also able to receive the complete machine-readable
+      source code to the distributed Software, including all
+      modifications, without any charge beyond the costs of data
+      transfer, and place prominent notices in the distribution
+      explaining this.
+
+      c. You must ensure that all modifications included in the
+      machine-executable forms are available under the terms of this
+      license.
+
+5. You may use the original or modified versions of the Software to
+compile, link and run application programs legally developed by you or
+by others.
+
+6. You may develop application programs, reusable components and other
+software items that link with the original or modified versions of the
+Software. These items, when distributed, are subject to the following
+requirements:
+
+      a. You must ensure that all recipients of machine-executable
+      forms of these items are also able to receive and use the
+      complete machine-readable source code to the items without any
+      charge beyond the costs of data transfer.
+
+      b. You must explicitly license all recipients of your items to
+      use and re-distribute original and modified versions of the
+      items in both machine-executable and source code forms. The
+      recipients must be able to do so without any charges whatsoever,
+      and they must be able to re-distribute to anyone they choose.
+
+      c. If the items are not available to the general public, and the
+      initial developer of the Software requests a copy of the items,
+      then you must supply one.
+
+                       Limitations of Liability
+
+In no event shall the initial developers or copyright holders be
+liable for any damages whatsoever, including - but not restricted to -
+lost revenue or profits or other direct, indirect, special, incidental
+or consequential damages, even if they have been advised of the
+possibility of such damages, except to the extent invariable law, if
+any, provides otherwise.
+
+                             No Warranty
+
+The Software and this license document are provided AS IS with NO
+WARRANTY OF ANY KIND, INCLUDING THE WARRANTY OF DESIGN,
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+
+                            Choice of Law
+
+This license is governed by the Laws of France.
+
+----------------------------------------------------------------------
+
+                  GNU LIBRARY GENERAL PUBLIC LICENSE
+                       Version 2, June 1991
+
+ Copyright (C) 1991 Free Software Foundation, Inc.
+ 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the library GPL.  It is
+ numbered 2 because it goes with version 2 of the ordinary GPL.]
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Library General Public License, applies to some
+specially designated Free Software Foundation software, and to any
+other libraries whose authors decide to use it.  You can use it for
+your libraries, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if
+you distribute copies of the library, or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link a program with the library, you must provide
+complete object files to the recipients so that they can relink them
+with the library, after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  Our method of protecting your rights has two steps: (1) copyright
+the library, and (2) offer you this license which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  Also, for each distributor's protection, we want to make certain
+that everyone understands that there is no warranty for this free
+library.  If the library is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original
+version, so that any problems introduced by others will not reflect on
+the original authors' reputations.
+\f
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that companies distributing free
+software will individually obtain patent licenses, thus in effect
+transforming the program into proprietary software.  To prevent this,
+we have made it clear that any patent must be licensed for everyone's
+free use or not licensed at all.
+
+  Most GNU software, including some libraries, is covered by the ordinary
+GNU General Public License, which was designed for utility programs.  This
+license, the GNU Library General Public License, applies to certain
+designated libraries.  This license is quite different from the ordinary
+one; be sure to read it in full, and don't assume that anything in it is
+the same as in the ordinary license.
+
+  The reason we have a separate public license for some libraries is that
+they blur the distinction we usually make between modifying or adding to a
+program and simply using it.  Linking a program with a library, without
+changing the library, is in some sense simply using the library, and is
+analogous to running a utility program or application program.  However, in
+a textual and legal sense, the linked executable is a combined work, a
+derivative of the original library, and the ordinary General Public License
+treats it as such.
+
+  Because of this blurred distinction, using the ordinary General
+Public License for libraries did not effectively promote software
+sharing, because most developers did not use the libraries.  We
+concluded that weaker conditions might promote sharing better.
+
+  However, unrestricted linking of non-free programs would deprive the
+users of those programs of all benefit from the free status of the
+libraries themselves.  This Library General Public License is intended to
+permit developers of non-free programs to use free libraries, while
+preserving your freedom as a user of such programs to change the free
+libraries that are incorporated in them.  (We have not seen how to achieve
+this as regards changes in header files, but we have achieved it as regards
+changes in the actual functions of the Library.)  The hope is that this
+will lead to faster development of free libraries.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, while the latter only
+works together with the library.
+
+  Note that it is possible for a library to be covered by the ordinary
+General Public License rather than by this special one.
+\f
+                  GNU LIBRARY GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library which
+contains a notice placed by the copyright holder or other authorized
+party saying it may be distributed under the terms of this Library
+General Public License (also called "this License").  Each licensee is
+addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+\f
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+\f
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+\f
+  6. As an exception to the Sections above, you may also compile or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    c) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    d) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the source code distributed need not include anything that is normally
+distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+\f
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+\f
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Library General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+\f
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+                            NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+\f
+     Appendix: How to Apply These Terms to Your New Libraries
+
+  If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change.  You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+  To apply these terms, attach the following notices to the library.  It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the library's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Library General Public
+    License as published by the Free Software Foundation; either
+    version 2 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Library General Public License for more details.
+
+    You should have received a copy of the GNU Library General Public
+    License along with this library; if not, write to the Free
+    Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+    MA 02111-1307, USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+  <signature of Ty Coon>, 1 April 1990
+  Ty Coon, President of Vice
+
+That's all there is to it!
diff --git a/bundles/menhirLib/menhir-20120123/Makefile b/bundles/menhirLib/menhir-20120123/Makefile
new file mode 100644 (file)
index 0000000..b99b71f
--- /dev/null
@@ -0,0 +1,102 @@
+# This is the main Makefile that is shipped as part of the source package.
+# Keep in mind that the hierarchy that is shipped is not identical to the
+# hierarchy within the svn repository: some sub-directories are not shipped;
+# the documentation is pre-built.
+
+# The hierarchy that is shipped includes:
+#   demos
+#   menhir.1
+#   manual.pdf
+#   src
+#   Makefile (this one)
+
+# ----------------------------------------------------------------------------
+
+# By default, we attempt to use ocamlfind (if present in the PATH), but it it
+# is possible to prevent that externally by setting USE_OCAMLFIND to false.
+
+ifndef USE_OCAMLFIND
+  USE_OCAMLFIND = ocamlfind ocamlc -v >/dev/null 2>&1
+endif
+
+# ----------------------------------------------------------------------------
+
+# A few settings differ on Windows versus Unix.
+
+include Makefile.arch
+
+# ----------------------------------------------------------------------------
+# Installation paths.
+
+# TEMPORARY GODIVA and Linux do not agree on the standard paths...
+
+ifndef PREFIX
+  $(error Please define PREFIX)
+endif
+
+bindir          := ${PREFIX}/bin
+docdir         := ${PREFIX}/share/doc/menhir
+libdir         := ${PREFIX}/share/menhir
+mandir          := ${PREFIX}/share/man/man1
+MANS            := menhir.1
+DOCS            := manual.pdf demos
+MLYLIB          := src/standard.mly
+
+# -------------------------------------------------------------------------
+
+# Building menhirLib.
+
+ifeq ($(TARGET),byte)
+MENHIRLIB       := menhirLib.cmi menhirLib.cmo
+else
+MENHIRLIB       := menhirLib.cmi menhirLib.cmo menhirLib.cmx menhirLib.$(OBJ)
+endif
+
+# ----------------------------------------------------------------------------
+# Compilation.
+
+# Installation time settings are recorded within src/installation.ml.
+# This file is recreated every time so as to avoid becoming stale.
+
+.PHONY: all install uninstall
+
+all:
+       rm -f src/installation.ml
+       echo "let libdir = \"${libdir}\"" > src/installation.ml
+       if $(USE_OCAMLFIND) ; then \
+         echo "let ocamlfind = true" >> src/installation.ml ; \
+       else \
+         echo "let ocamlfind = false" >> src/installation.ml ; \
+       fi
+       $(MAKE) $(MFLAGS) -C src -f Makefile
+       $(MAKE) $(MFLAGS) -C src -f Makefile $(MENHIRLIB)
+
+# ----------------------------------------------------------------------------
+# Installation.
+
+install: all
+       mkdir -p $(bindir)
+       mkdir -p $(libdir)
+       mkdir -p $(docdir)
+       mkdir -p $(mandir)
+       install src/$(MENHIREXE) $(bindir)
+       install -m 644 $(MLYLIB) $(libdir)
+       cp -r $(DOCS) $(docdir)
+       cp -r $(MANS) $(mandir)
+       @cd src && if $(USE_OCAMLFIND) ; then \
+         echo Installing MenhirLib via ocamlfind. ; \
+         ocamlfind install menhirLib META $(MENHIRLIB) ; \
+       else \
+         echo Installing MenhirLib manually. ; \
+         install -m 644 $(MENHIRLIB) $(libdir) ; \
+       fi
+
+uninstall:
+       rm -rf $(bindir)/$(MENHIREXE)
+       rm -rf $(libdir)
+       rm -rf $(docdir)
+       rm -rf $(mandir)/$(MANS)
+       @if $(USE_OCAMLFIND) ; then \
+         echo Un-installing MenhirLib via ocamlfind. ; \
+         ocamlfind remove menhirLib ; \
+       fi
diff --git a/bundles/menhirLib/menhir-20120123/Makefile.arch b/bundles/menhirLib/menhir-20120123/Makefile.arch
new file mode 100644 (file)
index 0000000..aba8a1c
--- /dev/null
@@ -0,0 +1,10 @@
+# If ocaml reports that Sys.os_type is Unix, we assume Unix, otherwise
+# we assume Windows.
+
+ifeq "$(shell rm -f ./o.ml && echo print_endline Sys.os_type > ./o.ml && ocaml ./o.ml && rm -f ./o.ml)" "Unix"
+MENHIREXE    := menhir
+OBJ          := o
+else
+MENHIREXE    := menhir.exe
+OBJ          := obj
+endif
diff --git a/bundles/menhirLib/menhir-20120123/demos/Makefile b/bundles/menhirLib/menhir-20120123/demos/Makefile
new file mode 100644 (file)
index 0000000..e12e4cd
--- /dev/null
@@ -0,0 +1,14 @@
+DEMOS := calc calc-two calc-param
+
+.PHONY: all clean
+
+all:
+       @for i in $(DEMOS) ; do \
+         $(MAKE) -C $$i ; \
+       done
+
+clean:
+       /bin/rm -f *~ .*~ *.omc
+       @for i in $(DEMOS) ; do \
+         $(MAKE) -C $$i clean ; \
+       done
diff --git a/bundles/menhirLib/menhir-20120123/demos/Makefile.auto b/bundles/menhirLib/menhir-20120123/demos/Makefile.auto
new file mode 100644 (file)
index 0000000..e1515ca
--- /dev/null
@@ -0,0 +1,7 @@
+# This auxiliary Makefile is meant to be included by a client Makefile in
+# addition to Makefile.shared. It is optional. It implements the common case
+# where every .mly file in the current directory is to be viewed as a
+# mono-module grammar specification.
+
+$(foreach module,$(wildcard *.mly),$(eval $(call menhir_monomodule,$(patsubst %.mly,%,$(module)),)))
+
diff --git a/bundles/menhirLib/menhir-20120123/demos/Makefile.shared b/bundles/menhirLib/menhir-20120123/demos/Makefile.shared
new file mode 100644 (file)
index 0000000..93add01
--- /dev/null
@@ -0,0 +1,282 @@
+# This Makefile is shared between all demos. It is our suggestion
+# of a canonical Makefile for projects that use Objective Caml,
+# ocamllex, and menhir. It requires a recent version of GNU make
+# (older versions do not correctly implement $(eval)).
+
+# ----------------------------------------------------------------
+
+# This Makefile is meant to be included within a host Makefile
+# that defines the following variables:
+#
+# GENERATED    :  a list of the source (.ml and .mli) files
+#                 that should be generated by invoking ocamllex
+#                 or menhir
+#
+# MODULES      :  a list of the modules (without extension)
+#                 that should be linked into the executable
+#                 program. Order is significant.
+#
+# EXECUTABLE   :  the base name of the executables that should
+#                 be produced. Suffixes $(BSUFFIX) and $(OSUFFIX)
+#                 will be added to distinguish the bytecode and
+#                 native code versions.
+
+# ----------------------------------------------------------------
+
+# The host Makefile can also override the following settings:
+
+# Menhir.
+
+ifndef MENHIR
+  MENHIR         := menhir
+endif
+
+# Parser generation flags.
+ifndef PGFLAGS
+  PGFLAGS        := --infer -v
+endif
+
+# Include directives for compilation and for linking.
+
+ifndef INCLUDE
+  INCLUDE        :=
+endif
+
+# Bytecode compilation flags.
+
+ifndef BFLAGS
+  BFLAGS         := 
+endif
+
+# Native code compilation flags.
+ifndef OFLAGS
+  OFLAGS         := 
+endif
+
+# Menhir-suggested compilation flags.
+ifndef SUGG_FLAGS
+  SUGG_FLAGS     := $(shell $(MENHIR) $(PGFLAGS) --suggest-comp-flags 2>/dev/null)
+endif
+
+# Bytecode link-time flags.
+ifndef BLNKFLAGS
+  BLNKFLAGS      := 
+endif
+
+# Menhir-suggested bytecode link-time flags.
+ifndef SUGG_BLNKFLAGS
+  SUGG_BLNKFLAGS := $(shell $(MENHIR) $(PGFLAGS) --suggest-link-flags-byte 2>/dev/null)
+endif
+
+# Native code link-time flags.
+ifndef OLNKFLAGS
+  OLNKFLAGS      := 
+endif
+
+# Menhir-suggested native code link-time flags.
+ifndef SUGG_OLNKFLAGS
+  SUGG_OLNKFLAGS := $(shell $(MENHIR) $(PGFLAGS) --suggest-link-flags-opt 2>/dev/null)
+endif
+
+# Suffix appended to the name of the bytecode executable.
+ifndef BSUFFIX
+  BSUFFIX        := .byte
+endif
+
+# Suffix appended to the name of the native code executable.
+ifndef OSUFFIX
+  OSUFFIX        := 
+endif
+
+# Access paths.
+
+ifndef OCAML
+    OCAML        := ocaml
+endif
+
+ifndef OCAMLC
+  OCAMLC         := $(shell if ocamlfind ocamlc -v >/dev/null 2>&1 ; \
+                       then echo ocamlfind ocamlc ; \
+                      elif ocamlc.opt -v >/dev/null 2>&1 ; \
+                       then echo ocamlc.opt ; \
+                      else echo ocamlc ; fi)
+endif
+
+ifndef OCAMLOPT
+  OCAMLOPT       := $(shell if ocamlfind ocamlopt -v >/dev/null 2>&1 ; \
+                       then echo ocamlfind ocamlopt ; \
+                      elif ocamlopt.opt -v >/dev/null 2>&1 ; \
+                       then echo ocamlopt.opt ; \
+                      else echo ocamlopt ; fi)
+endif
+
+ifndef OCAMLDEP
+  OCAMLDEP       := $(shell if ocamlfind ocamldep -version >/dev/null 2>&1 ; \
+                       then echo ocamlfind ocamldep ; \
+                      elif ocamldep.opt -version >/dev/null 2>&1 ; \
+                       then echo ocamldep.opt ; \
+                      else echo ocamldep ; fi)
+endif
+
+ifndef OCAMLDEPWRAPPER
+  OCAMLDEPWRAPPER:= ./ocamldep.wrapper
+endif
+
+ifndef OCAMLLEX
+  OCAMLLEX       := ocamllex
+endif
+
+# A list of targets that do not require dependency analysis.
+# This variable should be set by the host before including
+# this Makefile.
+COLD           += clean
+
+# ----------------------------------------------------------------
+
+# Do not destroy the generated source files.
+
+.SECONDARY: $(GENERATED)
+
+# ----------------------------------------------------------------
+
+# Linking.
+
+$(EXECUTABLE)$(OSUFFIX): $(MODULES:=.cmx)
+       $(OCAMLOPT) -o $@ $(INCLUDE) $(OLNKFLAGS) $(SUGG_FLAGS) $(SUGG_OLNKFLAGS) $^
+
+$(EXECUTABLE)$(BSUFFIX): $(MODULES:=.cmo)
+       $(OCAMLC) -o $@ $(INCLUDE) $(BLNKFLAGS) $(SUGG_FLAGS) $(SUGG_BLNKFLAGS) $^
+
+# ----------------------------------------------------------------
+
+# Compiling.
+
+# We make the .ml and .mli files generated by ocamllex and menhir
+# unwritable, so as to prevent them from being edited by mistake.
+
+%.cmi: %.mli %.mli.d
+       $(OCAMLC) $(INCLUDE) $(BFLAGS) $(SUGG_FLAGS) -c $<
+
+%.cmo: %.ml %.ml.d
+       $(OCAMLC) $(INCLUDE) $(BFLAGS) $(SUGG_FLAGS) -c $<
+
+%.cmx %.o: %.ml %.ml.d
+       $(OCAMLOPT) $(INCLUDE) $(OFLAGS) $(SUGG_FLAGS) -c $<
+
+%.ml: %.mll
+       @if [ -f $@ ] ; then /bin/chmod +w $@ ; fi
+       $(OCAMLLEX) $<
+       @/bin/chmod -w $@
+
+# ----------------------------------------------------------------
+
+# Computing dependencies.
+
+# We associate a tiny Makefile, whose name ends in .d, with every
+# source file; it contains dependency information only. For an .ml or
+# .mli file, we create an .ml.d or .mli.d file by invoking ocamldep.
+# For an .mll file, we create an .ml.d file by invoking ocamllex first
+# (this is implicit), then ocamldep.
+
+# When it finds a reference to module M, ocamldep checks whether the
+# files m.ml and m.mli exist before deciding which dependency to
+# report. If m.ml and m.mli are generated from m.mll or m.mly, then
+# there is a potential problem: because ocamldep is invoked before
+# these files are created, it cannot see them. The standard solution
+# until now was to invoke ocamllex and ocamlyacc first to create all
+# generated files, and run ocamldep next. This approach does not work
+# with menhir when the --infer switch is on: menhir cannot be invoked
+# first because it needs type information found in .cmi (or .cmo or
+# .cmx) files. Our solution is to wrap ocamldep in a script that
+# creates fake generated files m.ml and m.mli to let ocamldep know that
+# these files are supposed to exist. This is somewhat tricky, but appears
+# to work.
+
+%.ml.d: %.ml
+       $(OCAML) $(OCAMLDEPWRAPPER) $(GENERATED) - $(OCAMLDEP) $< > $@
+
+%.mli.d: %.mli
+       $(OCAML) $(OCAMLDEPWRAPPER) $(GENERATED) - $(OCAMLDEP) $< > $@
+
+# All .d files are included within the present Makefile, so it they
+# do not exist, they are created first, and the dependencies that
+# they contain are then taken into account.
+
+# A .SECONDARY directive is used to ensure that the auxiliary
+# Makefiles are never removed. Otherwise, make could create
+# one, remove one, create one, remove one, ... (We have observed
+# this.)
+
+ifeq ($(findstring $(MAKECMDGOALS),$(COLD)),)
+  ifneq ($(strip $(wildcard *.mli)),)
+    .SECONDARY: $(patsubst %.mli,%.mli.d,$(wildcard *.mli))
+    -include    $(patsubst %.mli,%.mli.d,$(wildcard *.mli))
+  endif
+  ifneq ($(strip $(wildcard *.ml)),)
+    .SECONDARY: $(patsubst %.ml,%.ml.d,$(wildcard *.ml))
+    -include    $(patsubst %.ml,%.ml.d,$(wildcard *.ml))
+  endif
+  ifneq ($(strip $(wildcard *.mll)),)
+    .SECONDARY: $(patsubst %.mll,%.ml.d,$(wildcard *.mll))
+    -include    $(patsubst %.mll,%.ml.d,$(wildcard *.mll))
+  endif
+endif
+
+
+# ----------------------------------------------------------------
+
+# Support for menhir projects.
+
+# The macro menhir_multimodule defines support for multi-module grammar
+# specifications, that is, for producing parsers out of multiple
+# source files. The parameter $(1) is the name of the parser that
+# should be produced; the parameter $(2) is the list of .mly source
+# files; the parameter $(3) contains extra options to be passed to
+# menhir.
+
+# The dependency file is named $(1).d and created by invoking menhir
+# --depend.
+
+define menhir_multimodule
+$(1).ml $(1).mli: $(2) $(1).d
+       @if [ -f $(1).ml ] ; then /bin/chmod +w $(1).ml ; fi
+       @if [ -f $(1).mli ] ; then /bin/chmod +w $(1).mli ; fi
+       $(MENHIR) --ocamlc "$(OCAMLC)" $(PGFLAGS) --base $(1) $(3) $(2)
+       @/bin/chmod -w $(1).ml $(1).mli
+
+$(1).d: $(2)
+       @if [ -f $(1).ml ] ; then /bin/chmod +w $(1).ml ; fi
+       @if [ -f $(1).mli ] ; then /bin/chmod +w $(1).mli ; fi
+       $(OCAML) $(OCAMLDEPWRAPPER) $(GENERATED) - \
+                $(MENHIR) --ocamldep "$(OCAMLDEP)" --depend --base $(1) $(3) $(2) > $$@
+
+ifeq ($$(findstring $$(MAKECMDGOALS),$$(COLD)),)
+.SECONDARY: $(1).d
+-include    $(1).d
+endif
+endef
+
+# The macro menhir_monomodule defines support for a mono-module grammar
+# specification. The parameter $(1) is the name of the parser that
+# should be produced; the source file is $(1).mly. The parameter $(2)
+# contains extra options to be passed to menhir.
+
+define menhir_monomodule
+$(eval $(call menhir_multimodule,$(1),$(1).mly,$(2)))
+endef
+
+# Neither of the two macros above is invoked by default, as it is not
+# known here which is appropriate. It is up to the client to invoke
+# these macros with suitable parameters. The auxiliary Makefile.auto
+# implements the common case where every .mly file is a mono-module
+# grammar.
+
+# ----------------------------------------------------------------
+
+.PHONY: clean
+
+clean::
+       /bin/rm -f $(EXECUTABLE)$(BSUFFIX) $(EXECUTABLE)$(OSUFFIX) $(GENERATED)
+       /bin/rm -f *.cmi *.cmx *.cmo *.o *~ .*~ *.automaton *.conflicts *.annot
+       /bin/rm -f *.d
+
diff --git a/bundles/menhirLib/menhir-20120123/demos/OMakefile.shared b/bundles/menhirLib/menhir-20120123/demos/OMakefile.shared
new file mode 100644 (file)
index 0000000..af8e0ca
--- /dev/null
@@ -0,0 +1,231 @@
+# This OMakefile is designed for projects that use Objective Caml,
+# ocamllex, menhir, and alphaCaml.
+
+# This OMakefile is meant to be included within a host OMakefile
+# that defines the following variables:
+#
+# GENERATED    :  a list of the source (.ml and .mli) files
+#                 that are generated (by invoking ocamllex
+#                 or menhir)
+#
+# MODULES      :  a list of the modules (without extension)
+#                 that should be linked into the executable
+#                 program. Order is significant.
+#
+# EXECUTABLE   :  the base name of the executables that should
+#                 be produced. Suffixes $(BSUFFIX) and $(OSUFFIX)
+#                 will be added to distinguish the bytecode and
+#                 native code versions.
+
+# -------------------------------------------------------------------------
+
+# The host OMakefile can override the following default settings.
+
+# Menhir.
+
+if $(not $(defined MENHIR))
+    MENHIR           = menhir
+    export
+
+# Parser generation flags.
+
+if $(not $(defined MENHIR_FLAGS))
+    MENHIR_FLAGS          = --infer -v
+    export
+
+# Include directives for compilation and for linking.
+
+if $(not $(defined PREFIXED_OCAMLINCLUDES))
+    PREFIXED_OCAMLINCLUDES = 
+    export
+
+# Bytecode compilation flags.
+
+if $(not $(defined BFLAGS))
+    BFLAGS           = -dtypes -g
+    export
+
+# Native code compilation flags.
+
+if $(not $(defined OFLAGS))
+    OFLAGS           = -dtypes
+    export
+
+# Menhir-suggested compilation flags.
+if $(not $(defined SUGG_FLAGS))
+    SUGG_FLAGS       = $(shell $(MENHIR) $(MENHIR_FLAGS) --suggest-comp-flags 2>/dev/null)
+    export
+
+# Bytecode link-time flags.
+
+if $(not $(defined BLNKFLAGS))
+    BLNKFLAGS        = -g
+    export
+
+# Menhir-suggested bytecode link-time flags.
+if $(not $(defined SUGG_BLNKFLAGS))
+    SUGG_BLNKFLAGS       = $(shell $(MENHIR) $(MENHIR_FLAGS) --suggest-link-flags-byte 2>/dev/null)
+    export
+
+# Native code link-time flags.
+
+if $(not $(defined OLNKFLAGS))
+    OLNKFLAGS        =
+    export
+
+# Menhir-suggested native code link-time flags.
+if $(not $(defined SUGG_OLNKFLAGS))
+    SUGG_OLNKFLAGS       = $(shell $(MENHIR) $(MENHIR_FLAGS) --suggest-link-flags-opt 2>/dev/null)
+    export
+
+# Lexer generation flags.
+
+if $(not $(defined LGFLAGS))
+    LGFLAGS          = 
+    export
+
+# Suffix appended to the name of the bytecode executable.
+
+if $(not $(defined BSUFFIX))
+    BSUFFIX          = .byte
+    export
+
+# Suffix appended to the name of the native code executable.
+
+if $(not $(defined OSUFFIX))
+    OSUFFIX          =
+    export
+
+# Access paths for the tools.
+
+if $(not $(defined OCAML))
+    OCAML            = ocaml
+    export
+
+if $(not $(defined OCAMLC))
+    if $(which ocamlfind)
+       OCAMLC       = ocamlfind ocamlc
+       export
+    elseif $(which ocamlc.opt)
+       OCAMLC       = ocamlc.opt
+       export
+    else
+       OCAMLC       = ocamlc
+       export
+    export
+
+if $(not $(defined OCAMLOPT))
+    if $(which ocamlfind)
+       OCAMLOPT     = ocamlfind ocamlopt
+       export
+    elseif $(which ocamlopt.opt)
+       OCAMLOPT     = ocamlopt.opt
+       export
+    else
+       OCAMLOPT     = ocamlopt
+       export
+    export
+
+if $(not $(defined OCAMLDEP))
+    if $(which ocamlfind)
+       OCAMLDEP     = ocamlfind ocamldep
+       export
+    elseif $(which ocamldep.opt)
+       OCAMLDEP     = ocamldep.opt
+       export
+    else
+       OCAMLDEP     = ocamldep
+       export
+    export
+
+if $(not $(defined OCAMLDEPWRAPPER))
+    OCAMLDEPWRAPPER  = ./ocamldep.wrapper
+    export
+
+if $(not $(defined OCAMLLEX))
+    OCAMLLEX         = ocamllex
+    export
+
+if $(not $(defined ALPHACAML))
+    ALPHACAML        = alphaCaml
+    export
+
+# ----------------------------------------------------------------
+
+# Define an ocamldep wrapper that creates fake generated files so that
+# ocamldep can see that these files exist (or are supposed to exist).
+# This is required to work around ocamldep's brokenness.
+
+WrapScanner(command) =
+    $(OCAML) $(OCAMLDEPWRAPPER) $(GENERATED) - $(command)
+
+# ----------------------------------------------------------------
+
+# Dependencies.
+
+.SCANNER: %.cmi: %.mli
+       WrapScanner($(OCAMLDEP) $<)
+
+.SCANNER: %.cmx %.cmo %.o: %.ml
+       WrapScanner($(OCAMLDEP) $<)
+
+# ----------------------------------------------------------------
+
+# Compilation.
+
+%.cmi: %.mli
+       $(OCAMLC) $(PREFIXED_OCAMLINCLUDES) $(BFLAGS) $(SUGG_FLAGS) -c $<
+
+%.cmo: %.ml
+       $(OCAMLC) $(PREFIXED_OCAMLINCLUDES) $(BFLAGS) $(SUGG_FLAGS) -c $<
+
+%.cmx %.o: %.ml
+       $(OCAMLOPT) $(PREFIXED_OCAMLINCLUDES) $(OFLAGS) $(SUGG_FLAGS) -c $<
+
+%.ml: %.mll
+       $(OCAMLLEX) $(LGFLAGS) $<
+
+%.ml %.mli: %.mla
+       $(ALPHACAML) $<
+
+# ----------------------------------------------------------------
+
+# Linking.
+
+$(EXECUTABLE)$(OSUFFIX): $(addsuffix .cmx, $(MODULES))
+       $(OCAMLOPT) -o $@ $(PREFIXED_OCAMLINCLUDES) $(OLNKFLAGS) $(SUGG_FLAGS) $(SUGG_OLNKFLAGS) $+
+
+$(EXECUTABLE)$(BSUFFIX): $(addsuffix .cmo, $(MODULES))
+       $(OCAMLC) -o $@ $(PREFIXED_OCAMLINCLUDES) $(BLNKFLAGS) $(SUGG_FLAGS) $(SUGG_BLNKFLAGS) $+
+
+# ----------------------------------------------------------------
+
+# Menhir: multiple file projects.
+
+MenhirMulti(target, sources, options) =
+    TARGETS   = $(file $(target).ml $(target).mli)
+    SOURCES   = $(file $(sources))
+    $(TARGETS): $(SOURCES)
+       $(MENHIR) --ocamlc "$(OCAMLC) $(PREFIXED_OCAMLINCLUDES) $(BFLAGS)" $(MENHIR_FLAGS) --base $(target) $(options) $(SOURCES)
+    .SCANNER: $(TARGETS): $(SOURCES)
+       WrapScanner($(MENHIR) --ocamldep "$(OCAMLDEP)" --depend --base $(target) $(options) $(SOURCES))
+
+# Menhir: single file projects.
+
+MenhirMono(target, options) =
+    MenhirMulti($(target), $(target).mly, $(options))
+
+# Menhir: automatic single file projects.
+# This causes every .mly file to be viewed as a single file project.
+
+MenhirAuto() =
+    foreach (target, $(glob *.mly))
+       MenhirMono($(removesuffix $(target)), $(EMPTY))
+
+# ----------------------------------------------------------------
+
+.PHONY: clean
+
+clean:
+    /bin/rm -f $(EXECUTABLE)$(BSUFFIX) $(EXECUTABLE)$(OSUFFIX) $(GENERATED)
+    /bin/rm -f *.cmi *.cmx *.cmo *.o *~ .*~ *.automaton *.conflicts *.annot
diff --git a/bundles/menhirLib/menhir-20120123/demos/calc-param/Makefile b/bundles/menhirLib/menhir-20120123/demos/calc-param/Makefile
new file mode 100644 (file)
index 0000000..35d91ef
--- /dev/null
@@ -0,0 +1,9 @@
+# Add --table on the next line to use Menhir's table-based back-end.
+PGFLAGS         := --infer
+GENERATED       := parser.ml parser.mli lexer.ml tokens.ml tokens.mli
+MODULES         := parser lexer calc
+EXECUTABLE      := calc
+OCAMLDEPWRAPPER := ../ocamldep.wrapper
+include ../Makefile.shared
+$(eval $(call menhir_monomodule,tokens,--only-tokens))
+$(eval $(call menhir_multimodule,parser,tokens.mly parser.mly,--external-tokens Tokens))
diff --git a/bundles/menhirLib/menhir-20120123/demos/calc-param/OMakefile b/bundles/menhirLib/menhir-20120123/demos/calc-param/OMakefile
new file mode 100644 (file)
index 0000000..3a54e55
--- /dev/null
@@ -0,0 +1,7 @@
+GENERATED       = parser.ml parser.mli lexer.ml
+MODULES         = parser lexer calc
+EXECUTABLE      = calc
+OCAMLDEPWRAPPER = ../ocamldep.wrapper
+include ../OMakefile.shared
+MenhirAuto()
+.DEFAULT: $(EXECUTABLE)$(OSUFFIX)
diff --git a/bundles/menhirLib/menhir-20120123/demos/calc-param/OMakeroot b/bundles/menhirLib/menhir-20120123/demos/calc-param/OMakeroot
new file mode 100644 (file)
index 0000000..4a4e99c
--- /dev/null
@@ -0,0 +1,15 @@
+#
+# Load the standard configuration.
+#
+open build/Common
+
+#
+# The command-line variables are defined *after* the
+# standard configuration has been loaded.
+#
+DefineCommandVars()
+
+#
+# Include the OMakefile in this directory.
+#
+.SUBDIRS: .
diff --git a/bundles/menhirLib/menhir-20120123/demos/calc-param/README b/bundles/menhirLib/menhir-20120123/demos/calc-param/README
new file mode 100644 (file)
index 0000000..8f0a16e
--- /dev/null
@@ -0,0 +1,5 @@
+In this variant of the calc demo, the parser's semantic actions are
+parameterized over a structure, called [Semantics], which defines how numbers
+should be interpreted. The parser is later instantiated with floating-point
+numbers, so the calculator actually performs floating-point evaluation -- but
+the grammar specification is independent of this detail.
diff --git a/bundles/menhirLib/menhir-20120123/demos/calc-param/calc.ml b/bundles/menhirLib/menhir-20120123/demos/calc-param/calc.ml
new file mode 100644 (file)
index 0000000..812a168
--- /dev/null
@@ -0,0 +1,53 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* Let's do floating-point evaluation, for a change. *)
+
+module FloatSemantics = struct
+
+  type number =
+      float
+
+  let inject =
+    float_of_int
+
+  let ( + ) = ( +. )
+  let ( - ) = ( -. )
+  let ( * ) = ( *. )
+  let ( / ) = ( /. )
+  let (~- ) = (~-. )
+
+end
+
+(* Let us now specialize our parameterized parser. *)
+
+module FloatParser =
+  Parser.Make(FloatSemantics)
+
+(* The rest is as usual. *)
+
+let () =
+  let stdinbuf = Lexing.from_channel stdin in
+  while true do
+    (* Read line by line. *)
+    let linebuf = Lexing.from_string (Lexer.line stdinbuf) in
+    try
+      (* Run the parser on a single line of input. *)
+      Printf.printf "%.1f\n%!" (FloatParser.main Lexer.token linebuf)
+    with
+    | Lexer.Error msg ->
+       Printf.fprintf stderr "%s%!" msg
+    | FloatParser.Error ->
+       Printf.fprintf stderr "At offset %d: syntax error.\n%!" (Lexing.lexeme_start linebuf)
+  done
diff --git a/bundles/menhirLib/menhir-20120123/demos/calc-param/lexer.mll b/bundles/menhirLib/menhir-20120123/demos/calc-param/lexer.mll
new file mode 100644 (file)
index 0000000..d52f36e
--- /dev/null
@@ -0,0 +1,51 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+{
+  open Tokens
+
+  exception Error of string
+
+}
+
+rule line = parse
+| ([^'\n']* '\n') as line
+    { line }
+| eof
+    { exit 0 }
+
+and token = parse
+| [' ' '\t']
+    { token lexbuf }
+| '\n'
+    { EOL }
+| ['0'-'9']+ as i
+    { INT (int_of_string i) }
+| '+'
+    { PLUS }
+| '-'
+    { MINUS }
+| '*'
+    { TIMES }
+| '/'
+    { DIV }
+| '('
+    { LPAREN }
+| ')'
+    { RPAREN }
+| eof
+    { exit 0 }
+| _
+    { raise (Error (Printf.sprintf "At offset %d: unexpected character.\n" (Lexing.lexeme_start lexbuf))) }
+
diff --git a/bundles/menhirLib/menhir-20120123/demos/calc-param/parser.mly b/bundles/menhirLib/menhir-20120123/demos/calc-param/parser.mly
new file mode 100644 (file)
index 0000000..5189c9f
--- /dev/null
@@ -0,0 +1,63 @@
+/**************************************************************************/
+/*                                                                        */
+/*  Menhir                                                                */
+/*                                                                        */
+/*  François Pottier, INRIA Rocquencourt                                  */
+/*  Yann Régis-Gianas, PPS, Université Paris Diderot                      */
+/*                                                                        */
+/*  Copyright 2005-2008 Institut National de Recherche en Informatique    */
+/*  et en Automatique. All rights reserved. This file is distributed      */
+/*  under the terms of the Q Public License version 1.0, with the change  */
+/*  described in file LICENSE.                                            */
+/*                                                                        */
+/**************************************************************************/
+
+(* These are the functions that we need in order to write our semantic
+   actions. *)
+
+%parameter<Semantics : sig
+  type number
+  val inject: int -> number
+  val ( + ): number -> number -> number
+  val ( - ): number -> number -> number
+  val ( * ): number -> number -> number
+  val ( / ): number -> number -> number
+  val ( ~-): number -> number
+end>
+
+(* The parser no longer returns an integer; instead, it returns an
+   abstract number. *)
+
+%start <Semantics.number> main
+
+(* Let us open the [Semantics] module, so as to make all of its
+   operations available in the semantic actions. *)
+
+%{
+
+  open Semantics
+
+%}
+
+%%
+
+main:
+| e = expr EOL
+    { e }
+
+expr:
+| i = INT
+    { inject i }
+| LPAREN e = expr RPAREN
+    { e }
+| e1 = expr PLUS e2 = expr
+    { e1 + e2 }
+| e1 = expr MINUS e2 = expr
+    { e1 - e2 }
+| e1 = expr TIMES e2 = expr
+    { e1 * e2 }
+| e1 = expr DIV e2 = expr
+    { e1 / e2 }
+| MINUS e = expr %prec UMINUS
+    { - e }
+
diff --git a/bundles/menhirLib/menhir-20120123/demos/calc-param/tokens.mly b/bundles/menhirLib/menhir-20120123/demos/calc-param/tokens.mly
new file mode 100644 (file)
index 0000000..f0fe857
--- /dev/null
@@ -0,0 +1,29 @@
+/**************************************************************************/
+/*                                                                        */
+/*  Menhir                                                                */
+/*                                                                        */
+/*  François Pottier, INRIA Rocquencourt                                  */
+/*  Yann Régis-Gianas, PPS, Université Paris Diderot                      */
+/*                                                                        */
+/*  Copyright 2005-2008 Institut National de Recherche en Informatique    */
+/*  et en Automatique. All rights reserved. This file is distributed      */
+/*  under the terms of the Q Public License version 1.0, with the change  */
+/*  described in file LICENSE.                                            */
+/*                                                                        */
+/**************************************************************************/
+
+(* We want the tokens to be independent of the [Semantics] parameter,
+   so we declare them here, in a separate file, as opposed to within
+   [parser.mly]. *)
+
+%token <int> INT
+%token PLUS MINUS TIMES DIV
+%token LPAREN RPAREN
+%token EOL
+
+%left PLUS MINUS        /* lowest precedence */
+%left TIMES DIV         /* medium precedence */
+%nonassoc UMINUS        /* highest precedence */
+
+%%
+
diff --git a/bundles/menhirLib/menhir-20120123/demos/calc-two/Makefile b/bundles/menhirLib/menhir-20120123/demos/calc-two/Makefile
new file mode 100644 (file)
index 0000000..29a6d52
--- /dev/null
@@ -0,0 +1,10 @@
+# Add --table on the next line to use Menhir's table-based back-end.
+PGFLAGS         := --infer
+GENERATED       := tokens.ml tokens.mli algebraic.ml algebraic.mli reverse.ml reverse.mli lexer.ml
+MODULES         := algebraic reverse lexer calc
+EXECUTABLE      := calc
+OCAMLDEPWRAPPER := ../ocamldep.wrapper
+include ../Makefile.shared
+$(eval $(call menhir_monomodule,tokens,--only-tokens))
+$(eval $(call menhir_multimodule,algebraic,tokens.mly algebraic.mly common.mly,--external-tokens Tokens))
+$(eval $(call menhir_multimodule,reverse,tokens.mly reverse.mly common.mly,--external-tokens Tokens))
diff --git a/bundles/menhirLib/menhir-20120123/demos/calc-two/OMakefile b/bundles/menhirLib/menhir-20120123/demos/calc-two/OMakefile
new file mode 100644 (file)
index 0000000..0cb1482
--- /dev/null
@@ -0,0 +1,9 @@
+GENERATED       = tokens.ml tokens.mli algebraic.ml algebraic.mli reverse.ml reverse.mli lexer.ml
+MODULES         = algebraic reverse lexer calc
+EXECUTABLE      = calc
+OCAMLDEPWRAPPER = ../ocamldep.wrapper
+include ../OMakefile.shared
+MenhirMono(tokens,--only-tokens)
+MenhirMulti(algebraic,tokens.mly algebraic.mly,--external-tokens Tokens)
+MenhirMulti(reverse,tokens.mly reverse.mly,--external-tokens Tokens)
+.DEFAULT: $(EXECUTABLE)$(OSUFFIX)
diff --git a/bundles/menhirLib/menhir-20120123/demos/calc-two/OMakeroot b/bundles/menhirLib/menhir-20120123/demos/calc-two/OMakeroot
new file mode 100644 (file)
index 0000000..4a4e99c
--- /dev/null
@@ -0,0 +1,15 @@
+#
+# Load the standard configuration.
+#
+open build/Common
+
+#
+# The command-line variables are defined *after* the
+# standard configuration has been loaded.
+#
+DefineCommandVars()
+
+#
+# Include the OMakefile in this directory.
+#
+.SUBDIRS: .
diff --git a/bundles/menhirLib/menhir-20120123/demos/calc-two/README b/bundles/menhirLib/menhir-20120123/demos/calc-two/README
new file mode 100644 (file)
index 0000000..322e6a1
--- /dev/null
@@ -0,0 +1,12 @@
+This tiny program reads arithmetic expressions from the standard input
+channel. Each expression is expected to be complete when the current line
+ends. Its value is then displayed on the standard output channel.
+
+In this version, there is a single lexer, but there are two parsers, one for
+expressions in algebraic (that is, infix) notation, one for expressions in
+reverse Polish (that is, postfix) notation. One of the two parsers is selected
+at runtime via a command line switch.
+
+This demo illustrates how to build two parsers that share a single set of
+tokens (see tokens.mly) and that share some productions (see common.mly).
+
diff --git a/bundles/menhirLib/menhir-20120123/demos/calc-two/algebraic.mly b/bundles/menhirLib/menhir-20120123/demos/calc-two/algebraic.mly
new file mode 100644 (file)
index 0000000..2493845
--- /dev/null
@@ -0,0 +1,39 @@
+/**************************************************************************/
+/*                                                                        */
+/*  Menhir                                                                */
+/*                                                                        */
+/*  François Pottier, INRIA Rocquencourt                                  */
+/*  Yann Régis-Gianas, PPS, Université Paris Diderot                      */
+/*                                                                        */
+/*  Copyright 2005-2008 Institut National de Recherche en Informatique    */
+/*  et en Automatique. All rights reserved. This file is distributed      */
+/*  under the terms of the Q Public License version 1.0, with the change  */
+/*  described in file LICENSE.                                            */
+/*                                                                        */
+/**************************************************************************/
+
+(* This partial grammar specification defines the syntax of expressions
+   in algebraic notation. *)
+
+%left PLUS MINUS        /* lowest precedence */
+%left TIMES DIV         /* medium precedence */
+%nonassoc UMINUS        /* highest precedence */
+
+%%
+
+%public expr:
+| i = INT
+    { i }
+| LPAREN e = expr RPAREN
+    { e }
+| e1 = expr PLUS e2 = expr
+    { e1 + e2 }
+| e1 = expr MINUS e2 = expr
+    { e1 - e2 }
+| e1 = expr TIMES e2 = expr
+    { e1 * e2 }
+| e1 = expr DIV e2 = expr
+    { e1 / e2 }
+| MINUS e = expr %prec UMINUS
+    { - e }
+
diff --git a/bundles/menhirLib/menhir-20120123/demos/calc-two/calc.ml b/bundles/menhirLib/menhir-20120123/demos/calc-two/calc.ml
new file mode 100644 (file)
index 0000000..5ff7ed4
--- /dev/null
@@ -0,0 +1,44 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+let algebraic =
+  ref true
+
+let () =
+  Arg.parse [
+    "--algebraic", Arg.Set algebraic, " Use algebraic (that is, infix) notation";
+    "--reverse", Arg.Clear algebraic, " Use reverse Polish (that is, postfix) notation";
+  ] (fun _ -> ()) (Printf.sprintf "Usage: %s <options>" Sys.argv.(0))
+
+let main =
+  if !algebraic then
+    Algebraic.main
+  else
+    Reverse.main
+
+let () =
+  let stdinbuf = Lexing.from_channel stdin in
+  while true do
+    (* Read line by line. *)
+    let linebuf = Lexing.from_string (Lexer.line stdinbuf) in
+    try
+      (* Run the parser on a single line of input. *)
+      Printf.printf "%d\n%!" (main Lexer.token linebuf)
+    with
+    | Lexer.Error msg ->
+       Printf.fprintf stderr "%s%!" msg
+    | Algebraic.Error
+    | Reverse.Error ->
+       Printf.fprintf stderr "At offset %d: syntax error.\n%!" (Lexing.lexeme_start linebuf)
+  done
diff --git a/bundles/menhirLib/menhir-20120123/demos/calc-two/common.mly b/bundles/menhirLib/menhir-20120123/demos/calc-two/common.mly
new file mode 100644 (file)
index 0000000..057ff02
--- /dev/null
@@ -0,0 +1,25 @@
+/**************************************************************************/
+/*                                                                        */
+/*  Menhir                                                                */
+/*                                                                        */
+/*  François Pottier, INRIA Rocquencourt                                  */
+/*  Yann Régis-Gianas, PPS, Université Paris Diderot                      */
+/*                                                                        */
+/*  Copyright 2005-2008 Institut National de Recherche en Informatique    */
+/*  et en Automatique. All rights reserved. This file is distributed      */
+/*  under the terms of the Q Public License version 1.0, with the change  */
+/*  described in file LICENSE.                                            */
+/*                                                                        */
+/**************************************************************************/
+
+(* This partial grammar specification defines the grammar's entry
+   point to be an expression, followed with an end-of-line token. *)
+
+%start <int> main
+
+%%
+
+main:
+| e = expr EOL
+    { e }
+
diff --git a/bundles/menhirLib/menhir-20120123/demos/calc-two/lexer.mll b/bundles/menhirLib/menhir-20120123/demos/calc-two/lexer.mll
new file mode 100644 (file)
index 0000000..d52f36e
--- /dev/null
@@ -0,0 +1,51 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+{
+  open Tokens
+
+  exception Error of string
+
+}
+
+rule line = parse
+| ([^'\n']* '\n') as line
+    { line }
+| eof
+    { exit 0 }
+
+and token = parse
+| [' ' '\t']
+    { token lexbuf }
+| '\n'
+    { EOL }
+| ['0'-'9']+ as i
+    { INT (int_of_string i) }
+| '+'
+    { PLUS }
+| '-'
+    { MINUS }
+| '*'
+    { TIMES }
+| '/'
+    { DIV }
+| '('
+    { LPAREN }
+| ')'
+    { RPAREN }
+| eof
+    { exit 0 }
+| _
+    { raise (Error (Printf.sprintf "At offset %d: unexpected character.\n" (Lexing.lexeme_start lexbuf))) }
+
diff --git a/bundles/menhirLib/menhir-20120123/demos/calc-two/reverse.mly b/bundles/menhirLib/menhir-20120123/demos/calc-two/reverse.mly
new file mode 100644 (file)
index 0000000..f504423
--- /dev/null
@@ -0,0 +1,33 @@
+/**************************************************************************/
+/*                                                                        */
+/*  Menhir                                                                */
+/*                                                                        */
+/*  François Pottier, INRIA Rocquencourt                                  */
+/*  Yann Régis-Gianas, PPS, Université Paris Diderot                      */
+/*                                                                        */
+/*  Copyright 2005-2008 Institut National de Recherche en Informatique    */
+/*  et en Automatique. All rights reserved. This file is distributed      */
+/*  under the terms of the Q Public License version 1.0, with the change  */
+/*  described in file LICENSE.                                            */
+/*                                                                        */
+/**************************************************************************/
+
+(* This partial grammar specification defines the syntax of
+   expressions in reverse Polish notation. Parentheses are
+   meaningless, and unary minus is not supported (some other symbol
+   than MINUS would be required in order to avoid an ambiguity). *)
+
+%%
+
+%public expr:
+| i = INT
+    { i }
+| e1 = expr e2 = expr PLUS
+    { e1 + e2 }
+| e1 = expr e2 = expr MINUS
+    { e1 - e2 }
+| e1 = expr e2 = expr TIMES
+    { e1 * e2 }
+| e1 = expr e2 = expr DIV
+    { e1 / e2 }
+
diff --git a/bundles/menhirLib/menhir-20120123/demos/calc-two/tokens.mly b/bundles/menhirLib/menhir-20120123/demos/calc-two/tokens.mly
new file mode 100644 (file)
index 0000000..6062ccb
--- /dev/null
@@ -0,0 +1,23 @@
+/**************************************************************************/
+/*                                                                        */
+/*  Menhir                                                                */
+/*                                                                        */
+/*  François Pottier, INRIA Rocquencourt                                  */
+/*  Yann Régis-Gianas, PPS, Université Paris Diderot                      */
+/*                                                                        */
+/*  Copyright 2005-2008 Institut National de Recherche en Informatique    */
+/*  et en Automatique. All rights reserved. This file is distributed      */
+/*  under the terms of the Q Public License version 1.0, with the change  */
+/*  described in file LICENSE.                                            */
+/*                                                                        */
+/**************************************************************************/
+
+(* This partial grammar specification defines the set of tokens. *)
+
+%token <int> INT
+%token PLUS MINUS TIMES DIV
+%token LPAREN RPAREN
+%token EOL
+
+%%
+
diff --git a/bundles/menhirLib/menhir-20120123/demos/calc/.omakedb b/bundles/menhirLib/menhir-20120123/demos/calc/.omakedb
new file mode 100644 (file)
index 0000000..7cec567
Binary files /dev/null and b/bundles/menhirLib/menhir-20120123/demos/calc/.omakedb differ
diff --git a/bundles/menhirLib/menhir-20120123/demos/calc/.omakedb.lock b/bundles/menhirLib/menhir-20120123/demos/calc/.omakedb.lock
new file mode 100644 (file)
index 0000000..0096f04
--- /dev/null
@@ -0,0 +1 @@
+*** omake: the project was last locked by madiran:5845.
diff --git a/bundles/menhirLib/menhir-20120123/demos/calc/Makefile b/bundles/menhirLib/menhir-20120123/demos/calc/Makefile
new file mode 100644 (file)
index 0000000..f411226
--- /dev/null
@@ -0,0 +1,8 @@
+# Add --table on the next line to use Menhir's table-based back-end.
+PGFLAGS         := --infer
+GENERATED       := parser.ml parser.mli lexer.ml
+MODULES         := parser lexer calc
+EXECUTABLE      := calc
+OCAMLDEPWRAPPER := ../ocamldep.wrapper
+include ../Makefile.shared
+include ../Makefile.auto
diff --git a/bundles/menhirLib/menhir-20120123/demos/calc/OMakefile b/bundles/menhirLib/menhir-20120123/demos/calc/OMakefile
new file mode 100644 (file)
index 0000000..3a54e55
--- /dev/null
@@ -0,0 +1,7 @@
+GENERATED       = parser.ml parser.mli lexer.ml
+MODULES         = parser lexer calc
+EXECUTABLE      = calc
+OCAMLDEPWRAPPER = ../ocamldep.wrapper
+include ../OMakefile.shared
+MenhirAuto()
+.DEFAULT: $(EXECUTABLE)$(OSUFFIX)
diff --git a/bundles/menhirLib/menhir-20120123/demos/calc/OMakefile.omc b/bundles/menhirLib/menhir-20120123/demos/calc/OMakefile.omc
new file mode 100644 (file)
index 0000000..1c98984
Binary files /dev/null and b/bundles/menhirLib/menhir-20120123/demos/calc/OMakefile.omc differ
diff --git a/bundles/menhirLib/menhir-20120123/demos/calc/OMakeroot b/bundles/menhirLib/menhir-20120123/demos/calc/OMakeroot
new file mode 100644 (file)
index 0000000..4a4e99c
--- /dev/null
@@ -0,0 +1,15 @@
+#
+# Load the standard configuration.
+#
+open build/Common
+
+#
+# The command-line variables are defined *after* the
+# standard configuration has been loaded.
+#
+DefineCommandVars()
+
+#
+# Include the OMakefile in this directory.
+#
+.SUBDIRS: .
diff --git a/bundles/menhirLib/menhir-20120123/demos/calc/OMakeroot.omc b/bundles/menhirLib/menhir-20120123/demos/calc/OMakeroot.omc
new file mode 100644 (file)
index 0000000..2c6b3c9
Binary files /dev/null and b/bundles/menhirLib/menhir-20120123/demos/calc/OMakeroot.omc differ
diff --git a/bundles/menhirLib/menhir-20120123/demos/calc/README b/bundles/menhirLib/menhir-20120123/demos/calc/README
new file mode 100644 (file)
index 0000000..6c61d9c
--- /dev/null
@@ -0,0 +1,4 @@
+This tiny program reads arithmetic expressions from the standard input
+channel. Each expression is expected to be complete when the current line
+ends. Its value is then displayed on the standard output channel. This
+code is adapted from ocamlyacc's documentation.
diff --git a/bundles/menhirLib/menhir-20120123/demos/calc/calc.ml b/bundles/menhirLib/menhir-20120123/demos/calc/calc.ml
new file mode 100644 (file)
index 0000000..cc54679
--- /dev/null
@@ -0,0 +1,28 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+let () =
+  let stdinbuf = Lexing.from_channel stdin in
+  while true do
+    (* Read line by line. *)
+    let linebuf = Lexing.from_string (Lexer.line stdinbuf) in
+    try
+      (* Run the parser on a single line of input. *)
+      Printf.printf "%d\n%!" (Parser.main Lexer.token linebuf)
+    with
+    | Lexer.Error msg ->
+       Printf.fprintf stderr "%s%!" msg
+    | Parser.Error ->
+       Printf.fprintf stderr "At offset %d: syntax error.\n%!" (Lexing.lexeme_start linebuf)
+  done
diff --git a/bundles/menhirLib/menhir-20120123/demos/calc/lexer.mll b/bundles/menhirLib/menhir-20120123/demos/calc/lexer.mll
new file mode 100644 (file)
index 0000000..686391e
--- /dev/null
@@ -0,0 +1,51 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+{
+  open Parser
+
+  exception Error of string
+
+}
+
+rule line = parse
+| ([^'\n']* '\n') as line
+    { line }
+| eof
+    { exit 0 }
+
+and token = parse
+| [' ' '\t']
+    { token lexbuf }
+| '\n'
+    { EOL }
+| ['0'-'9']+ as i
+    { INT (int_of_string i) }
+| '+'
+    { PLUS }
+| '-'
+    { MINUS }
+| '*'
+    { TIMES }
+| '/'
+    { DIV }
+| '('
+    { LPAREN }
+| ')'
+    { RPAREN }
+| eof
+    { exit 0 }
+| _
+    { raise (Error (Printf.sprintf "At offset %d: unexpected character.\n" (Lexing.lexeme_start lexbuf))) }
+
diff --git a/bundles/menhirLib/menhir-20120123/demos/calc/parser.mly b/bundles/menhirLib/menhir-20120123/demos/calc/parser.mly
new file mode 100644 (file)
index 0000000..fc26563
--- /dev/null
@@ -0,0 +1,47 @@
+/**************************************************************************/
+/*                                                                        */
+/*  Menhir                                                                */
+/*                                                                        */
+/*  François Pottier, INRIA Rocquencourt                                  */
+/*  Yann Régis-Gianas, PPS, Université Paris Diderot                      */
+/*                                                                        */
+/*  Copyright 2005-2008 Institut National de Recherche en Informatique    */
+/*  et en Automatique. All rights reserved. This file is distributed      */
+/*  under the terms of the Q Public License version 1.0, with the change  */
+/*  described in file LICENSE.                                            */
+/*                                                                        */
+/**************************************************************************/
+
+%token <int> INT
+%token PLUS MINUS TIMES DIV
+%token LPAREN RPAREN
+%token EOL
+
+%left PLUS MINUS        /* lowest precedence */
+%left TIMES DIV         /* medium precedence */
+%nonassoc UMINUS        /* highest precedence */
+
+%start <int> main
+
+%%
+
+main:
+| e = expr EOL
+    { e }
+
+expr:
+| i = INT
+    { i }
+| LPAREN e = expr RPAREN
+    { e }
+| e1 = expr PLUS e2 = expr
+    { e1 + e2 }
+| e1 = expr MINUS e2 = expr
+    { e1 - e2 }
+| e1 = expr TIMES e2 = expr
+    { e1 * e2 }
+| e1 = expr DIV e2 = expr
+    { e1 / e2 }
+| MINUS e = expr %prec UMINUS
+    { - e }
+
diff --git a/bundles/menhirLib/menhir-20120123/demos/ocamldep.wrapper b/bundles/menhirLib/menhir-20120123/demos/ocamldep.wrapper
new file mode 100755 (executable)
index 0000000..6131e07
--- /dev/null
@@ -0,0 +1,99 @@
+#!/usr/bin/env ocaml
+
+(* ocamldep.wrapper <filename> ... <filename> - <ocamldep command>
+   runs the <ocamldep command> in an environment where all of the
+   <filenames> listed appear to exist. The files are created, if
+   required, before the command is run, and destroyed afterwards. *)
+
+(* An earlier version of this script acquired a lock, so as to prevent
+   multiple instances of this script from interfering with one another.
+   However, this did not prevent interference between this script and
+   some other process (e.g., the ocaml compiler) which creates files.
+   So, the lock has been removed. My suggestion is to never use this
+   script in a concurrent setting. If you wish to use parallel make,
+   then you might be able to use a two-level Makefile approach: first,
+   compute all dependencies in a sequential manner; then, construct all
+   targets in a parallel manner. *)
+
+#load "unix.cma"
+open Printf
+
+(* Parse the command line. The arguments that precede "-" are understood
+   as file names and stored in the list [xs]. The arguments that follow
+   "-" are understood as a command and stored in [command]. *)
+
+let xs =
+  ref []
+
+let command =
+  ref ""
+
+let verbose =
+  ref false
+
+let rec loop accumulating i =
+  if i = Array.length Sys.argv then
+    ()
+  else if accumulating then
+    (* [accumulating] is [true] as long as we have not found the "-" marker *)
+    match Sys.argv.(i) with
+    | "-v" ->
+       verbose := true;
+       loop true (i+1)
+    | "-" ->
+        (* We have found the marker. The next parameter should be the name of
+          the raw [ocamldep] command. Copy it to the command (unquoted --
+          apparently some shells do not permit quoting a command name). *)
+       let i = i + 1 in
+       assert (i < Array.length Sys.argv);
+       command := Sys.argv.(i);
+       (* Stop accumulating file names. Copy the remaining arguments into
+          the command. *)
+       loop false (i+1)
+    | _ ->
+        (* Continue accumulating file names in [xs]. *)
+       xs := Sys.argv.(i) :: !xs;
+       loop true (i+1)
+  else begin
+    (* After we have found the "-" marker, the remaining arguments are
+       copied (quoted) into the command. *)
+    command := sprintf "%s %s" !command (Filename.quote Sys.argv.(i));
+    loop false (i+1)
+  end
+
+let () =
+  loop true 1
+
+(* Create the required files if they don't exist, run the command,
+   then destroy any files that we have created. *)
+
+let rec loop = function
+  | [] ->
+      if !verbose then
+       fprintf stderr "ocamldep.wrapper: running %s\n" !command;
+      Sys.command !command
+  | x :: xs ->
+      if Sys.file_exists x then
+       loop xs
+      else begin
+       if !verbose then
+         fprintf stderr "ocamldep.wrapper: creating fake %s\n" x;
+       let c = open_out x in
+       close_out c;
+       let exitcode = loop xs in
+       if Sys.file_exists x then begin
+         try
+           if !verbose then
+             fprintf stderr "ocamldep.wrapper: removing fake %s..." x;
+           Sys.remove x;
+           if !verbose then
+             fprintf stderr " ok\n"
+         with Sys_error _ ->
+           if !verbose then
+             fprintf stderr " failed\n"
+       end;
+       exitcode
+      end
+
+let () =
+  exit (loop !xs)
diff --git a/bundles/menhirLib/menhir-20120123/manual.pdf b/bundles/menhirLib/menhir-20120123/manual.pdf
new file mode 100644 (file)
index 0000000..8e4d10e
Binary files /dev/null and b/bundles/menhirLib/menhir-20120123/manual.pdf differ
diff --git a/bundles/menhirLib/menhir-20120123/menhir.1 b/bundles/menhirLib/menhir-20120123/menhir.1
new file mode 100644 (file)
index 0000000..e241b91
--- /dev/null
@@ -0,0 +1,140 @@
+.\"                                      Hey, EMACS: -*- nroff -*-
+.TH MENHIR 1 "April 19, 2006"
+.\" Please adjust this date whenever revising the manpage.
+.\"
+.\" Some roff macros, for reference:
+.\" .nh        disable hyphenation
+.\" .hy        enable hyphenation
+.\" .ad l      left justify
+.\" .ad b      justify to both left and right margins
+.\" .nf        disable filling
+.\" .fi        enable filling
+.\" .br        insert line break
+.\" .sp <n>    insert n+1 empty lines
+.\" for manpage-specific macros, see man(7)
+
+
+.SH NAME
+menhir \- parser generator for OCaml
+
+
+.SH SYNOPSIS
+.B menhir
+.RI [ options ] " files"
+.SH DESCRIPTION
+.B menhir
+is a LR(1) parser generator for the Objective Caml programming language. That is, Menhir compiles LR(1) grammar specifications down to Objective Caml code. It is mostly compatible with
+.BR ocamlyacc (1).
+
+
+.SH OPTIONS
+.TP
+.B \-h, \-\-help
+Show summary of options.
+.TP
+.BI \-b,\ \-\-base\  basename
+Specifies a base name for the output file(s).
+.TP
+.B \-\-comment
+Include comments in the generated code.
+.TP
+.B \-\-depend
+Invoke ocamldep and display dependencies.
+.TP
+.B \-\-dump
+Describe the automaton in
+.IR basename .automaton.
+.TP
+.B \-\-error\-recovery
+Attempt recovery by discarding tokens after errors.
+.TP
+.B \-\-explain
+Explain conflicts in
+.IR basename .conflicts.
+.TP
+.BI \-\-external\-tokens\  module
+Import token type definition from
+.IR module .
+.TP
+.B \-\-graph
+Write grammar's dependency graph to
+.IR basename .dot.
+.TP
+.B \-\-infer
+Invoke ocamlc for ahead of time type inference.
+.TP
+.B \-\-interpret
+Interpret the sentences provided on stdin.
+.TP
+.B \-\-interpret\-show\-cst
+Show a concrete syntax tree upon acceptance.
+.TP
+.BI \-la,\ \-\-log\-automaton\  level
+Log information about the automaton.
+.TP
+.BI \-lc,\ \-\-log\-code\  level
+Log information about the generated code.
+.TP
+.BI \-lg,\ \-\-log\-grammar\  level
+Log information about the grammar.
+.TP
+.B \-\-no\-inline
+Ignore the %inline keyword.
+.TP
+.B \-\-no\-stdlib
+Do not load the standard library.
+.TP
+.BI \-\-ocamlc\  command
+Specifies how ocamlc should be invoked.
+.TP
+.BI \-\-ocamldep\  command
+Specifies how ocamldep should be invoked.
+.TP
+.B \-\-only\-preprocess
+Print a simplified grammar and exit.
+.TP
+.B \-\-only\-tokens
+Generate token type definition only, no code.
+.TP
+.B \-\-raw\-depend
+Invoke ocamldep and echo its raw output.
+.TP
+.BI \-\-stdlib\  directory
+Specify where the standard library lies.
+.TP
+.B \-\-suggest\-comp\-flags
+Suggest compilation flags for ocaml{c,opt}.
+.TP
+.B \-\-suggest\-link\-flags-byte
+Suggest link flags for ocamlc.
+.TP
+.B \-\-suggest\-link\-flags-opt
+Suggest link flags for ocamlopt.
+.TP
+.B \-t, \-\-table
+Use the table-based back-end.
+.TP
+.B \-\-timings
+Display internal timings.
+.TP
+.B \-\-trace
+Include tracing instructions in the generated code.
+.TP
+.B \-\-version
+Show version number and exit.
+.TP
+.B \-v
+Synonymous with
+.BR \-\-dump\ \-\-explain .
+
+
+.SH SEE ALSO
+.BR ocaml (1).
+
+
+.SH AUTHOR
+.B menhir
+was written by François Pottier and Yann Régis-Gianas.
+.PP
+This manual page was written by Samuel Mimram <smimram@debian.org>,
+for the Debian project (but may be used by others).
diff --git a/bundles/menhirLib/menhir-20120123/src/.marker b/bundles/menhirLib/menhir-20120123/src/.marker
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/bundles/menhirLib/menhir-20120123/src/Fix.ml b/bundles/menhirLib/menhir-20120123/src/Fix.ml
new file mode 100644 (file)
index 0000000..7de3c54
--- /dev/null
@@ -0,0 +1,530 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* -------------------------------------------------------------------------- *)
+
+(* Maps. *)
+
+(* We require imperative maps, that is, maps that can be updated in place.
+   An implementation of persistent maps, such as the one offered by ocaml's
+   standard library, can easily be turned into an implementation of imperative
+   maps, so this is a weak requirement. *)
+
+module type IMPERATIVE_MAPS = sig
+  type key
+  type 'data t
+  val create: unit -> 'data t
+  val clear: 'data t -> unit
+  val add: key -> 'data -> 'data t -> unit
+  val find: key -> 'data t -> 'data
+  val iter: (key -> 'data -> unit) -> 'data t -> unit
+end
+
+(* -------------------------------------------------------------------------- *)
+
+(* Properties. *)
+
+(* Properties must form a partial order, equipped with a least element, and
+   must satisfy the ascending chain condition: every monotone sequence
+   eventually stabilizes. *)
+
+(* [is_maximal] determines whether a property [p] is maximal with respect to
+   the partial order. Only a conservative check is required: in any event, it
+   is permitted for [is_maximal p] to return [false]. If [is_maximal p]
+   returns [true], then [p] must have no upper bound other than itself. In
+   particular, if properties form a lattice, then [p] must be the top
+   element. This feature, not described in the paper, enables a couple of
+   minor optimizations. *)
+
+module type PROPERTY = sig
+  type property
+  val bottom: property
+  val equal: property -> property -> bool
+  val is_maximal: property -> bool
+end
+
+(* -------------------------------------------------------------------------- *)
+
+(* The dynamic dependency graph. *)
+
+(* An edge from [node1] to [node2] means that [node1] depends on [node2], or
+   (equivalently) that [node1] observes [node2]. Then, an update of the
+   current property at [node2] causes a signal to be sent to [node1]. A node
+   can observe itself. *)
+
+(* This module could be placed in a separate file, but is included here in
+   order to make [Fix] self-contained. *)
+
+module Graph : sig
+
+  (* This module provides a data structure for maintaining and modifying
+     a directed graph. Each node is allowed to carry a piece of client
+     data. There are functions for creating a new node, looking up a
+     node's data, looking up a node's predecessors, and setting or
+     clearing a node's successors (all at once). *)
+  type 'data node
+
+  (* [create data] creates a new node, with no incident edges, with
+     client information [data]. Time complexity: constant. *)
+  val create: 'data -> 'data node
+
+  (* [data node] returns the client information associated with
+     the node [node]. Time complexity: constant. *)
+  val data: 'data node -> 'data
+
+  (* [predecessors node] returns a list of [node]'s predecessors.
+     Amortized time complexity: linear in the length of the output
+     list. *)
+  val predecessors: 'data node -> 'data node list
+
+  (* [set_successors src dsts] creates an edge from the node [src] to
+     each of the nodes in the list [dsts]. Duplicate elements in the
+     list [dsts] are removed, so that no duplicate edges are created. It
+     is assumed that [src] initially has no successors. Time complexity:
+     linear in the length of the input list. *)
+  val set_successors: 'data node -> 'data node list -> unit
+
+  (* [clear_successors node] removes all of [node]'s outgoing edges.
+     Time complexity: linear in the number of edges that are removed. *)
+  val clear_successors: 'data node -> unit
+
+  (* That's it. *)
+end
+= struct
+
+  (* Using doubly-linked adjacency lists, one could implement [predecessors]
+     in worst-case linear time with respect to the length of the output list,
+     [set_successors] in worst-case linear time with respect to the length of
+     the input list, and [clear_successors] in worst-case linear time with
+     respect to the number of edges that are removed. We use a simpler
+     implementation, based on singly-linked adjacency lists, with deferred
+     removal of edges. It achieves the same complexity bounds, except
+     [predecessors] only offers an amortized complexity bound. This is good
+     enough for our purposes, and, in practice, is more efficient by a
+     constant factor. This simplification was suggested by Arthur
+     Charguéraud. *)
+
+  type 'data node = {
+
+    (* The client information associated with this node. *)
+
+    data: 'data;
+
+    (* This node's incoming and outgoing edges. *)
+
+    mutable outgoing: 'data edge list;
+    mutable incoming: 'data edge list;
+
+    (* A transient mark, always set to [false], except when checking
+       against duplicate elements in a successor list. *)
+
+    mutable marked: bool;
+
+  }
+
+  and 'data edge = {
+
+    (* This edge's nodes. Edges are symmetric: source and destination
+       are not distinguished. Thus, an edge appears both in the outgoing
+       edge list of its source node and in the incoming edge list of its
+       destination node. This allows edges to be easily marked as
+       destroyed. *)
+
+    node1: 'data node;
+    node2: 'data node;
+
+    (* Edges that are destroyed are marked as such, but are not
+       immediately removed from the adjacency lists. *)
+
+    mutable destroyed: bool;
+
+  }
+
+  let create (data : 'data) : 'data node = {
+    data = data;
+    outgoing = [];
+    incoming = [];
+    marked = false;
+  }
+
+  let data (node : 'data node) : 'data =
+    node.data
+
+  (* [follow src edge] returns the node that is connected to [src]
+     by [edge]. Time complexity: constant. *)
+
+  let follow src edge =
+    if edge.node1 == src then
+      edge.node2
+    else begin
+      assert (edge.node2 == src);
+      edge.node1
+    end
+
+  (* The [predecessors] function removes edges that have been marked
+     destroyed. The cost of removing these has already been paid for,
+     so the amortized time complexity of [predecessors] is linear in
+     the length of the output list. *)
+
+  let predecessors (node : 'data node) : 'data node list =
+    let predecessors = List.filter (fun edge -> not edge.destroyed) node.incoming in
+    node.incoming <- predecessors;
+    List.map (follow node) predecessors
+
+  (* [link src dst] creates a new edge from [src] to [dst], together
+     with its reverse edge. Time complexity: constant. *)
+
+  let link (src : 'data node) (dst : 'data node) : unit =
+    let edge = {
+      node1 = src;
+      node2 = dst;
+      destroyed = false;
+    } in
+    src.outgoing <- edge :: src.outgoing;
+    dst.incoming <- edge :: dst.incoming
+
+  let set_successors (src : 'data node) (dsts : 'data node list) : unit =
+    assert (src.outgoing = []);
+    let rec loop = function
+      | [] ->
+         ()
+      | dst :: dsts ->
+         if dst.marked then
+           loop dsts (* skip duplicate elements *)
+         else begin
+           dst.marked <- true;
+           link src dst;
+           loop dsts;
+           dst.marked <- false
+         end
+    in
+    loop dsts
+
+  let clear_successors (node : 'data node) : unit =
+    List.iter (fun edge ->
+      assert (not edge.destroyed);
+      edge.destroyed <- true;
+    ) node.outgoing;
+    node.outgoing <- []
+
+end
+
+(* -------------------------------------------------------------------------- *)
+
+(* The code is parametric in an implementation of maps over variables and in
+   an implementation of properties. *)
+
+module Make
+  (M : IMPERATIVE_MAPS)
+  (P : PROPERTY)
+= struct
+
+type variable =
+    M.key
+
+type property =
+    P.property
+
+type valuation =
+    variable -> property
+
+type rhs =
+    valuation -> property
+
+type equations =
+    variable -> rhs
+
+(* -------------------------------------------------------------------------- *)
+
+(* Data. *)
+
+(* Each node in the dependency graph carries information about a fixed
+   variable [v]. *)
+
+type node =
+    data Graph.node
+
+and data = {
+
+  (* This is the result of the application of [rhs] to the variable [v]. It
+     must be stored in order to guarantee that this application is performed
+     at most once. *)
+  rhs: rhs;
+
+  (* This is the current property at [v]. It evolves monotonically with
+     time. *)
+  mutable property: property;
+
+  (* That's it! *)
+}
+
+(* [property node] returns the current property at [node]. *)
+
+let property node =
+  (Graph.data node).property
+
+(* -------------------------------------------------------------------------- *)
+
+(* Many definitions must be made within the body of the function [lfp].
+   For greater syntactic convenience, we place them in a local module. *)
+
+let lfp (eqs : equations) : valuation =
+  let module LFP = struct
+
+(* -------------------------------------------------------------------------- *)
+
+(* The workset. *)
+
+(* When the algorithm is inactive, the workset is empty. *)
+
+(* Our workset is based on a Queue, but it could just as well be based on a
+   Stack. A textual replacement is possible. It could also be based on a
+   priority queue, provided a sensible way of assigning priorities could
+   be found. *)
+
+module Workset : sig
+
+  (* [insert node] inserts [node] into the workset. [node] must have no
+     successors. *)
+  val insert: node -> unit  
+
+  (* [repeat f] repeatedly applies [f] to a node extracted out of the
+     workset, until the workset becomes empty. [f] is allowed to use
+     [insert]. *)
+  val repeat: (node -> unit) -> unit
+
+  (* That's it! *)
+end 
+= struct
+
+  (* Initialize the workset. *)
+
+  let workset =
+    Queue.create()
+
+  let insert node =
+    Queue.push node workset
+
+  let repeat f =
+    while not (Queue.is_empty workset) do
+      f (Queue.pop workset)
+    done
+
+end
+
+(* -------------------------------------------------------------------------- *)
+
+(* Signals. *)
+
+(* A node in the workset has no successors. (It can have predecessors.)  In
+   other words, a predecessor (an observer) of some node is never in the
+   workset. Furthermore, a node never appears twice in the workset. *)
+
+(* When a variable broadcasts a signal, all of its predecessors (observers)
+   receive the signal. Any variable that receives the signal loses all of its
+   successors (that is, it ceases to observe anything) and is inserted into
+   the workset. This preserves the above invariant. *)
+
+let signal subject =
+  List.iter (fun observer ->
+    Graph.clear_successors observer;
+    Workset.insert observer
+  ) (Graph.predecessors subject)
+  (* At this point, [subject] has no predecessors. This plays no role in
+     the correctness proof, though. *)
+
+(* -------------------------------------------------------------------------- *)
+
+(* Tables. *)
+
+(* The permanent table maps variables that have reached a fixed point
+   to properties. It persists forever. *)
+
+let permanent : property M.t =
+  M.create()
+
+(* The transient table maps variables that have not yet reached a
+   fixed point to nodes. (A node contains not only a property, but
+   also a memoized right-hand side, and carries edges.) At the
+   beginning of a run, it is empty. It fills up during a run. At the
+   end of a run, it is copied into the permanent table and cleared. *)
+
+let transient : node M.t =
+  M.create()
+
+(* [freeze()] copies the transient table into the permanent table, and
+   empties the transient table. This allows all nodes to be reclaimed
+   by the garbage collector. *)
+
+let freeze () =
+  M.iter (fun v node ->
+    M.add v (property node) permanent
+  ) transient;
+  M.clear transient
+
+(* -------------------------------------------------------------------------- *)
+
+(* Workset processing. *)
+
+
+(* [solve node] re-evaluates the right-hand side at [node]. If this leads to
+   a change, then the current property is updated, and [node] emits a signal
+   towards its observers. *)
+
+(* When [solve node] is invoked, [node] has no subjects. Indeed, when [solve]
+   is invoked by [node_for], [node] is newly created; when [solve] is invoked by
+   [Workset.repeat], [node] has just been extracted out of the workset, and a
+   node in the workset has no subjects. *)
+
+(* [node] must not be in the workset. *)
+
+(* In short, when [solve node] is invoked, [node] is neither awake nor asleep.
+   When [solve node] finishes, [node] is either awake or asleep again. (Chances
+   are, it is asleep, unless it is its own observer; then, it is awakened by the
+   final call to [signal node].) *)
+
+let rec solve (node : node) : unit =
+
+  (* Retrieve the data record carried by this node. *)
+  let data = Graph.data node in
+
+  (* Prepare to compute an updated value at this node. This is done by
+     invoking the client's right-hand side function.  *)
+
+  (* The flag [alive] is used to prevent the client from invoking [request]
+     after this interaction phase is over. In theory, this dynamic check seems
+     required in order to argue that [request] behaves like a pure function.
+     In practice, this check is not very useful: only a bizarre client would
+     store a [request] function and invoke it after it has become stale. *)
+  let alive = ref true
+  and subjects = ref [] in
+
+  (* We supply the client with [request], a function that provides access to
+     the current valuation, and dynamically records dependencies. This yields
+     a set of dependencies that is correct by construction. *)
+  let request (v : variable) : property =
+    assert !alive;
+    try
+      M.find v permanent
+    with Not_found ->
+      let subject = node_for v in
+      let p = property subject in
+      if not (P.is_maximal p) then
+        subjects := subject :: !subjects;
+      p
+  in
+
+  (* Give control to the client. *)
+  let new_property = data.rhs request in
+
+  (* From now on, prevent any invocation of this instance of [request]
+     the client. *)
+  alive := false;
+
+  (* At this point, [node] has no subjects, as noted above. Thus, the
+     precondition of [set_successors] is met. We can install [data.subjects]
+     as the new set of subjects for this node. *)
+
+  (* If we have gathered no subjects in the list [data.subjects], then
+     this node must have stabilized. If [new_property] is maximal,
+     then this node must have stabilized. *)
+
+  (* If this node has stabilized, then it need not observe any more, so the
+     call to [set_successors] is skipped. In practice, this seems to be a
+     minor optimization. In the particular case where every node stabilizes at
+     the very first call to [rhs], this means that no edges are ever
+     built. This particular case is unlikely, as it means that we are just
+     doing memoization, not a true fixed point computation. *)
+
+  (* One could go further and note that, if this node has stabilized, then it
+     could immediately be taken out of the transient table and copied into the
+     permanent table. This would have the beneficial effect of allowing the
+     detection of further nodes that have stabilized. Furthermore, it would
+     enforce the property that no node in the transient table has a maximal
+     value, hence the call to [is_maximal] above would become useless. *)
+
+  if not (!subjects = [] || P.is_maximal new_property) then
+    Graph.set_successors node !subjects;
+
+  (* If the updated value differs from the previous value, record
+     the updated value and send a signal to all observers of [node]. *)
+  if not (P.equal data.property new_property) then begin
+    data.property <- new_property;
+    signal node
+  end
+  (* Note that equality of the two values does not imply that this node has
+     stabilized forever. *)
+
+(* -------------------------------------------------------------------------- *)
+
+(* [node_for v] returns the graph node associated with the variable [v]. It is
+   assumed that [v] does not appear in the permanent table. If [v] appears in
+   the transient table, the associated node is returned. Otherwise, [v] is a
+   newly discovered variable: a new node is created on the fly, and the
+   transient table is grown. The new node can either be inserted into the
+   workset (it is then awake) or handled immediately via a recursive call to
+   [solve] (it is then asleep, unless it observes itself). *)
+
+(* The recursive call to [solve node] can be replaced, if desired, by a call
+   to [Workset.insert node]. Using a recursive call to [solve] permits eager
+   top-down discovery of new nodes. This can save a constant factor, because
+   it allows new nodes to move directly from [bottom] to a good first
+   approximation, without sending any signals, since [node] has no observers
+   when [solve node] is invoked. In fact, if the dependency graph is acyclic,
+   the algorithm discovers nodes top-down, performs computation on the way
+   back up, and runs without ever inserting a node into the workset!
+   Unfortunately, this causes the stack to grow as deep as the longest path in
+   the dependency graph, which can blow up the stack. *)
+
+and node_for (v : variable) : node =
+  try
+    M.find v transient
+  with Not_found ->
+    let node = Graph.create { rhs = eqs v; property = P.bottom } in
+    (* Adding this node to the transient table prior to calling [solve]
+       recursively is mandatory, otherwise [solve] might loop, creating
+       an infinite number of nodes for the same variable. *)
+    M.add v node transient;
+    solve node; (* or: Workset.insert node *)
+    node
+
+(* -------------------------------------------------------------------------- *)
+
+(* Invocations of [get] trigger the fixed point computation. *)
+
+(* The flag [inactive] prevents reentrant calls by the client. *)
+
+let inactive =
+  ref true
+
+let get (v : variable) : property =
+  try
+    M.find v permanent
+  with Not_found ->
+    assert !inactive;
+    inactive := false;
+    let node = node_for v in
+    Workset.repeat solve;
+    freeze();
+    inactive := true;
+    property node
+
+(* -------------------------------------------------------------------------- *)
+
+(* Close the local module [LFP]. *)
+
+end
+in LFP.get
+
+end
diff --git a/bundles/menhirLib/menhir-20120123/src/Fix.mli b/bundles/menhirLib/menhir-20120123/src/Fix.mli
new file mode 100644 (file)
index 0000000..60344ab
--- /dev/null
@@ -0,0 +1,99 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* This code is described in the paper ``Lazy Least Fixed Points in ML''. *)
+
+(* -------------------------------------------------------------------------- *)
+
+(* Maps. *)
+
+(* We require imperative maps, that is, maps that can be updated in place.
+   An implementation of persistent maps, such as the one offered by ocaml's
+   standard library, can easily be turned into an implementation of imperative
+   maps, so this is a weak requirement. *)
+
+module type IMPERATIVE_MAPS = sig
+  type key
+  type 'data t
+  val create: unit -> 'data t
+  val clear: 'data t -> unit
+  val add: key -> 'data -> 'data t -> unit
+  val find: key -> 'data t -> 'data
+  val iter: (key -> 'data -> unit) -> 'data t -> unit
+end
+
+(* -------------------------------------------------------------------------- *)
+
+(* Properties. *)
+
+(* Properties must form a partial order, equipped with a least element, and
+   must satisfy the ascending chain condition: every monotone sequence
+   eventually stabilizes. *)
+
+(* [is_maximal] determines whether a property [p] is maximal with respect to
+   the partial order. Only a conservative check is required: in any event, it
+   is permitted for [is_maximal p] to return [false]. If [is_maximal p]
+   returns [true], then [p] must have no upper bound other than itself. In
+   particular, if properties form a lattice, then [p] must be the top
+   element. This feature, not described in the paper, enables a couple of
+   minor optimizations. *)
+
+module type PROPERTY = sig
+  type property
+  val bottom: property
+  val equal: property -> property -> bool
+  val is_maximal: property -> bool
+end
+
+(* -------------------------------------------------------------------------- *)
+
+(* The code is parametric in an implementation of maps over variables and in
+   an implementation of properties. *)
+
+module Make
+  (M : IMPERATIVE_MAPS)
+  (P : PROPERTY)
+  : sig
+    type variable = M.key
+    type property = P.property
+
+    (* A valuation is a mapping of variables to properties. *)
+    type valuation = variable -> property
+
+    (* A right-hand side, when supplied with a valuation that gives
+       meaning to its free variables, evaluates to a property. More
+       precisely, a right-hand side is a monotone function of
+       valuations to properties. *)
+    type rhs = valuation -> property
+
+    (* A system of equations is a mapping of variables to right-hand
+       sides. *)
+    type equations = variable -> rhs
+
+    (* [lfp eqs] produces the least solution of the system of monotone
+       equations [eqs]. *)
+
+    (* It is guaranteed that, for each variable [v], the application [eqs v] is
+       performed at most once (whereas the right-hand side produced by this
+       application is, in general, evaluated multiple times). This guarantee can
+       be used to perform costly pre-computation, or memory allocation, when [eqs]
+       is applied to its first argument. *)
+
+    (* When [lfp] is applied to a system of equations [eqs], it performs no
+       actual computation. It produces a valuation, [get], which represents
+       the least solution of the system of equations. The actual fixed point
+       computation takes place, on demand, when [get] is applied. *)
+    val lfp: equations -> valuation
+  end
+  
\ No newline at end of file
diff --git a/bundles/menhirLib/menhir-20120123/src/IL.mli b/bundles/menhirLib/menhir-20120123/src/IL.mli
new file mode 100644 (file)
index 0000000..69dc2f0
--- /dev/null
@@ -0,0 +1,299 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* Abstract syntax of the language used for code production. *)
+
+type program = {
+
+    (* The structure of programs is pretty ad hoc: the following components
+       must be printed in this order -- so there is no way for a module
+       definition to follow a recursive value definition, for instance.
+       This is tolerable for the time being, but may have to change in the
+       future. *)
+
+    (* Functor parameters. *)
+    paramdefs: Stretch.t list;
+
+    (* Raw Objective Caml prologue. *)
+    prologue: Stretch.t list;
+
+    (* Exception definitions. *)
+    excdefs: excdef list;
+    
+    (* Algebraic data type definitions (mutually recursive). *)
+    typedefs: typedef list;
+
+    (* Value definitions (not mutually recursive). *)
+    nonrecvaldefs: valdef list;
+
+    (* Module definitions. *)
+    moduledefs: moduledef list;
+
+    (* Function definitions (mutually recursive). *)
+    valdefs: valdef list;
+               
+    (* Raw Objective Caml postlogue. *)
+    postlogue: string list;
+
+  } 
+
+and interface = {
+
+    (* Functor parameters. *)
+    paramdecls: Stretch.t list;
+
+    (* Exception definitions. *)
+    excdecls: excdef list;
+    
+    (* Algebraic data type declarations (mutually recursive). *)
+    typedecls: typedef list;
+
+    (* Value declarations. *)
+    valdecls: (string * typescheme) list
+
+  } 
+
+and excdef = {
+
+    (* Name of the exception. *)
+    excname: string;
+
+    (* Optional equality. *)
+    exceq: string option;
+
+  }
+
+and typedef = {
+
+    (* Name of the algebraic data type. *)
+    typename: string;
+
+    (* Type parameters. This is a list of type variable names,
+       without the leading quote, which will be added by the
+       pretty-printer. *)
+    typeparams: string list;
+
+    (* Data constructors. *)
+    typerhs: typedefrhs;
+
+    (* Constraint. *)
+    typeconstraint: (typ * typ) option
+
+  } 
+
+and typedefrhs =
+  | TDefRecord of fielddef list
+  | TDefSum of datadef list
+  | TAbbrev of typ
+
+and fielddef = {
+
+    (* Whether the field is mutable. *)
+    modifiable: bool;
+
+    (* Name of the field. *)
+    fieldname: string;
+
+    (* Type of the field. *)
+    fieldtype: typescheme
+
+  }  
+
+and datadef = {
+
+    (* Name of the data constructor. *)
+    dataname: string;
+
+    (* Types of the value parameters. *)
+    datavalparams: typ list;
+
+    (* Instantiated type parameters, if this is a GADT --
+       [None] if this is an ordinary ADT. *)
+    datatypeparams: typ list option;
+
+  } 
+
+and typ =
+  
+  (* Textual Objective Caml type. *)
+  | TypTextual of Stretch.ocamltype
+
+  (* Type variable, without its leading quote. *)
+  | TypVar of string
+
+  (* Application of an algebraic data type constructor. *)
+  | TypApp of string * typ list
+
+  (* Anonymous tuple. *)
+  | TypTuple of typ list
+
+  (* Arrow type. *)
+  | TypArrow of typ * typ
+
+and typescheme = {
+
+  (* Universal quantifiers, without leading quotes. *)
+  quantifiers: string list;
+
+  (* Body. *)
+  body: typ;
+
+  } 
+
+and valdef = {
+
+  (* Whether the value is public. Public values cannot be
+     suppressed by the inliner. They serve as seeds for the
+     dead code analysis. *)
+
+  valpublic: bool;
+
+  (* Definition's left-hand side. *)
+  valpat: pattern;
+
+  (* Value to which it is bound. *)
+  valval: expr
+
+  } 
+
+and expr =
+
+  (* Variable. *)
+  | EVar of string
+
+  (* Function. *)
+  | EFun of pattern list * expr
+
+  (* Function call. *)
+  | EApp of expr * expr list
+
+  (* Local definitions. This is a nested sequence of [let]
+     definitions. *)
+  | ELet of (pattern * expr) list * expr
+
+  (* Case analysis. *)
+  | EMatch of expr * branch list
+  | EIfThen of expr * expr
+  | EIfThenElse of expr * expr * expr
+
+  (* Raising exceptions. *)
+  | ERaise of expr
+
+  (* Exception analysis. *)
+  | ETry of expr * branch list
+
+  (* Data construction. Tuples of length 1 are considered nonexistent,
+     that is, [ETuple [e]] is considered the same expression as [e]. *)
+
+  | EUnit
+  | EIntConst of int
+  | EStringConst of string
+  | EData of string * expr list
+  | ETuple of expr list
+
+  (* Type annotation. *)
+  | EAnnot of expr * typescheme
+
+  (* Cheating on the typechecker. *)
+  | EMagic of expr (* Obj.magic *)
+  | ERepr of expr  (* Obj.repr *)
+
+  (* Records. *)
+  | ERecord of (string * expr) list
+  | ERecordAccess of expr * string
+  | ERecordWrite of expr * string * expr
+
+  (* Textual Objective Caml code. *)
+  | ETextual of Stretch.t
+
+  (* Comments. *)
+  | EComment of string * expr
+  | EPatComment of string * pattern * expr
+
+  (* Arrays. *)
+  | EArray of expr list
+  | EArrayAccess of expr * expr
+
+and branch = {
+
+  (* Branch pattern. *)
+  branchpat: pattern;
+
+  (* Branch body. *)
+  branchbody: expr;
+
+  } 
+
+and pattern =
+
+  (* Wildcard. *)
+  | PWildcard
+
+  (* Variable. *)
+  | PVar of string
+
+  (* Data deconstruction. Tuples of length 1 are considered nonexistent,
+     that is, [PTuple [p]] is considered the same pattern as [p]. *)
+  | PUnit
+  | PData of string * pattern list
+  | PTuple of pattern list
+  | PRecord of (string * pattern) list
+
+  (* Disjunction. *)
+  | POr of pattern list
+
+  (* Type annotation. *)
+  | PAnnot of pattern * typ
+
+and directive =
+  | DirOpen of string
+  | DirInclude of string
+
+(* Module definitions. *)
+
+and moduledef = {
+
+  (* The name of the module that is being defined. *)
+
+  modulename: string;
+
+  (* The module expression to which it is being bound. *)
+
+  modulerhs: modexpr;
+
+}
+
+(* Module expressions. *)
+
+and modexpr =
+    | MVar of string
+    | MStruct of structure
+    | MApp of modexpr * modexpr
+
+(* Structures. This is somewhat redundant with the structure of programs,
+   but will do for now. *)
+
+and structure = {
+
+  (* Exception definitions. *)
+  struct_excdefs: excdef list;
+    
+  (* Algebraic data type definitions (mutually recursive). *)
+  struct_typedefs: typedef list;
+
+  (* Value definitions (not mutually recursive). *)
+  struct_nonrecvaldefs: valdef list;
+
+}
+
diff --git a/bundles/menhirLib/menhir-20120123/src/IO.ml b/bundles/menhirLib/menhir-20120123/src/IO.ml
new file mode 100644 (file)
index 0000000..88bcb01
--- /dev/null
@@ -0,0 +1,73 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* Input-output utilities. *)
+
+(* ------------------------------------------------------------------------- *)
+(* [exhaust channel] reads all of the data that's available on [channel]. *)
+
+let chunk_size =
+  2048
+
+let exhaust channel =
+  let buffer = Buffer.create chunk_size in
+  let chunk = String.create chunk_size in
+  let rec loop () =
+    let length = input channel chunk 0 chunk_size in
+    if length = 0 then
+      Buffer.contents buffer
+    else begin
+      Buffer.add_substring buffer chunk 0 length;
+      loop()
+    end
+  in
+  loop()
+
+(* ------------------------------------------------------------------------- *)
+(* [invoke command] invokes an external command (which expects no
+   input) and returns its output, if the command succeeds. It returns
+   [None] if the command fails. *)
+
+let invoke command =
+  let ic = Unix.open_process_in command in
+  let result = exhaust ic in
+  match Unix.close_process_in ic with
+  | Unix.WEXITED 0 ->
+      Some result
+  | _ ->
+      None
+
+(* ------------------------------------------------------------------------- *)
+(* [winvoke writers command cleaners] invokes each of the [writer]
+   functions, invokes the command [command], and runs each of the
+   [cleaner] functions. Then, it either returns the command's output,
+   if the command succeeded, or exits, otherwise. *)
+
+let winvoke writers command cleaners =
+  let call action =
+    action ()
+  in
+  List.iter call writers;
+  let output = invoke command in
+  List.iter call cleaners;
+
+  (* Stop if the command failed. Otherwise, return its output. *)
+
+  match output with
+  | None ->
+      (* Presumably, the command printed an error message for us. *)
+      exit 1
+  | Some output ->
+      output
+
diff --git a/bundles/menhirLib/menhir-20120123/src/IO.mli b/bundles/menhirLib/menhir-20120123/src/IO.mli
new file mode 100644 (file)
index 0000000..ea33afd
--- /dev/null
@@ -0,0 +1,33 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* Input-output utilities. *)
+
+(* [exhaust channel] reads all of the data that's available on [channel]. *)
+
+val exhaust: in_channel -> string
+
+(* [invoke command] invokes an external command (which expects no input)
+   and returns its output, if the command succeeds. It returns [None] if
+   the command fails. *)
+
+val invoke: string -> string option
+
+(* [winvoke writers command cleaners] invokes each of the [writer]
+   functions, invokes the command [command], and runs each of the
+   [cleaner] functions. Then, it either returns the command's output,
+   if the command succeeded, or exits, otherwise. *)
+
+val winvoke: (unit -> unit) list -> string -> (unit -> unit) list -> string
+
diff --git a/bundles/menhirLib/menhir-20120123/src/META b/bundles/menhirLib/menhir-20120123/src/META
new file mode 100644 (file)
index 0000000..cbef6fc
--- /dev/null
@@ -0,0 +1,5 @@
+requires = ""
+description = "Runtime support for code generated by Menhir"
+archive(byte) = "menhirLib.cmo"
+archive(native) = "menhirLib.cmx"
+version = "20120123"
diff --git a/bundles/menhirLib/menhir-20120123/src/Makefile b/bundles/menhirLib/menhir-20120123/src/Makefile
new file mode 100644 (file)
index 0000000..fc900fd
--- /dev/null
@@ -0,0 +1,254 @@
+.PHONY: clean
+
+COLD         += clean
+
+# ----------------------------------------------------------------------------
+
+# A few settings differ on Windows versus Unix.
+
+include ../Makefile.arch
+
+# ----------------------------------------------------------------------------
+# Locating the ocaml compilers.
+# If ocamlfind is available, then it is used for that purpose.
+
+CAMLTOP         := ocaml
+
+CAMLC           := $(shell if ocamlfind ocamlc -v >/dev/null 2>&1 ; \
+                       then echo ocamlfind ocamlc ; \
+                      elif ocamlc.opt -v >/dev/null 2>&1 ; \
+                       then echo ocamlc.opt ; \
+                      else echo ocamlc ; fi)
+
+CAMLOPT         := $(shell if ocamlfind ocamlopt -v >/dev/null 2>&1 ; \
+                       then echo ocamlfind ocamlopt ; \
+                      elif ocamlopt.opt -v >/dev/null 2>&1 ; \
+                       then echo ocamlopt.opt ; \
+                      else echo ocamlopt ; fi)
+
+CAMLDEP         := $(shell if ocamlfind ocamldep -version >/dev/null 2>&1 ; \
+                       then echo ocamlfind ocamldep ; \
+                      elif ocamldep.opt -version >/dev/null 2>&1 ; \
+                       then echo ocamldep.opt ; \
+                      else echo ocamldep ; fi)
+
+CAMLDEPWRAPPER  := ../demos/ocamldep.wrapper
+
+CAMLLEX         := ocamllex
+
+CAMLYACC        := ocamlyacc -v
+
+# -------------------------------------------------------------------------
+
+# Compilation flags.
+
+BFLAGS       := -g
+OFLAGS       := -inline 1000
+LNKBFLAGS    := -g
+LNKOFLAGS    :=
+BLIBS        := unix.cma
+OLIBS        := unix.cmxa
+PGFLAGS      := -v -lg 1 -la 1 -lc 1 --comment --infer --error-recovery --stdlib . --strict
+
+# -------------------------------------------------------------------------
+
+# A list of the source files that must be generated prior to dependency
+# analysis.
+
+GENERATED := installation.ml lexmli.ml lexer.ml parser.mli parser.ml           \
+lineCount.ml lexdep.ml sentenceParser.mli sentenceParser.ml sentenceLexer.ml
+
+# -------------------------------------------------------------------------
+
+# A list of the modules that must be linked into the MenhirLib library.
+
+# This library is used both at compile time (i.e., within Menhir itself)
+# and at run time (i.e., it is made available to Menhir users, who need
+# to link it with their own executables if they have used the --table
+# option).
+
+# If you change this list, please also update the files LICENSE and
+# GNUmakefile in the toplevel directory.
+
+LIBMODULES := infiniteArray packedIntArray rowDisplacement engineTypes \
+engine tableFormat tableInterpreter convert
+
+# -------------------------------------------------------------------------
+
+# A list of the modules that must be linked into the Menhir executable.
+
+MODULES := menhirLib Fix stringSet stringMap mark compressedBitSet     \
+           unionFind tarjan nonpositiveCycles patricia misc option     \
+           breadth listMonad dot installation version settings time    \
+           positions error parameters keyword lineCount printer                \
+           rawPrinter action parserAux parser lexer partialGrammar     \
+           parameterizedGrammar reachability unparameterizedPrinter    \
+           preFront codeBits tokenType interface IO lexmli lexdep      \
+           infer nonTerminalDefinitionInlining front grammar item lr0  \
+           slr lr1 lr1partial derivation conflict invariant codePieces \
+           sentenceParser sentenceLexer pprint cst                     \
+           referenceInterpreter interpret tableBackend codeBackend     \
+           coqBackend traverse inliner back
+
+# -------------------------------------------------------------------------
+
+# How to bootstrap.
+
+# Set TARGET to byte or opt depending on the desired architecture.
+
+ifndef TARGET
+  TARGET     := opt
+endif
+
+# The variable GOAL is the name of the executable file.
+
+GOAL         := menhir.$(TARGET)
+
+# We create a symbolic link of GOAL to MENHIREXE.
+
+$(MENHIREXE): .versioncheck
+# Build a stage one executable using ocamlyacc.
+       $(MAKE) -s PGEN="$(CAMLYACC)" PARSER=parser $(GOAL)
+# Remove the ocamlyacc-built parser.
+       @/bin/rm -f parser.ml parser.mli
+# Build a stage two executable using the stage one executable (which is overwritten).
+       $(MAKE) -s PGEN="./$(GOAL) $(PGFLAGS)" PARSER=fancy-parser $(GOAL)
+# Create a stage three parser and make sure that it is identical.
+       @./$(GOAL) $(PGFLAGS) -b reference fancy-parser.mly 2>/dev/null
+       @if diff parser.mli reference.mli 2>&1 >/dev/null ; then \
+         if diff parser.ml reference.ml 2>&1 >/dev/null ; then \
+           echo "Bootstrap successful." ; \
+         else \
+           echo "Bootstrap FAILED: the implementation files differ." && false ; \
+          fi ; \
+       else \
+         echo "Bootstrap FAILED: the interface files differ." && false ; \
+       fi
+       @rm -f reference.ml reference.mli
+# Rename the stage two executable to the desired name.
+# Use a symbolic link, so that further development builds implicitly update
+# menhir.
+       @ln -sf $(GOAL) $@
+
+# -------------------------------------------------------------------------
+
+# Linking.
+
+menhirLib.cmo menhirLib.cmi: $(LIBMODULES:=.cmo)
+       $(CAMLC) $(BFLAGS) -pack -o menhirLib.cmo $^
+
+menhirLib.cmx menhirLib.o: $(LIBMODULES:=.cmx)
+       $(CAMLOPT) -pack -o menhirLib.cmx $^
+
+menhir.byte: $(MODULES:=.cmo)
+       $(CAMLC) -o $@ $(LNKBFLAGS) $(BLIBS) $^
+
+menhir.opt: $(MODULES:=.cmx)
+       $(CAMLOPT) -o $@ $(LNKOFLAGS) $(OLIBS) $^
+
+# -------------------------------------------------------------------------
+
+# Computing dependencies. This can be done in a simple way, even though
+# we exploit --infer, because we compile in two stages. Not a good example
+# of how to do it yourself -- have a look at demos/Makefile.shared.
+
+# For completeness, we must force ocamldep to understand that MenhirLib
+# is a module name. We do this by creating phantom source files for it.
+
+.depend: $(wildcard *.ml *.mli) $(GENERATED)
+       @/bin/rm -f .depend
+       for i in *.ml *.mli; do \
+           $(CAMLDEPWRAPPER) menhirLib.ml menhirLib.mli - $(CAMLDEP) $$i \
+        >> $@; \
+       done
+
+ifeq ($(findstring $(MAKECMDGOALS),$(COLD)),)
+-include .depend
+endif
+
+# -------------------------------------------------------------------------
+
+# Cleaning up.
+
+clean::
+       /bin/rm -f menhir.byte menhir.opt $(MENHIREXE)
+       /bin/rm -f *.cmi *.cmx *.cmo *.$(OBJ) *~ .*~
+       /bin/rm -f reference.ml reference.mli $(GENERATED)
+       /bin/rm -f .depend *.conflicts *.automaton *.annot *.output
+
+# -------------------------------------------------------------------------
+
+# Compiling. The parser source is found in $(PARSER).mly and is
+# processed using $(PGEN).
+
+# These two default definitions really shouldn't be necessary, but
+# there are corner cases where they are needed (e.g. when make is
+# invoked without a target and the .depend file is regenerated).
+
+ifndef PGEN
+  PGEN       := $(CAMLYACC)
+endif
+ifndef PARSER
+  PARSER     := parser
+endif
+
+%.cmi: %.mli
+       $(CAMLC) $(BFLAGS) -c $<
+
+%.cmo: %.ml
+       $(CAMLC) $(BFLAGS) -c $<
+
+# If the module that is being compiled is part of MenhirLib, add the
+# -for-pack option to the command line. This is required only when
+# compiling to native code (the bytecode compiler accepts but ignores
+# this option).
+
+PACK = $(shell if echo $(LIBMODULES) | grep $* >/dev/null ; then echo -for-pack MenhirLib ; else echo ; fi)
+
+%.cmx %.o: %.ml
+       $(CAMLOPT) $(OFLAGS) $(PACK) -c $<
+
+# The source file for this parser varies. It is either parser.mly or
+# fancy-parser.mly.
+#
+parser.ml parser.mli: $(PARSER).mly
+       @/bin/rm -f parser.ml parser.mli
+       $(PGEN) -b parser $<
+
+# This parser must be built with ocamlyacc, because its client
+# watches for Parsing.Parse_error!
+#
+# Using ocamlyacc or Menhir interchangeably would be possible,
+# via an ocamlyacc wrapper that adds the definition "exception
+# Error = Parsing.Parse_error" at the end of the generated .ml
+# and .mli files.
+#
+sentenceParser.ml sentenceParser.mli : sentenceParser.mly
+       @/bin/rm -f sentenceParser.ml sentenceParser.mli
+       $(CAMLYACC) -b sentenceParser $<
+
+%.ml: %.mll
+       @/bin/rm -f $@
+       $(CAMLLEX) $<
+
+# ----------------------------------------------------------------------------
+# Checking the version of the ocaml compiler.
+#
+# We check the bytecode compiler only, because some architectures don't have
+# the native code compiler. We assume that both compilers, if present, are in
+# sync.
+
+# We build a bytecode executable (rather than use the toplevel loop) because
+# we need to load str.cma and some ocaml ports do not support dynamic loading
+# (e.g. ocaml 3.09, MacOS/Intel).
+
+.versioncheck:
+       @ echo Checking that Objective Caml is recent enough...
+       @ $(CAMLC) -o check-ocaml-version str.cma checkOCamlVersion.ml
+       @ ./check-ocaml-version --verbose --gt "3.09"
+       @ rm check-ocaml-version
+       @ touch .versioncheck
+
+clean::
+       rm -f .versioncheck
+
diff --git a/bundles/menhirLib/menhir-20120123/src/action.ml b/bundles/menhirLib/menhir-20120123/src/action.ml
new file mode 100644 (file)
index 0000000..f0fb727
--- /dev/null
@@ -0,0 +1,224 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* $Id: action.ml,v 1.10 2006/06/26 09:41:33 regisgia Exp $ *)
+
+open Keyword
+
+type t = 
+    {
+      expr     : IL.expr;
+      keywords  : Keyword.KeywordSet.t;
+      filenames : string list;
+      pkeywords : Keyword.keyword Positions.located list
+    }
+
+let from_stretch s = 
+  { 
+    expr      = IL.ETextual s;
+    filenames = [ s.Stretch.stretch_filename ];
+    keywords  = Keyword.KeywordSet.from_list (List.map Positions.value s.Stretch.stretch_keywords);
+    pkeywords = s.Stretch.stretch_keywords;
+  }
+
+let parenthesize s = 
+  if String.length s < 2 || s.[0] <> '(' || s.[String.length s - 1] <> ')' then
+    "(" ^ s ^ ")"
+  else 
+    s
+
+let rec parenthesize_stretch = function
+  | IL.ETextual s ->
+      IL.ETextual { s with Stretch.stretch_raw_content = parenthesize s.Stretch.stretch_raw_content }
+  | IL.ELet (es, e) ->
+      IL.ELet (List.map (fun (p, e) -> (p, parenthesize_stretch e)) es, parenthesize_stretch e)
+  | x -> x
+
+let compose x a1 a2 = 
+  {
+    expr      = IL.ELet ([ IL.PVar x, parenthesize_stretch a1.expr ], a2.expr);
+    keywords  = Keyword.KeywordSet.union a1.keywords a2.keywords;
+    filenames = a1.filenames @ a2.filenames;
+    pkeywords = a1.pkeywords @ a2.pkeywords;
+  }
+
+let rename_inlined_psym (psym, first_prod, last_prod) phi l =
+  List.fold_left
+    (fun (l, phi, (used1, used2)) pk ->
+       match pk.Positions.value with
+        | Position (subject, where, flavor) ->
+            let (subject', where'), (used1, used2) = 
+              match subject, where with
+                | RightNamed s, w  -> 
+                    (* In the host rule, $startpos(x) is changed 
+                       to $startpos(first_prod) (same thing for $endpos). *)
+                    if s = psym then
+                      match w with
+                        | WhereStart -> first_prod, (true, used2)
+                        | WhereEnd -> last_prod, (used1, true)
+                    else 
+                      (* Otherwise, we just that the renaming into account. *)
+                      let s' = try 
+                        List.assoc s phi
+                      with Not_found -> s 
+                      in
+                        (RightNamed s', w), (used1, used2)
+                | _ -> (subject, where), (used1, used2)
+            in
+            let from_pos = Keyword.posvar subject where flavor
+            and to_pos = Keyword.posvar subject' where' flavor in
+              (Positions.with_pos pk.Positions.position 
+                 (Position (subject', where', flavor)) :: l,
+               (if from_pos <> to_pos && not (List.mem_assoc from_pos phi) then 
+                  (from_pos, to_pos) :: phi else phi),
+               (used1, used2))
+
+        | _ -> pk :: l, phi, (used1, used2)
+    )
+    ([], phi, (false, false)) l
+
+(* Rename the keywords related to position to handle the composition
+   of semantic actions during non terminal inlining. 
+
+   The first argument describes the context: 
+   - [first_prod] is the first producer that starts the action's rule.
+   - [last_prod] is the last one.
+   For instance, if %inline rule r is A -> B C and rule r' is D -> E A F,
+   then [first_prod] is B and [last_prod] is C. 
+   If r is A -> and r' is unchanged. [first_prod] is E and [last_prod] is F.
+   - [psym] is the producer that is being inlined.
+   
+*)
+let rename_pkeywords (psym, first_prod, last_prod) phi l = 
+  List.fold_left (fun (l, phi, (used1, used2)) pk -> match pk.Positions.value with
+           | Position (subject, where, flavor) ->
+               let (subject', where'), (used1, used2) = 
+                 match subject, where with
+                     (* $startpos is changed to $startpos(first_prod) in the 
+                        inlined rule. *)
+                   | Left, WhereStart -> first_prod, (true, used2)
+                     (* Similarly for $endpos. *)
+                   | Left, WhereEnd   -> last_prod, (used1, true)
+                     (* $i cannot be combined with inlining. *)
+                   | RightDollar i, w -> assert false
+                   | RightNamed s, w  -> 
+                       (* In the host rule, $startpos(x) is changed to 
+                          to $startpos(first_prod) (same thing for $endpos). *)
+                       if s = psym then
+                         match w with
+                           | WhereStart -> first_prod, (true, used2)
+                           | WhereEnd -> last_prod, (used1, true)
+                       else 
+                         (* Otherwise, we just that the renaming into account. *)
+                         let s' = try List.assoc s phi with Not_found -> s in
+                           (RightNamed s', w), (used1, used2)
+               in
+               let from_pos = Keyword.posvar subject where flavor
+               and to_pos = Keyword.posvar subject' where' flavor in
+                 (Positions.with_pos pk.Positions.position 
+                    (Position (subject', where', flavor)) :: l,
+                  (if from_pos <> to_pos && not (List.mem_assoc from_pos phi) then 
+                     (from_pos, to_pos) :: phi else phi), 
+                  (used1, used2))
+
+           | x -> pk :: l, phi, (used1, used2))
+
+    ([], phi, (false, false)) l
+               
+let rename renaming_fun renaming_env phi a = 
+  let pkeywords, phi, used_fg = renaming_fun renaming_env phi a.pkeywords in
+  { a with 
+      (* We use the let construct to rename without modification of the semantic
+        action code. *)
+      expr = 
+      IL.ELet (List.map (fun (x, x') -> (IL.PVar x, IL.EVar x')) phi, 
+              a.expr);
+
+      (* Keywords related to positions are updated too. *)
+      keywords = 
+      List.fold_left 
+       (fun acu pk -> Keyword.KeywordSet.add pk.Positions.value acu) 
+       Keyword.KeywordSet.empty
+       pkeywords;
+
+      pkeywords = pkeywords
+  }, used_fg
+
+let rename_inlined_psym =
+  rename rename_inlined_psym
+
+let rename =
+  rename rename_pkeywords
+
+let to_il_expr action = 
+  action.expr
+
+let filenames action = 
+  action.filenames
+
+let keywords action = 
+  action.keywords
+
+let pkeywords action = 
+  action.pkeywords
+
+let rec print f action = 
+  let module P = Printer.Make (struct let f = f 
+                                     let locate_stretches = None 
+                                     let raw_stretch_action = true
+                              end) 
+  in
+    P.expr action.expr
+
+let has_previouserror action =
+  KeywordSet.mem PreviousError (keywords action)
+
+let has_syntaxerror action =
+  KeywordSet.mem SyntaxError (keywords action)
+
+let has_leftstart action =
+  KeywordSet.exists (function
+    | Position (Left, WhereStart, _) ->
+       true
+    | _ ->
+       false
+  ) (keywords action)
+
+let has_leftend action =
+  KeywordSet.exists (function
+    | Position (Left, WhereEnd, _) ->
+       true
+    | _ ->
+       false
+  ) (keywords action)
+
+let has_dollar i action =
+  KeywordSet.exists (function
+    | Dollar j when i = j ->
+       true
+    | _ ->
+       false
+  ) (keywords action)
+
+let use_dollar action = 
+  KeywordSet.exists (function
+    | Dollar _ ->
+       true
+    | _ ->
+       false
+  ) (keywords action)
+    
+    
+
+
diff --git a/bundles/menhirLib/menhir-20120123/src/action.mli b/bundles/menhirLib/menhir-20120123/src/action.mli
new file mode 100644 (file)
index 0000000..1023851
--- /dev/null
@@ -0,0 +1,78 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* $Id: action.mli,v 1.8 2006/06/26 09:41:33 regisgia Exp $ *)
+
+(** Semantic action's type. *)
+type t
+
+(** [compose x a1 a2] builds the action [let x = a1 in a2]. This
+    feature is used during the processing of the %inline keyword. *)
+val compose : string -> t -> t -> t
+
+(** [rename renaming_env phi a] builds the action
+    [let x1 = x1' and ... xn = xn' in a] if [phi] is [(x1, x1') ... (xn, xn')].
+    Moreover, [renaming_env] is used to correctly replace $startpos/$endpos
+    present in the semantic action. *)
+val rename:
+  string * (Keyword.subject * Keyword.where) * (Keyword.subject * Keyword.where)
+  -> (string * string) list -> t -> t * (bool * bool)
+
+(** [rename_inlined_psym renaming_env phi a] updates the occurrences of the
+    inlined non terminal in the action [a].
+*)
+val rename_inlined_psym:
+  string * (Keyword.subject * Keyword.where) * (Keyword.subject * Keyword.where)
+  -> (string * string) list -> t -> t * (bool * bool)
+
+(** Semantic actions are translated into [IL] code using the
+    [IL.ETextual] and [IL.ELet] constructors. *)
+val to_il_expr: t -> IL.expr
+
+(** A semantic action might be the inlining of several others. The
+    filenames of the different parts are given by [filenames a]. This
+    can be used, for instance, to check whether all parts come from
+    the standard library. *)
+val filenames: t -> string list
+
+(** [pkeywords a] returns a list of all keyword occurrences in [a]. *)
+val pkeywords: t -> Keyword.keyword Positions.located list
+
+(** [keywords a] is the set of keywords used in the semantic action [a]. *)
+val keywords: t -> Keyword.KeywordSet.t
+
+(** [print f a] prints [a] to channel [f]. *)
+val print: out_channel -> t -> unit
+
+(** [from_stretch s] builds an action out of a textual piece of code. *)
+val from_stretch: Stretch.t -> t
+
+(** Check whether the keyword $previouserror is used in the action. *)
+val has_previouserror: t -> bool
+
+(** Check whether the keyword $syntaxerror is used in the action. *)
+val has_syntaxerror: t -> bool
+
+(** Check whether the keyword $start is used in the action. *)
+val has_leftstart: t -> bool
+
+(** Check whether the keyword $end is used in the action. *)
+val has_leftend: t -> bool
+
+(** Check whether a particular $i keyword is used in the action. *)
+val has_dollar: int -> t -> bool
+
+(** Check whether any $i keyword is used in the action. *)
+val use_dollar: t -> bool
+
diff --git a/bundles/menhirLib/menhir-20120123/src/back.ml b/bundles/menhirLib/menhir-20120123/src/back.ml
new file mode 100644 (file)
index 0000000..ac17f3b
--- /dev/null
@@ -0,0 +1,67 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* Driver for the back-end. *)
+
+open UnparameterizedSyntax
+
+(* Define an .ml file writer . *)
+
+let write program =
+  let module P = Printer.Make (struct
+    let filename = Settings.base ^ ".ml"
+    let f = open_out filename
+    let locate_stretches =
+      if Settings.infer then
+       (* Typechecking should not fail at this stage. Omit #line directives. *)
+       None
+      else
+       (* 2011/10/19: do not use [Filename.basename]. The [#] annotations that
+          we insert in the [.ml] file must retain their full path. This does
+          mean that the [#] annotations depend on how menhir is invoked -- e.g.
+          [menhir foo/bar.mly] and [cd foo && menhir bar.mly] will produce
+          different files. Nevertheless, this seems useful/reasonable. *)
+       Some filename
+    let raw_stretch_action = false
+  end) in
+  P.program program
+
+(* Construct the code, using either the table-based or the code-based
+   back-end, and pass it on to the printer. (This continuation-passing
+   style is imposed by the fact that there is no conditional in ocaml's
+   module language.) *)
+
+let () =
+  if Settings.coq then
+    let module B = CoqBackend.Run (struct end) in
+    let filename = Settings.base ^ ".v" in
+    let f = open_out filename in
+    B.write_all f;
+    exit 0
+  else
+    if Settings.table then
+      let module B = TableBackend.Run (struct end) in
+      write B.program
+    else
+      let module B = CodeBackend.Run (struct end) in
+      write (Inliner.inline B.program)
+
+(* Write the interface file. *)
+
+let () =
+  Interface.write()
+
+let () =
+  Time.tick "Printing"
+
diff --git a/bundles/menhirLib/menhir-20120123/src/back.mli b/bundles/menhirLib/menhir-20120123/src/back.mli
new file mode 100644 (file)
index 0000000..38ad0f7
--- /dev/null
@@ -0,0 +1,17 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* This module drives the back-end. No functionality is offered by
+   this module. *)
+
diff --git a/bundles/menhirLib/menhir-20120123/src/breadth.ml b/bundles/menhirLib/menhir-20120123/src/breadth.ml
new file mode 100644 (file)
index 0000000..6b3958b
--- /dev/null
@@ -0,0 +1,76 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* This module implements generic breadth-first search
+   over a graph with labeled edges. *)
+
+module Make (G : sig
+
+  (* This is the type of graph vertices. *)
+
+  type vertex
+
+  (* This is the type of graph labels. *)
+
+  type label
+
+  (* These allow marking a vertex and checking whether
+     it is marked. *)
+
+  val set_mark: vertex -> Mark.t -> unit
+  val get_mark: vertex -> Mark.t
+
+  (* This is an iterator over the graph's entry vertices. *)
+
+  val entry: (vertex -> unit) -> unit
+
+  (* This provides access to a vertex' successors. *)
+
+  val successors: (label -> vertex -> unit) -> vertex -> unit
+
+end) = struct
+
+  let search f =
+
+    let queue : G.vertex Queue.t =
+      Queue.create ()
+
+    and mark =
+      Mark.fresh()
+
+    in
+
+    let visited vertex =
+      Mark.same mark (G.get_mark vertex)
+
+    and visit vertex =
+      G.set_mark vertex mark;
+      Queue.add vertex queue
+
+    in
+
+    G.entry visit;
+    Misc.qiter (fun vertex ->
+      G.successors (fun label son ->
+       if not (visited son) then begin
+         visit son;
+         f true vertex label son
+       end
+       else
+         f false vertex label son
+      ) vertex
+    ) queue
+
+end
+
diff --git a/bundles/menhirLib/menhir-20120123/src/breadth.mli b/bundles/menhirLib/menhir-20120123/src/breadth.mli
new file mode 100644 (file)
index 0000000..c813a9e
--- /dev/null
@@ -0,0 +1,53 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* This module implements generic breadth-first search
+   over a graph with labeled edges. *)
+
+module Make (G : sig
+
+  (* This is the type of graph vertices. *)
+
+  type vertex
+
+  (* This is the type of graph labels. *)
+
+  type label
+
+  (* These allow marking a vertex and checking whether
+     it is marked. *)
+
+  val set_mark: vertex -> Mark.t -> unit
+  val get_mark: vertex -> Mark.t
+
+  (* This is an iterator over the graph's entry vertices. *)
+
+  val entry: (vertex -> unit) -> unit
+
+  (* This provides access to a vertex' successors. *)
+
+  val successors: (label -> vertex -> unit) -> vertex -> unit
+
+end) : sig
+
+  (* [search f] invokes [f discovery v label v'] once for every edge
+     from vertex [v] to vertex [v'] carrying label [label]. Vertices
+     [v'] are presented breadth-first. The flag [discovery] tells
+     whether the edge is a discovery edge, that is, whether it belongs
+     to the spanning forest of shortest paths that is being built. *)
+
+  val search: (bool -> G.vertex -> G.label -> G.vertex -> unit) -> unit
+
+end
+
diff --git a/bundles/menhirLib/menhir-20120123/src/checkOCamlVersion.ml b/bundles/menhirLib/menhir-20120123/src/checkOCamlVersion.ml
new file mode 100644 (file)
index 0000000..fa23015
--- /dev/null
@@ -0,0 +1,125 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* $Id $*)
+(* This module parses ocaml version and confronts it with a user-provided
+   version. *)
+
+(* According to OCaml's manual, the Sys.ocaml_version value follows the
+   regexp [version_regexp].
+*)
+let mnum = "\\([0-9]+\\)"
+
+(* version = major.minor[.patchlevel][+additional-info]. *)
+let version_regexp = 
+  Str.regexp 
+    (Printf.sprintf "%s\\.%s\\(\\.%s\\)?\\(\\+\\(.+\\)\\)?" mnum mnum mnum)
+
+let must field = function
+  | None -> failwith (Printf.sprintf "\"%s\" field is undefined." field)
+  | Some s -> s
+
+let as_int s = 
+  try
+    int_of_string s
+  with Failure _ ->
+    Printf.eprintf "Invalid number '%s'\n" s;
+    exit 1
+
+let parse_version version =
+  let get i = 
+    try
+      Some (Str.matched_group i version)
+    with Not_found ->
+      None
+  in
+    if Str.string_match version_regexp version 0 then (
+      as_int (must "major" (get 1)), 
+      as_int (must "minor" (get 2)), 
+      get 4, get 6
+    ) else
+      begin
+       Printf.eprintf "Failed to retrieve ocaml version.\n";
+       exit 1
+      end
+
+(* The user can compare its version with three different orderings:
+   - eq means major and minor numbers are equal ;
+   - eq-strict means that even the patchlevel and the additional information
+     are equal ;
+   - lt means that ocaml version is older that the user-provided version ;
+   - gt means that ocaml version is newer that the user-provided version. *)
+let eq, eq_strict, gt, lt = ref false, ref false, ref false, ref false
+
+let verbose = ref false
+
+let options = Arg.align
+  [
+    "--eq", Arg.Set eq, " Is the version equal to <version> ?";
+    "--eq-strict", Arg.Set eq_strict, 
+    " Is the version strictly equal to <version> ? \
+      (taking into account patchlevel and additional information)";
+    "--gt", Arg.Set gt, " Is the version newer than <version> ? (default)";
+    "--lt", Arg.Set lt, " Is the version older than <version> ?";
+    "--verbose", Arg.Set verbose, " Show version."
+  ]
+  
+let usage = "check-ocaml-version [options] <version>\n"
+
+let version = ref None
+
+let set_version s = 
+  version := Some s
+
+let _ =
+  Arg.parse options set_version usage
+
+let compare, compare_str, strict = 
+  match !eq, !gt, !lt with
+    | true, false, false -> ( = ) , "", !eq_strict
+    | false, true, false -> ( >= ), "or greater ", false
+    | false, false, true -> ( <= ), "or lesser ", false
+    | false, false, false -> (Printf.printf "%s\n%!" Sys.ocaml_version; exit 1)
+    | _ -> failwith "(eq|gt|lt) flags must be used independently"
+
+let compare_version (major, minor, p, a) (major', minor', p', a') =
+  if major = major' then 
+    if minor = minor' then
+      if strict then
+       (p = p') && (a = a')
+      else true
+    else compare minor minor'
+  else 
+    compare major major' 
+
+let _ =
+
+  match !version with
+    | None ->
+       Printf.printf "%s\n%!" Sys.ocaml_version
+
+    | Some version ->
+       let ov = parse_version Sys.ocaml_version 
+       and uv = parse_version version in
+       if compare_version ov uv then begin
+         if !verbose then
+           Printf.printf "Version %s is OK.\n%!" Sys.ocaml_version;
+         exit 0
+       end
+       else begin
+         if !verbose then
+           Printf.printf "%s is NOT OK: version %s %swas required.%!\n" Sys.ocaml_version version compare_str;
+         exit 1
+       end
+
diff --git a/bundles/menhirLib/menhir-20120123/src/codeBackend.ml b/bundles/menhirLib/menhir-20120123/src/codeBackend.ml
new file mode 100644 (file)
index 0000000..33dd3be
--- /dev/null
@@ -0,0 +1,1893 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* The code generator. *)
+
+(* TEMPORARY env.startp seems to be always equal to env.lexbuf.lex_start_p,
+   and similarly for env.endp. Is there a point to copying these
+   positions to the env record? Maybe just making these positions
+   accessible via a single indirection, instead of two? I forget. *)
+
+module Run (T : sig end) = struct
+
+open Grammar
+open IL
+open CodeBits
+open CodePieces
+open TokenType
+open Interface
+
+(* ------------------------------------------------------------------------ *)
+(* Here is a description of our code generation mechanism.
+
+   Every internal function that we produce is parameterized by the
+   parser environment [env], which contains (pointers to) the lexer,
+   the lexing buffer, the last token read, etc. No global variables
+   are exploited, so our parsers are reentrant. The functions that we
+   export do not expect an environment as a parameter; they create a
+   fresh one when invoked.
+
+   Every state [s] is translated to a [run] function and an [action]
+   function. To a first approximation, the only parameter of the [run]
+   function, besides [env], is the stack. However, in some cases
+   (consult the predicate [runpushes]), the top stack cell is not yet
+   allocated when [run s] is called. The cell's contents are passed as
+   extra parameters, and it is [run]'s responsibility to allocate that
+   cell.
+
+   (When [run] is the target of a shift transition, the position
+   parameters [startp] and [endp] are redundant with the [env]
+   parameter, because they are always equal to [env.startp] and
+   [env.endp]. However, this does not appear to make a great
+   difference in terms of code size, and makes our life easier, so we
+   do not attempt to eliminate this redundancy.)
+
+   The first thing in [run] is to discard a token, if the state was
+   entered through a shift transition, and to peek at the lookahead
+   token. When the current token is to be discarded, the [discard]
+   function is invoked. It discards the current token, invokes the
+   lexer to obtain a new token, and returns the latter. When we only
+   wish to peek at the current token, without discarding it, we simply
+   read [env.token]. (We have to be careful in cases where the current
+   lookahead token might be [error], since, in those cases,
+   [env.token] is meaningless; see below.)
+
+   Once the lookahead token is obtained, [run] calls [action]. The
+   parameters of [action] are the stack and the lookahead token.
+
+   [action] performs a case analysis of the lookahead token. Each
+   branch performs one of the following. In shift branches, control is
+   dispatched to another [run] function, with appropriate parameters,
+   typically the current stack plus the information that should go
+   into the new top stack cell (a state, a semantic value, locations).
+   In reduce branches, a [reduce] function is invoked. In the default
+   branch, error handling is initiated (see below).
+
+   The [reduce] function associated with production [prod] pops as
+   many stack cells as necessary, retrieving semantic values and the
+   state [s] that initiated the reduction. It then evaluates the
+   semantic action, which yields a new semantic value. (This is the
+   only place where semantic actions are evaluated, so that semantic
+   actions are never duplicated.) It then passes control on to the
+   [goto] function associated with the nonterminal [nt], where [nt]
+   is the left-hand side of the production [prod].
+
+   The [goto] function associated with nonterminal [nt] expects just
+   one parameter besides the environment -- namely, the
+   stack. However, in some cases (consult the predicate [gotopushes]),
+   the top stack cell is not allocated yet, so its contents are passed
+   as extra parameters. In that case, [goto] first allocates that
+   cell. Then, it examines the state found in that cell and performs a
+   goto transition, that is, a shift transition on the nonterminal
+   symbol [nt]. This simply consists in passing control to the [run]
+   function associated with the transition's target state. If this
+   case analysis only has one branch, because all transitions for [nt]
+   lead to the same target state, then no case analysis is required.
+
+   In principle, a stack cell contains a state, a semantic value, and
+   start and end positions. However, the state can be omitted if it is
+   never consulted by a [goto] function. The semantic value can be
+   omitted if it is associated with a token that was declared not to
+   carry a semantic value. (One could also omit semantic values for
+   nonterminals whose type was declared to be [unit], but that does
+   not seem very useful.) The start or end position can be omitted if
+   they are associated with a symbol that does not require keeping
+   track of positions. When all components of a stack cell are
+   omitted, the entire cell disappears, so that no memory allocation
+   is required.
+
+   For each start symbol [nt], an entry point function, named after
+   [nt], is generated. Its parameters are a lexer and a lexing buffer.
+   The function allocates and initializes a parser environment and
+   transfers control to the appropriate [run] function.
+
+   Our functions are grouped into one huge [let rec] definition. The
+   inliner, implemented as a separate module, will inline functions
+   that are called at most once, remove dead code (although there
+   should be none or next to none), and possibly perform other
+   transformations.
+
+   I note that, if a state can be entered only through (nondefault)
+   reductions, then, in that state, the lookahead token must be a
+   member of the set of tokens that allow these reductions, and by
+   construction, there must exist an action on that token in that
+   state. Thus, the default branch (which signals an error when
+   the lookahead token is not a member of the expected set) is in
+   fact dead. It would be nice (but difficult) to exploit types
+   to prove that. However, one could at least replace the code of
+   that branch with a simple [assert false]. TEMPORARY do it *)
+
+(* ------------------------------------------------------------------------ *)
+(* Here is a description of our error recovery mechanism.
+
+   With every state [s], we associate an [error] function.
+
+   If [s] is willing to act when the lookahead token is [error], then
+   this function tells how. This includes *both* shift *and* reduce
+   actions. (For some reason, yacc/ocamlyacc/mule/bison can only shift
+   on [error].)
+
+   If [s] is unable to act when the lookahead token is [error], then
+   this function pops a stack cell, extracts a state [s'] out of it,
+   and transfers control, via a global [errorcase] dispatch function,
+   to the [error] function associated with [s']. (Because some stack
+   cells do not physically hold a state, this description is somewhat
+   simpler than the truth, but that's the idea.)
+
+   When an error is detected in state [s], one of two things happens
+   (see [initiate]).
+
+      a. If [s] can do error recovery and if no token was successfully
+         shifted since the last [error] token was shifted, then the
+         current token is discarded and the current state remains
+         unchanged, that is, the [action] function associated with [s]
+         is re-entered.
+
+      b. Otherwise, the [error] function associated with [s] is
+         invoked.
+
+   In case (b), immediately before invoking the [error] function, the
+   counter [env.shifted] is reset to -1. By convention, this means
+   that the current token is discarded and replaced with an [error]
+   token. The [error] token transparently inherits the positions
+   associated with the underlying concrete token.
+
+   Whenever we attempt to consult the current token, we check whether
+   [env.shifted] is -1 and, if that is the case, resume error handling
+   by calling the [error] function associated with the current state.
+   This allows a series of reductions to correctly take place when the
+   lookahead token is [error]. In many states, though, it is possible
+   to statically prove that [env.shifted] cannot be -1. In that case,
+   we produce a lookup of [env.token] without checking [env.shifted].
+
+   The counter [env.shifted] is incremented when a token is
+   shifted. In particular, immediately after the [error] token is
+   shifted, [env.shifted] is zero. The increment is conditional, so as
+   to avoid overflow. It is performed inside [discard].
+
+   States with default reductions perform a reduction regardless of
+   the current lookahead token, which can be either [error] or a
+   regular token.
+
+   A question that bothered me for a while was, when unwinding the
+   stack, do we stop at a state that has a default reduction? Should
+   it be considered able to handle the error token? I now believe that
+   the answer is, this cannot happen. Indeed, if a state has a default
+   reduction, then, whenever it is entered, reduction is performed and
+   that state is exited, which means that it is never pushed onto the
+   stack. So, it is fine to consider that a state with a default
+   reduction is unable to handle errors.
+
+   I note that a state that can handle [error] and has a default
+   reduction must in fact have a reduction action on [error].
+
+   A state that can perform error recovery (that is, a state whose
+   incoming symbol is [error]) never performs a default reduction. The
+   reason why this is so is given in [Invariant]. A consequence of
+   this decision is that reduction is not performed until error
+   recovery is successful. This behavior could be surprising if it
+   were the default behavior; however, recall that error recovery is
+   disabled unless [--error-recovery] was specified.
+
+   When an error is detected and an error production is reduced, the
+   user might like to know how recent the previous error was, so as
+   (for instance) to suppress diagnostic messages if it was too
+   recent. (yacc and ocamlyacc have their own, hard-wired,
+   idiosyncratic mechanism for that.) We provide access to this
+   information as follows. When a new error is detected and
+   [env.shifted] is set to -1, the previous value of [env.shifted] is
+   saved to [env.previouserror]. Thus, the number of tokens that were
+   shifted between the two errors is recorded. This information is
+   then made available to the user via the $previouserror keyword.
+
+   I note that error recovery, case (a) above, can cause the parser to
+   enter an infinite loop.  Indeed, the token stream is in principle
+   infinite -- for instance, many lexers will return an EOF token
+   forever after some finite supply of tokens has been exhausted. If
+   we hit EOF while in error recovery mode, and if EOF is not accepted
+   at the current state, we will keep discarding EOF and asking for a
+   new token. The way out of this situation is to design the grammar
+   in such a way that it cannot happen. We provide a warning to help
+   with this task. *)
+
+(* The type of environments. *)
+
+let tcenv =
+  env
+
+let tenv =
+  TypApp (tcenv, [])
+
+(* The [assertfalse] function. We have just one of these, in order to
+   save code size. It should become unnecessary when we add GADTs. *)
+
+let assertfalse =
+  prefix "fail"
+
+(* The [discard] function. *)
+
+let discard =
+  prefix "discard"
+
+(* The [initenv] function. *)
+
+let initenv =
+  prefix "init"
+
+(* The [run] function associated with a state [s]. *)
+
+let run s =
+  prefix (Printf.sprintf "run%d" (Lr1.number s))
+
+(* The [action] function associated with a state [s]. *)
+
+let action s =
+  prefix (Printf.sprintf "action%d" (Lr1.number s))
+
+(* The [goto] function associated with a nonterminal [nt]. *)
+
+let goto nt =
+  prefix (Printf.sprintf "goto_%s" (Nonterminal.print true nt))
+
+(* The [reduce] function associated with a production [prod]. *)
+
+let reduce prod =
+  prefix (Printf.sprintf "reduce%d" (Production.p2i prod))
+
+(* The [errorcase] function. *)
+
+let errorcase =
+  prefix "errorcase"
+
+(* The [error] function associated with a state [s]. *)
+
+let error s =
+  prefix (Printf.sprintf "error%d" (Lr1.number s))
+
+(* The constant associated with a state [s]. *)
+
+let statecon s =
+  dataprefix (Printf.sprintf "State%d" (Lr1.number s))
+
+let estatecon s =
+  EData (statecon s, [])
+
+let rec begins_with s1 s2 i1 i2 n1 n2 =
+  if i1 = n1 then
+    true
+  else if i2 = n2 then
+    false
+  else if String.unsafe_get s1 i1 = String.unsafe_get s2 i2 then
+    begins_with s1 s2 (i1 + 1) (i2 + 1) n1 n2
+  else
+    false
+
+let begins_with s1 s2 =
+  begins_with s1 s2 0 0 (String.length s1) (String.length s2)
+
+(* This predicate tells whether a data constructor represents a state.
+   It is based on the name, which is inelegant and inefficient. TEMPORARY *)
+
+let is_statecon : string -> bool =
+  begins_with (dataprefix "State")
+
+let pstatecon s =
+  PData (statecon s, [])
+
+let pstatescon ss =
+  POr (List.map pstatecon ss)
+
+(* The type of states. *)
+
+let tcstate =
+  prefix "state"
+
+let tstate =
+  TypApp (tcstate, [])
+
+(* The [print_token] function. This automatically generated function
+   is used in [--trace] mode. *)
+
+let print_token =
+  prefix "print_token"
+
+(* Fields in the environment record. *)
+
+let flexer =
+  prefix "lexer"
+
+let flexbuf =
+  prefix "lexbuf"
+
+let ftoken =
+  prefix "token"
+
+let fshifted =
+  prefix "shifted"
+
+let fstartp =
+  prefix "startp"
+
+let fendp =
+  prefix "endp"
+
+let fpreviouserror =
+  prefix "previouserror"
+
+(* The type variable that represents the stack tail. *)
+
+let tvtail =
+  tvprefix "tail"
+
+let ttail =
+  TypVar tvtail
+
+(* The result type for every function. TEMPORARY *)
+
+let tvresult =
+  tvprefix "return"
+
+let tresult =
+  TypVar tvresult
+
+(* ------------------------------------------------------------------------ *)
+(* Helpers for code production. *)
+
+let concatif condition xs =
+  if condition then
+    xs
+  else
+    []
+
+let insertif condition x =
+  if condition then
+    [ x ]
+  else
+    []
+
+let var x : expr =
+  EVar x
+
+let vars xs =
+  List.map var xs
+
+let pvar x : pattern =
+  PVar x
+
+let magic e : expr =
+  EMagic e
+
+let nomagic e =
+  e
+
+(* [env.shifted] is either [-1], which means that we have an [error] token
+   at the head of the token stream, or a nonnegative number. (The code in
+   [discard], which increments [env.shifted], takes care to avoid overflow.)
+   
+   The following assertion checks that [env.shifted] is not [-1], that is,
+   it is greater than or equal to [0]. Prior to 2011/01/24, two forms of
+   this test co-existed, but it seems more uniform to have just one form. *)
+
+let assertshifted : pattern * expr =
+  PUnit,
+  EApp (EVar "assert",
+       [ EApp (EVar "Pervasives.(<>)", [ ERecordAccess (EVar env, fshifted); EIntConst (-1) ]) ])
+
+let etuple = function
+  | [] ->
+      assert false
+  | [ e ] ->
+      e
+  | es ->
+      ETuple es
+
+let ptuple = function
+  | [] ->
+      assert false
+  | [ p ] ->
+      p
+  | ps ->
+      PTuple ps
+
+let trace (format : string) (args : expr list) : (pattern * expr) list =
+  if Settings.trace then
+    [ PUnit, EApp (EVar "Printf.fprintf", (EVar "Pervasives.stderr") :: (EStringConst (format ^"\n%!")) :: args) ]
+  else
+    []
+
+let tracecomment (comment : string) (body : expr) : expr =
+  if Settings.trace then
+    blet (trace comment [], body)
+  else
+    EComment (comment, body)
+
+let auto2scheme t =
+  scheme [ tvtail; tvresult ] t
+
+(* ------------------------------------------------------------------------ *)
+(* Determine whether at least one semantic action mentions $previouserror. *)
+
+let previouserror_required : bool =
+  Production.foldx (fun prod accu ->
+    accu || Action.has_previouserror (Production.action prod)
+  ) false
+
+(* ------------------------------------------------------------------------ *)
+(* Determine whether the [goto] function for nonterminal [nt] will push
+   a new cell onto the stack. If it doesn't, then that job is delegated
+   to the [run] functions called by [goto].
+
+   One could decide that [gotopushes] always returns true, and produce
+   decent code. As a refinement, we decide to drive the [push]
+   operation inside the [run] functions if all of them are able to
+   eliminate this operation via shiftreduce optimization. This will be
+   the case if all of these [run] functions implement a default
+   reduction of a non-epsilon production.
+
+   If that is not the case, then [gotopushes] returns true. In
+   general, it is good to place the [push] operation inside [goto],
+   because multiple [reduce] functions transfer control to [goto], and
+   [goto] in turn transfers control to multiple [run] functions. Hence,
+   this is where code sharing is maximal. All of the [run] functions
+   that [goto] can transfer control to expect a stack cell of the same
+   shape (indeed, the symbol [nt] is the same in every case, and the
+   state is always represented), which makes this decision possible. *)
+
+let gotopushes : Nonterminal.t -> bool =
+  Nonterminal.tabulate (fun nt ->
+    not (
+      Lr1.targets (fun accu _ target ->
+       accu &&
+       match Invariant.has_default_reduction target with
+       | Some (prod, _) ->
+           Production.length prod > 0
+       | None -> false
+      ) true (Symbol.N nt)
+    )
+  )
+
+(* ------------------------------------------------------------------------ *)
+(* Determine whether the [run] function for state [s] will push a new cell
+   onto the stack.
+
+   Our convention is this. If this [run] function is entered via a shift
+   transition, then it is in charge of pushing a new stack cell. If it
+   is entered via a goto transition, then it is in charge of pushing a
+   new cell if and only if the [goto] function that invoked it did not
+   do so. Last, if this [run] function is invoked directly by an entry
+   point, then it does not push a stack cell. *)
+
+let runpushes s =
+  match Lr1.incoming_symbol s with
+  | Some (Symbol.T _) ->
+      true
+  | Some (Symbol.N nt) ->
+      not (gotopushes nt)
+  | None ->
+      false
+
+(* ------------------------------------------------------------------------ *)
+(* In some situations, we are able to fuse a shift (or goto)
+   transition with a reduce transition, which means that we save the
+   cost (in speed and in code size) of pushing and popping the top
+   stack cell.
+
+   This involves creating a modified version of the [reduce] function
+   associated with a production [prod], where the contents of the top
+   stack cell are passed as extra parameters. Because we wish to avoid
+   code duplication, we perform this change only if all call sites for
+   [reduce] agree on this modified calling convention.
+
+   At the call site, the optimization is possible only if a stack cell
+   allocation exists and is immediately followed by a call to
+   [reduce]. This is the case inside the [run] function for state [s]
+   when [run] pushes a stack cell and performs a default reduction.
+
+   This optimization amounts to coalescing the push operation inside
+   [run] with the pop operation that follows inside [reduce].
+
+   Unit production elimination, on the other hand, would coalesce the
+   pop operation inside [reduce] with the push operation that follows
+   inside [goto]. For this reason, the two are contradictory. As a
+   result, we do not attempt to perform unit production elimination.
+   In fact, we did implement it at one point and found that it was
+   seldom applicable, because preference was given to the shiftreduce
+   optimization.
+
+   There are cases where shiftreduce optimization does not make any
+   difference, for instance, if production [prod] is never reduced, or
+   if the top stack cell is in fact nonexistent. *)
+
+let (shiftreduce : Production.index -> bool), shiftreducecount =
+  Production.tabulate (fun prod ->
+
+    (* Check that this production pops at least one stack cell. *)
+
+    Production.length prod > 0 &&
+
+    (* Check that all call sites push a stack cell and have a
+       default reduction. *)
+
+    Invariant.fold_reduced (fun s accu ->
+      accu && (match Invariant.has_default_reduction s with None -> false | Some _ -> true)
+           && (runpushes s)
+    ) prod true
+
+  )
+
+let () =
+  Error.logC 1 (fun f ->
+    Printf.fprintf f
+       "%d out of %d productions exploit shiftreduce optimization.\n"
+       shiftreducecount Production.n)
+
+(* Check that, as predicted above, [gotopushes nt] returns [false]
+   only when all of the [run] functions that follow it perform
+   shiftreduce optimization.
+
+   This can be proved as follows. If [gotopushes nt] returns [false],
+   then every successor state [s] has a default reduction for some
+   non-epsilon production [prod]. Furthermore, all states that can
+   reduce [prod] must be successors of that same [goto] function:
+   indeed, because the right-hand side of the production ends with
+   symbol [nt], every state that can reduce [prod] must be entered
+   through [nt]. So, at all such states, [runpushes] is true, which
+   guarantees that [shiftreduce prod] is true as well. *)
+
+let () =
+  assert (
+    Nonterminal.fold (fun nt accu ->
+      accu &&
+      if gotopushes nt then
+       true
+      else
+       Lr1.targets (fun accu _ target ->
+         accu &&
+         match Invariant.has_default_reduction target with
+         | Some (prod, _) ->
+             shiftreduce prod
+         | None ->
+             false
+        ) true (Symbol.N nt)
+    ) true
+  )
+
+(* ------------------------------------------------------------------------ *)
+(* Type production. *)
+
+(* This is the type of states. Only states that are represented are
+   declared. *)
+
+let statetypedef = {
+  typename =       tcstate;
+  typeparams =     [];
+  typerhs =        TDefSum (
+                    Lr1.fold (fun defs s ->
+                      if Invariant.represented s then {
+                        dataname =       statecon s;
+                        datavalparams =  [];
+                        datatypeparams = None
+                      } :: defs
+                      else defs
+                    ) []
+                   );
+  typeconstraint = None
+}
+
+(* This is the type of parser environments. *)
+
+let field modifiable name t =
+  {
+    modifiable = modifiable;
+    fieldname = name;
+    fieldtype = type2scheme t
+  }
+
+let envtypedef = {
+  typename = tcenv;
+  typeparams = [];
+  typerhs =
+    TDefRecord ([
+
+      (* The lexer itself. *)
+
+      field false flexer tlexer;
+
+      (* The lexing buffer. *)
+
+      field false flexbuf tlexbuf;
+
+      (* The last token that was read from the lexer. This is the
+        head of the token stream, unless [env.shifted] is [-1]. *)
+
+      field true ftoken ttoken;
+
+      (* The start position of the above token. *)
+
+      field true fstartp tposition;
+
+      (* The end position of the above token. *)
+
+      field true fendp tposition;
+
+      (* How many tokens were successfully shifted since the last
+        [error] token was shifted. When this counter is -1, the head
+        of the token stream is the [error] token, and the contents of
+        the [token] field is irrelevant. The token following [error]
+        is obtained by invoking the lexer again. *)
+
+      field true fshifted tint;
+
+    ] @
+
+    (* If at least one semantic action mentions $previouserror, then we keep
+       track of this information. *)
+
+    insertif previouserror_required (field true fpreviouserror tint)
+
+    );
+  typeconstraint = None
+}
+
+(* [curry] curries the top stack cell in a type [t] of the form
+   [(stack type) arrow (result type)]. [t] remains unchanged if the
+   stack type does not make at least one cell explicit. *)
+
+let curry = function
+  | TypArrow (TypTuple (tstack :: tcell), tresult) ->
+      TypArrow (tstack, marrow tcell tresult)
+  | TypArrow _ as t ->
+      t
+  | _ ->
+      assert false
+
+(* [curryif true] is [curry], [curryif false] is the identity. *)
+
+let curryif flag t =
+  if flag then curry t else t
+
+(* Types for stack cells. 
+
+   [celltype tailtype holds_state symbol] returns the type of a stack
+   cell. The parameter [tailtype] is the type of the tail of the
+   stack. The flag [holds_state] tells whether the cell holds a state.
+   The parameter [symbol] is used to determine whether the cell holds
+   a semantic value and what its type is.
+
+   A subtlety here and in [curry] above is that singleton stack cells
+   give rise to singleton tuple types, which the type printer
+   eliminates, but which do exist internally. As a result, [curry]
+   always correctly removes the top stack cell, even if it is a
+   singleton tuple cell. *)
+
+let celltype tailtype holds_state symbol _ =
+  TypTuple (
+    tailtype ::
+    insertif holds_state tstate @
+    semvtype symbol @
+    insertif (Invariant.startp symbol) tposition @
+    insertif (Invariant.endp symbol) tposition
+  )
+
+(* Types for stacks. 
+
+   [stacktype s] is the type of the stack at state
+   [s]. [reducestacktype prod] is the type of the stack when about to
+   reduce production [prod]. [gotostacktype nt] is the type of the
+   stack when the [goto] function associated with [nt] is called.
+
+   In all cases, the tail (that is, the unknown part) of the stack is
+   represented by [ttail], currently a type variable.
+
+   These stack types are obtained by folding [celltype] over a
+   description of the stack provided by module [Invariant]. *)
+
+let stacktype s =
+  Invariant.fold celltype ttail (Invariant.stack s)
+
+let reducestacktype prod =
+  Invariant.fold celltype ttail (Invariant.prodstack prod)
+
+let gotostacktype nt =
+  Invariant.fold celltype ttail (Invariant.gotostack nt)
+
+(* The type of the [run] function. As announced earlier, if [s] is the
+   target of shift transitions, the type of the stack is curried, that
+   is, the top stack cell is not yet allocated, so its contents are
+   passed as extra parameters. If [s] is the target of goto
+   transitions, the top stack cell is allocated. If [s] is a start
+   state, this issue makes no difference. *)
+
+let runtypescheme s =
+  auto2scheme (
+    arrow tenv (
+      curryif (runpushes s) (
+        arrow (stacktype s) tresult
+      )
+    )
+  )
+
+(* The type of the [action] function. The top stack cell is not
+   curried. There is an additional parameter of type [token]. *)
+
+let actiontypescheme s =
+  auto2scheme (marrow [ tenv; stacktype s; ttoken ] tresult)
+
+(* The type of the [goto] function. The top stack cell is curried. *)
+
+let gototypescheme nt =
+  auto2scheme (arrow tenv (curry (arrow (gotostacktype nt) tresult)))
+
+(* If [prod] is an epsilon production and if the [goto] function
+   associated with it expects a state parameter, then the [reduce]
+   function associated with [prod] also requires a state parameter. *)
+
+let reduce_expects_state_param prod =
+  let nt = Production.nt prod in
+  Production.length prod = 0 && 
+  Invariant.fold (fun _ holds_state _ _ -> holds_state) false (Invariant.gotostack nt)
+
+(* The type of the [reduce] function. If shiftreduce optimization
+   is performed for this production, then the top stack cell is
+   not explicitly allocated. *)
+
+let reducetypescheme prod =
+  auto2scheme (
+    arrow tenv (
+      curryif (shiftreduce prod) (
+       arrow (reducestacktype prod) (
+         arrowif (reduce_expects_state_param prod) tstate tresult
+       )
+      )
+    )
+  )
+
+(* The type of the [errorcase] function. The shape of the stack is
+   unknown, and is determined by examining the state parameter. *)
+
+let errorcasetypescheme =
+  auto2scheme (marrow [ tenv; ttail; tstate ] tresult)
+
+(* The type of the [error] function. The shape of the stack is the
+   one associated with state [s]. *)
+
+let errortypescheme s =
+  auto2scheme ( marrow [ tenv; stacktype s ] tresult)
+
+(* ------------------------------------------------------------------------ *)
+(* Code production preliminaries. *)
+
+(* This flag will be set to [true] if we ever raise the [Error]
+   exception. This happens when we unwind the entire stack without
+   finding a state that can handle errors. *)
+
+let can_die =
+  ref false
+
+(* A code pattern for an exception handling construct where both
+   alternatives are in tail position. Concrete syntax for this would
+   be [let x = e in e1 unless Error -> e2]. Since Objective Caml does
+   not support this construct, we emulate it using a combination of
+   [try/with], [match/with], and an [option] value. *)
+
+let letunless e x e1 e2 =
+  EMatch (
+    ETry (
+      EData ("Some", [ e ]),
+      [ { branchpat = PData (excname, []); branchbody = EData ("None", []) } ]
+    ),
+    [ { branchpat = PData ("Some", [ PVar x ]); branchbody = e1 };
+      { branchpat = PData ("None", []); branchbody = e2 } ]
+  )
+
+(* ------------------------------------------------------------------------ *)
+(* Calling conventions. *)
+
+(* The contents of a stack cell, exposed as individual parameters. The
+   choice of identifiers is suitable for use in the definition of
+   [run]. *)
+
+let runcellparams var holds_state symbol =
+  insertif holds_state (var state) @
+  symval symbol (var semv) @
+  insertif (Invariant.startp symbol) (var startp) @
+  insertif (Invariant.endp symbol) (var endp)
+
+(* The contents of a stack cell, exposed as individual parameters, again.
+   The choice of identifiers is suitable for use in the definition of a
+   [reduce] function.
+
+   [prod] is the production's index. The integer [i] tells which
+   symbol on the right-hand side we are focusing on, that is, which
+   symbol this stack cell is associated with. *)
+
+let reducecellparams prod i holds_state symbol =
+  let ids = Production.identifiers prod
+  and used = Production.used prod in
+
+  (* If the semantic value is used in the semantic action, then it is
+     bound to the variable [ids.(i)]. If the semantic value is not
+     used in the semantic action, then it is dropped using a wildcard
+     pattern. *)
+
+  let semvpat t =
+    if used.(i) then
+      PVar ids.(i)
+    else
+      PWildcard
+  in
+
+  insertif holds_state (if i = 0 then PVar state else PWildcard) @
+  symvalt symbol semvpat @
+  insertif (Invariant.startp symbol) (PVar (Printf.sprintf "_startpos_%s_" ids.(i))) @
+  insertif (Invariant.endp symbol) (PVar (Printf.sprintf "_endpos_%s_" ids.(i)))
+
+(* The contents of a stack cell, exposed as individual parameters,
+   again. The choice of identifiers is suitable for use in the
+   definition of [error]. *)
+
+let errorcellparams (i, pat) holds_state symbol _ =
+  i + 1,
+  ptuple (
+    pat ::
+    insertif holds_state (if i = 0 then PVar state else PWildcard) @
+    symval symbol PWildcard @
+    insertif (Invariant.startp symbol) PWildcard @
+    insertif (Invariant.endp symbol) PWildcard
+  )
+
+(* Calls to [run]. *)
+
+let runparams magic var s =
+  var env ::
+  magic (var stack) ::
+  concatif (runpushes s) (Invariant.fold_top (runcellparams var) [] (Invariant.stack s))
+
+let call_run s actuals =
+  EApp (EVar (run s), actuals)
+
+(* Calls to [action]. *)
+
+let actionparams var =
+  [ var env; var stack; var token ]
+
+let call_action s =
+   EApp (EVar (action s), actionparams var)
+
+(* The parameters to [reduce]. When shiftreduce optimization is in
+   effect, the top stack cell is not allocated, so extra parameters
+   are required. Note that [shiftreduce prod] and
+   [reduce_expects_state_param prod] are mutually exclusive
+   conditions, so the [state] parameter is never bound twice. *)
+
+let reduceparams prod =
+  PVar env ::
+  PVar stack ::
+  concatif (shiftreduce prod) (
+    Invariant.fold_top
+      (reducecellparams prod (Production.length prod - 1))
+    [] (Invariant.prodstack prod)
+  ) @
+  insertif (reduce_expects_state_param prod) (PVar state)
+
+(* Calls to [reduce]. One must specify the production [prod] as well
+   as the current state [s]. *)
+
+let call_reduce prod s =
+  let actuals =
+    (EVar env) ::
+    (EMagic (EVar stack)) ::
+    concatif (shiftreduce prod)
+      (Invariant.fold_top (runcellparams var) [] (Invariant.stack s))
+      (* compare with [runpushcell s] *) @
+    insertif (reduce_expects_state_param prod) (estatecon s)
+  in
+  EApp (EVar (reduce prod), actuals)
+
+(* Calls to [goto]. *)
+
+let gotoparams var nt =
+  var env ::
+  var stack ::
+  Invariant.fold_top (runcellparams var) [] (Invariant.gotostack nt)
+
+let call_goto nt =
+  EApp (EVar (goto nt), gotoparams var nt)
+
+(* Calls to [errorcase]. *)
+
+let errorcaseparams magic var =
+  [ var env; magic (var stack); var state ]
+
+let call_errorcase =
+  EApp (EVar errorcase, errorcaseparams magic var)
+
+(* Calls to [error]. *)
+
+let errorparams magic var =
+  [ var env; magic (var stack) ]
+
+let call_error magic s =
+  EApp (EVar (error s), errorparams magic var)
+
+let call_error_via_errorcase magic s = (* TEMPORARY document *)
+  if Invariant.represented s then
+    EApp (EVar errorcase, [ var env; magic (var stack); estatecon s ])
+  else
+    call_error magic s
+
+(* Calls to [assertfalse]. *)
+
+let call_assertfalse =
+  EApp (EVar assertfalse, [ EVar "()" ])
+
+(* ------------------------------------------------------------------------ *)
+(* Emit a warning when a state can do error recovery but does not
+   accept EOF. This can lead to non-termination if the end of file
+   is reached while attempting to recover from an error. *)
+
+let check_recoverer covered s =
+  match Terminal.eof with
+  | None ->
+      (* We do not know which token represents the end of file,
+        so we say nothing. *)
+      ()
+  | Some eof ->
+      if not (TerminalSet.mem eof covered) then
+       (* This state has no (shift or reduce) action at EOF. *)
+       Error.warning []
+         (Printf.sprintf
+            "state %d can perform error recovery, but does not accept EOF.\n\
+             ** Hitting the end of file during error recovery will cause non-termination."
+                 (Lr1.number s))
+
+(* ------------------------------------------------------------------------ *)
+(* Code production for the automaton functions. *)
+
+(* Count how many states actually perform error recovery. This figure
+   is, in general, inferior or equal to the number of states at which
+   [Invariant.recoverer] is true. Indeed, some of these states have a
+   default reduction, while some will accept every token; in either
+   case, error recovery is not performed. *)
+
+let recoverers =
+  ref 0
+
+(* Count how many states actually can peek at an error recovery. This
+   figure is, in general, inferior or equal to the number of states at
+   which [Invariant.errorpeeker] is true, because some of these states
+   have a default reduction and will not consult the lookahead
+   token. *)
+
+let errorpeekers =
+  ref 0
+
+(* Code for calling the reduction function for token [prod] upon
+   finding a token within [toks]. This produces a branch, to be
+   inserted in an [action] function for state [s]. *)
+
+let reducebranch toks prod s =
+  {
+    branchpat =
+      tokspat toks;
+    branchbody =
+      call_reduce prod s
+  } 
+
+(* Code for shifting from state [s] to state [s'] via the token [tok].
+   This produces a branch, to be inserted in an [action] function for
+   state [s].
+
+   The callee, [run s'], is responsible for taking the current token
+   off the input stream. (There is actually a case where the token is
+   *not* taken off the stream: when [s'] has a default reduction on
+   [#].)
+
+   It is also responsible for pushing a new stack cell. The rationale
+   behind this decision is that there may be multiple shift
+   transitions into [s'], so we actually share that code by placing it
+   inside [run s'] rather than inside every transition. *)
+
+let shiftbranchbody s tok s' =
+
+  (* Construct the actual parameters for [run s']. *)
+
+  let actuals =
+    (EVar env) ::
+    (EMagic (EVar stack)) ::
+    Invariant.fold_top (fun holds_state symbol ->
+      assert (Symbol.equal (Symbol.T tok) symbol);
+      insertif holds_state (estatecon s) @
+      tokval tok (EVar semv) @
+      insertif (Invariant.startp symbol) (ERecordAccess (EVar env, fstartp)) @
+      insertif (Invariant.endp symbol) (ERecordAccess (EVar env, fendp))
+    ) [] (Invariant.stack s')
+  in
+
+  (* Call [run s']. *)
+
+  tracecomment
+   (Printf.sprintf "Shifting (%s) to state %d" (Terminal.print tok) (Lr1.number s'))
+   (call_run s' actuals)
+
+let shiftbranch s tok s' =
+  assert (not (Terminal.pseudo tok));
+  {
+    branchpat =
+      PData (tokenprefix (Terminal.print tok), tokval tok (PVar semv));
+    branchbody =
+      shiftbranchbody s tok s'
+  }
+
+(* This generates code for pushing a new stack cell upon entering the
+   [run] function for state [s]. *)
+
+let runpushcell s e =
+  if runpushes s then
+    let contents = var stack :: Invariant.fold_top (runcellparams var) [] (Invariant.stack s) in
+    mlet [ pvar stack ] [ etuple contents ] e
+  else
+    e
+
+let runpushcellunless shiftreduce s e =
+  if shiftreduce then
+    EComment ("Not allocating top stack cell", e)
+  else
+    runpushcell s e
+
+(* This generates code for dealing with the lookahead token upon
+   entering the [run] function for state [s]. If [s] is the target of
+   a shift transition, then we must take the current token (which was
+   consumed in the shift transition) off the input stream. Whether [s]
+   was entered through a shift or a goto transition, we want to peek
+   at the next token, unless we are performing a default reduction.
+   The parameter [defred] tells which default reduction, if any, we
+   are about to perform. *)
+
+let gettoken s defred e =
+  match Lr1.incoming_symbol s, defred with
+
+  | Some (Symbol.T _), Some (_, toks)
+    when TerminalSet.mem Terminal.sharp toks ->
+      assert (TerminalSet.cardinal toks = 1);
+
+      (* There is a default reduction on token [#]. We cannot
+        request the next token, since that might drive the
+        lexer off the end of the input stream, so we cannot
+        call [discard]. Do nothing. *)
+
+      e
+
+  | Some (Symbol.T _), Some _ ->
+
+      (* There is some other default reduction. Discard the first
+        input token. *)
+
+      blet ([ PWildcard, EApp (EVar discard, [ EVar env ]) ], e)
+
+  | Some (Symbol.T _), None ->
+
+      (* There is no default reduction. Discard the first input token
+        and peek at the next one. *)
+
+      blet ([ PVar token, EApp (EVar discard, [ EVar env ]) ], e)
+
+  | (Some (Symbol.N _) | None), Some _ ->
+
+      (* There is some default reduction. Do not peek at the input
+        token. *)
+
+      e
+
+  | (Some (Symbol.N _) | None), None ->
+
+      (* There is no default reduction. Peek at the first input token,
+        without taking it off the input stream. This is normally done
+        by reading [env.token], unless the token might be [error]:
+        then, we check [env.shifted] first. *)
+
+      if Invariant.errorpeeker s then begin
+       incr errorpeekers;
+       EIfThenElse (
+         EApp (EVar "Pervasives.(=)", [ ERecordAccess (EVar env, fshifted); EIntConst (-1) ]),
+         tracecomment "Resuming error handling" (call_error_via_errorcase magic s),
+         blet ([ PVar token, ERecordAccess (EVar env, ftoken) ], e)
+        )
+      end
+      else
+       blet ([ assertshifted;
+               PVar token, ERecordAccess (EVar env, ftoken) ], e)
+
+(* This produces the definition of a [run] function. *)
+
+let rundef s body =
+  let body =
+    tracecomment (Printf.sprintf "State %d:" (Lr1.number s)) body
+  in {
+    valpublic = false;
+    valpat = PVar (run s);
+    valval = EAnnot (EFun (runparams nomagic pvar s, body), runtypescheme s)
+  }
+
+(* This produces the definition of an [action] function. *)
+
+let actiondef s body = {
+  valpublic = false;
+  valpat = PVar (action s);
+  valval = EAnnot (EFun (actionparams pvar, body), actiontypescheme s)
+} 
+
+(* This produces the comment attached with a default reduction. *)
+
+let defaultreductioncomment toks e =
+  EPatComment (
+    "Reducing without looking ahead at ",
+    tokspat toks,
+    e
+  )
+
+(* This produces some bookkeeping code that is used when initiating
+   error handling.
+
+   First, we copy [env.shifted] to [env.previouserror]. Of course,
+   this is done only if at least one semantic action uses the
+   [$previouserror] keyword.
+
+   Then, we reset the count of tokens shifted since the last error to
+   -1, so that it becomes zero *after* the error token itself is
+   shifted. By convention, when [shifted] is -1, the field [env.token]
+   becomes meaningless and one considers that the first token on the
+   input stream is [error]. As a result, the next peek at the
+   lookahead token will cause error handling to be resumed. The next
+   call to [discard] will take the [error] token off the input stream
+   and increment [env.shifted] to zero. *)
+
+let errorbookkeeping e =
+  tracecomment
+    "Initiating error handling"
+    (blet (
+      concatif previouserror_required 
+       [ PUnit, ERecordWrite (EVar env, fpreviouserror, ERecordAccess (EVar env, fshifted)) ] @
+      [ PUnit, ERecordWrite (EVar env, fshifted, EIntConst (-1)) ],
+      e
+    ))
+
+(* This code is used to indicate that a new error has been detected in
+   state [s]. [covered] is the set of tokens that [s] knows how to
+   handle.
+
+   If I am correct, the count of shifted tokens is never -1
+   here. Indeed, that would mean that we first found an error, and
+   then signaled another error before being able to shift the first
+   error token. My understanding is that this cannot happen: when the
+   first error is signaled, we end up at a state that is willing to
+   handle the error token, by a series of reductions followed by a
+   shift.
+
+   In the simplest case, the state [s] cannot do error recovery. In
+   that case, we initiate error handling, which is done by first
+   performing the standard bookkeeping described above, then
+   transferring control to the [error] function associated with [s].
+
+   If, on the other hand, [s] can do error recovery, then we check
+   whether any tokens at all were shifted since the last error
+   occurred. If none were, then we discard the current token and
+   transfer control back to the [action] function associated with [s].
+
+   The token is discarded via a call to [discard], followed by
+   resetting [env.shifted] to zero, to counter-act the effect of
+   [discard], which increments that counter. *)
+
+let initiate covered s =
+
+  blet (
+    [ assertshifted ],
+
+    if Invariant.recoverer s then begin
+
+      incr recoverers;
+      check_recoverer covered s;
+
+      EIfThenElse (
+       EApp (EVar "Pervasives.(=)", [ ERecordAccess (EVar env, fshifted); EIntConst 0 ]),
+       blet (
+         trace "Discarding last token read (%s)"
+               [ EApp (EVar print_token, [ ERecordAccess (EVar env, ftoken) ]) ] @
+         [
+           PVar token, EApp (EVar discard, [ EVar env ]);
+           PUnit, ERecordWrite (EVar env, fshifted, EIntConst 0)
+         ],
+         call_action s
+       ),
+       errorbookkeeping (call_error_via_errorcase magic s)
+      )
+
+    end
+    else
+      errorbookkeeping (call_error_via_errorcase magic s)
+
+  )
+
+(* This produces the definitions of the [run] and [action] functions
+   associated with state [s].
+
+   The [action] function implements the internal case analysis. It
+   receives the lookahead token as a parameter. It does not affect the
+   input stream. It does not set up exception handlers for dealing
+   with errors. The existence of this internal function is made
+   necessary by the error recovery mechanism (which discards tokens
+   when attempting to resynchronize after an error). In many states,
+   recovery can in fact not be performed, so no self-call to [action]
+   will be generated and [action] will be inlined into [run]. *)
+
+let rec runactiondef s : valdef list =
+
+  match Invariant.has_default_reduction s with
+  | Some (prod, toks) as defred ->
+
+      (* Perform reduction without looking ahead. In this case,
+        no separate [action] function is required.
+
+        If shiftreduce optimization is being performed, then no
+         stack cell is allocated. The contents of the top stack
+         cell are passed do [reduce] as extra parameters. *)
+
+      [
+       rundef s (
+          runpushcellunless (shiftreduce prod) s (
+           gettoken s defred (
+             defaultreductioncomment toks (
+               call_reduce prod s
+             )
+           )
+         )
+       )
+      ]
+
+  | None ->
+
+      (* If this state is willing to act on the error token, ignore
+        that -- this is taken care of elsewhere. *)
+
+      let transitions =
+       SymbolMap.remove (Symbol.T Terminal.error) (Lr1.transitions s)
+      and reductions =
+       TerminalMap.remove Terminal.error (Lr1.reductions s)
+      in
+
+      (* Construct the main case analysis that determines what action
+        should be taken next.
+
+        A default branch, where an error is detected, is added if the
+        analysis is not exhaustive. In the default branch, we
+        initiate error handling. *)
+
+      let covered, branches =
+       ProductionMap.fold (fun prod toks (covered, branches) ->
+         (* There is a reduction for these tokens. *)
+         TerminalSet.union toks covered,
+         reducebranch toks prod s :: branches
+       ) (Lr1.invert reductions) (TerminalSet.empty, [])
+      in
+
+      let covered, branches =
+       SymbolMap.fold (fun symbol s' (covered, branches) ->
+         match symbol with
+         | Symbol.T tok ->
+             (* There is a shift transition for this token. *)
+             TerminalSet.add tok covered,
+             shiftbranch s tok s' :: branches
+         | Symbol.N _ ->
+             covered, branches
+       ) transitions (covered, branches)
+      in
+
+      let branches =
+       if TerminalSet.subset TerminalSet.universe covered then
+         branches
+       else
+         branches @ [ { branchpat = PWildcard; branchbody = initiate covered s } ]
+      in
+
+      (* Finally, construct the code for [run] and [action]. The
+        former pushes things onto the stack, obtains the lookahead
+        token, and calls the [action] function. The latter performs
+        the main case analysis on the lookahead token. *)
+
+      [
+       rundef s (
+         runpushcell s (
+           gettoken s None (
+             call_action s
+           )
+         )
+       );
+       actiondef s (
+         EMatch (
+           EVar token,
+           branches
+         )
+       )
+      ]
+
+(* This is the body of the [reduce] function associated with
+   production [prod]. *)
+
+let reducebody prod =
+
+  (* Find out about the left-hand side of this production and about
+     the identifiers that have been bound to the symbols in the
+     right-hand side. These represent variables that we should bind to
+     semantic values before invoking the semantic action. *)
+
+  let nt, rhs = Production.def prod
+  and ids = Production.identifiers prod
+  and used = Production.used prod
+  and length = Production.length prod in
+
+  (* Build a pattern that represents the shape of the stack. Out of
+     the stack, we extract a state (except when the production is an
+     epsilon production) and a number of semantic values.
+
+     If shiftreduce optimization is being performed, then the top
+     stack cell is not explicitly allocated, so we do not include
+     it in the pattern that is built. *)
+
+  let (_ : int), pat =
+    Invariant.fold (fun (i, pat) holds_state symbol _ ->
+      i + 1,
+      if i = length - 1 && shiftreduce prod then
+       pat
+      else
+       ptuple (pat :: reducecellparams prod i holds_state symbol)
+    ) (0, PVar stack) (Invariant.prodstack prod)
+  in
+
+  (* If any identifiers refer to terminal symbols without a semantic
+     value, then bind these identifiers to the unit value. This
+     provides the illusion that every symbol, terminal or nonterminal,
+     has a semantic value. This is more regular and allows applying
+     operators such as ? to terminal symbols without a semantic
+     value. *)
+
+  let unitbindings =
+    Misc.foldi length (fun i unitbindings ->
+      if used.(i) then
+       match semvtype rhs.(i) with
+       | [] ->
+           (PVar ids.(i), EUnit) :: unitbindings
+       | _ ->
+           unitbindings
+      else
+       unitbindings
+    ) []
+  in
+
+  (* If necessary, determine start and end positions for the left-hand
+     side of the production. If the right-hand side is nonempty, this
+     is done by extracting position information out of the first and
+     last symbols of the right-hand side. If it is empty, then both
+     positions are taken to be the current lookahead token's start
+     position.
+
+     Note that [Keyword.has_leftstart keywords] does not imply
+     [Invariant.startp symbol], and similarly for end positions. *)
+
+  let symbol =
+    Symbol.N nt
+  in
+
+  let posbindings action =
+    let bind_startp =
+      Action.has_leftstart action || Invariant.startp symbol
+    and bind_endp =
+      Action.has_leftend action || Invariant.endp symbol
+    in
+    insertif bind_startp
+      ( PVar startp,
+       if length > 0 then
+         EVar (Printf.sprintf "_startpos_%s_" ids.(0))
+        else
+          ERecordAccess (EVar env, fstartp)
+      ) @
+    insertif bind_endp
+      ( PVar endp,
+       if length > 0 then
+         EVar (Printf.sprintf "_endpos_%s_" ids.(length - 1))
+        else
+          if bind_startp then EVar startp else ERecordAccess (EVar env, fstartp)
+      )
+  in
+
+  (* If this production is one of the start productions, then reducing
+     it means accepting the input. In that case, we return a final
+     semantic value and stop. Otherwise, we transfer control to the
+     [goto] function, unless the semantic action raises [Error], in
+     which case we transfer control to [errorcase]. *)
+
+  match Production.classify prod with
+  | Some nt ->
+
+      tracecomment
+        "Accepting"
+        (blet (
+         [ pat, EVar stack ],
+         EMagic (EVar ids.(0))
+       ))
+
+  | None ->
+
+      let action =
+       Production.action prod
+      in
+      let act =
+       EAnnot (Action.to_il_expr action, type2scheme (semvtypent nt))
+      in
+
+      tracecomment
+        (Printf.sprintf "Reducing production %s" (Production.print prod))
+        (blet (
+         (pat, EVar stack) ::
+         unitbindings @
+         posbindings action @
+         extrabindings fpreviouserror action,
+
+         (* If the semantic action is susceptible of raising [Error],
+            use a [let/unless] construct, otherwise use [let]. *)
+
+         if Action.has_syntaxerror action then
+           letunless act semv (call_goto nt) (errorbookkeeping call_errorcase)
+         else
+           blet ([ PVar semv, act ], call_goto nt)
+       ))
+
+(* This is the definition of the [reduce] function associated with
+   production [prod]. *)
+
+let reducedef prod =
+  {
+    valpublic =
+      false;
+    valpat =
+      PVar (reduce prod);
+    valval =
+      EAnnot (
+        EFun (
+          reduceparams prod,
+          reducebody prod
+        ),
+        reducetypescheme prod
+      )
+  }
+
+(* This generates code for pushing a new stack cell inside [goto]. *)
+
+let gotopushcell nt e =
+  if gotopushes nt then
+    let contents = var stack :: Invariant.fold_top (runcellparams var) [] (Invariant.gotostack nt) in
+    mlet [ pvar stack ] [ etuple contents ] e
+  else
+    e
+
+(* This is the heart of the [goto] function associated with
+   nonterminal [nt]. *)
+
+let gotobody nt =
+
+  (* Examine the current state to determine where to go next. *)
+
+  let branches =
+    Lr1.targets (fun branches sources target ->
+      {
+       branchpat =
+         pstatescon sources;
+       branchbody =
+         call_run target (runparams magic var target)
+      } :: branches
+    ) [] (Symbol.N nt)
+  in
+
+  match branches with
+  | [] ->
+
+      (* If there are no branches, then this [goto] function is never
+        invoked. The inliner will drop it, so whatever we generate
+        here is unimportant. *)
+
+      call_assertfalse
+
+  | [ branch ] ->
+
+      (* If there is only one branch, no case analysis is required.
+        This optimization is not strictly necessary if GADTs are used
+        by the compiler to prove that the case analysis is
+        exhaustive. It does improve readability, though, and is also
+        useful if the compiler does not have GADTs. *)
+
+      EPatComment (
+        "State should be ",
+        branch.branchpat,
+        branch.branchbody
+      )
+
+  | _ ->
+
+      (* In the general case, we keep the branches computed above and,
+        unless [nt] is universal, add a default branch, which is
+        theoretically useless but helps avoid warnings if the
+        compiler does not have GADTs. *)
+
+      let default = {
+        branchpat = PWildcard;
+        branchbody = call_assertfalse
+      } in
+      EMatch (
+        EVar state,
+        branches @ (if Invariant.universal (Symbol.N nt) then [] else [ default ])
+      )
+
+(* This the [goto] function associated with nonterminal [nt]. *)
+
+let gotodef nt = {
+  valpublic =
+    false;
+  valpat =
+    PVar (goto nt);
+  valval = 
+    EAnnot (EFun (gotoparams pvar nt, gotopushcell nt (gotobody nt)), gototypescheme nt)
+}
+
+(* ------------------------------------------------------------------------ *)
+(* Code production for the error handling functions. *)
+
+(* This is the body of the [error] function associated with state [s]. *)
+
+let handle s e =
+  tracecomment (Printf.sprintf "Handling error in state %d" (Lr1.number s)) e
+
+let errorbody s =
+  try
+    let s' = SymbolMap.find (Symbol.T Terminal.error) (Lr1.transitions s) in
+
+    (* There is a shift transition on error. *)
+
+    handle s (
+      shiftbranchbody s Terminal.error s'
+    )
+
+  with Not_found ->
+    try
+      let prods = TerminalMap.lookup Terminal.error (Lr1.reductions s) in
+      let prod = Misc.single prods in
+
+      (* There is a reduce transition on error. If shiftreduce
+        optimization is enabled for this production, then we must pop
+        an extra cell for [reduce]'s calling convention to be met. *)
+
+      let extrapop e =
+       if shiftreduce prod then
+         let pat =
+           ptuple (PVar stack :: Invariant.fold_top (runcellparams pvar) [] (Invariant.stack s))
+         in
+         blet ([ pat, EVar stack ], e)
+       else
+         e
+      in
+       
+      handle s (
+        extrapop (
+          call_reduce prod s
+        )
+      )
+
+    with Not_found ->
+
+      (* This state is unable to handle errors. Pop the stack to find
+         a state that does handle errors, a state that can further pop
+        the stack, or die. *)
+
+      match Invariant.rewind s with
+      | Invariant.Die ->
+         can_die := true;
+          ERaise errorval
+      | Invariant.DownTo (w, st) ->
+         let _, pat = Invariant.fold errorcellparams (0, PVar stack) w in
+         blet (
+           [ pat, EVar stack ],
+           match st with
+           | Invariant.Represented ->
+               call_errorcase
+           | Invariant.UnRepresented s ->
+               call_error magic s
+          )
+
+(* This is the [error] function associated with state [s]. *)
+
+let errordef s = {
+  valpublic =
+    false;
+  valpat =
+    PVar (error s);
+  valval =
+    EAnnot (
+      EFun (
+        errorparams nomagic pvar,
+        errorbody s
+      ),
+      errortypescheme s
+    )
+}
+
+(* This is the [errorcase] function. It examines its state parameter
+   and dispatches control to an appropriate [error] function. *)
+
+let errorcasedef =
+  let branches =
+    Lr1.fold (fun branches s ->
+      if Invariant.represented s then
+       {
+         branchpat  = pstatecon s;
+         branchbody = EApp (EVar (error s), [ EVar env; EMagic (EVar stack) ])
+        } :: branches
+      else
+       branches
+    ) []
+  in
+  {
+    valpublic =
+      false;
+    valpat =
+      PVar errorcase;
+    valval =
+      EAnnot (
+       EFun (
+         errorcaseparams nomagic pvar,
+         EMatch (
+           EVar state,
+           branches
+         )
+       ),
+       errorcasetypescheme
+      )
+  }
+
+(* ------------------------------------------------------------------------ *)
+(* Code production for the entry points. *)
+
+(* This is the entry point associated with a start state [s]. By
+   convention, it is named after the nonterminal [nt] that corresponds
+   to this state. This is a public definition.
+
+   The code initializes a parser environment, an empty stack, and
+   invokes [run]. *)
+
+let entrydef s = 
+  let nt = Item.startnt (Lr1.start2item s) in
+  let lexer = "lexer"
+  and lexbuf = "lexbuf" in
+  {
+    valpublic = true;
+    valpat = PVar (Nonterminal.print true nt);
+    valval = EAnnot (
+               EFun ( [ PVar lexer; PVar lexbuf ],
+                blet (
+                  [ PVar env, EApp (EVar initenv, [ EVar lexer; EVar lexbuf ]) ],
+                  EMagic (EApp (EVar (run s), [ EVar env; EUnit ]))
+                )
+              ),
+               entrytypescheme (Nonterminal.print true nt)
+             )
+  } 
+
+(* ------------------------------------------------------------------------ *)
+(* Code production for auxiliary functions. *)
+
+(* This is [assertfalse], used when internal failure is detected.
+   This should never happen if our tool is correct. *)
+
+let assertfalsedef = {
+  valpublic = false;
+  valpat = PVar assertfalse;
+  valval = 
+    EAnnot (
+      EFun ([ PUnit ],
+       blet ([
+           PUnit, EApp (EVar "Printf.fprintf",
+                      [ EVar "Pervasives.stderr";
+                        EStringConst "Internal failure -- please contact the parser generator's developers.\n%!" ]);
+         ],
+         EApp (EVar "assert", [ efalse ])
+       )
+      ),
+      scheme [ "a" ] (arrow tunit (tvar "a"))
+    )
+}
+
+(* This is [print_token], used to print tokens in [--trace] mode. *)
+
+let printtokendef =
+  destructuretokendef
+    print_token
+    tstring
+    false
+    (fun tok -> EStringConst (Terminal.print tok))
+
+(* This is [discard], used to take a token off the input stream and
+   query the lexer for a new one. The code queries the lexer for a new
+   token and stores it into [env.token], overwriting the previous
+   token. It also stores the start and positions of the new token.
+   Last, if [env.shifted] has not yet reached its limit, then it is
+   incremented.
+
+   We use the lexer's [lex_start_p] and [lex_curr_p] fields to extract
+   the start and end positions of the token that we just read. In
+   practice, it seems that [lex_start_p] can be inaccurate (that is
+   the case when the lexer calls itself recursively, instead of simply
+   recognizing an atomic pattern and returning immediately). However,
+   we are 100% compatible with ocamlyacc here, and there is no better
+   solution anyway. *)
+
+let discarddef = {
+  valpublic = false;
+  valpat = PVar discard;
+  valval =
+    let lexbuf = "lexbuf"
+    and shifted = "shifted" in
+    EAnnot (
+      EFun (
+       [ PVar env ],
+       blet ([
+         PVar lexbuf, ERecordAccess (EVar env, flexbuf);
+         PVar token, EApp (ERecordAccess (EVar env, flexer), [ EVar lexbuf ]);
+         PUnit, ERecordWrite (EVar env, ftoken, EVar token);
+         PUnit, ERecordWrite (EVar env, fstartp, ERecordAccess (EVar lexbuf, "Lexing.lex_start_p"));
+         PUnit, ERecordWrite (EVar env, fendp, ERecordAccess (EVar lexbuf, "Lexing.lex_curr_p")) ] @
+         trace "Lookahead token is now %s (%d-%d)"
+               [ EApp (EVar print_token, [ EVar token ]);
+                 ERecordAccess (ERecordAccess (EVar env, fstartp), "Lexing.pos_cnum");
+                 ERecordAccess (ERecordAccess (EVar env, fendp), "Lexing.pos_cnum") ] @ [
+         PVar shifted, EApp (EVar "Pervasives.(+)", [ ERecordAccess (EVar env, fshifted); EIntConst 1 ]);
+         PUnit, EIfThen (
+                   EApp (EVar "Pervasives.(>=)", [ EVar shifted; EIntConst 0 ]),
+                     ERecordWrite (EVar env, fshifted, EVar shifted)
+                 )
+         ],
+         EVar token
+       )
+      ),
+      type2scheme (arrow tenv ttoken)
+    )
+}
+
+(* This is [initenv], used to allocate a fresh parser environment.
+   It performs the very first call to the lexer, and fills in all
+   fields in a straightforward way. *)
+
+let initenvdef =
+  let lexer = "lexer"
+  and lexbuf = "lexbuf" in
+  {
+    valpublic = false;
+    valpat = PVar initenv;
+    valval = 
+      EAnnot (
+       EFun ( [ PVar lexer; PVar lexbuf ],
+         blet (
+           [ PVar token, EApp (EVar lexer, [ EVar lexbuf ]) ] @
+           trace "Lookahead token is now %s (%d-%d)"
+                 [ EApp (EVar print_token, [ EVar token ]);
+                   ERecordAccess (ERecordAccess (EVar lexbuf, "Lexing.lex_start_p"), "Lexing.pos_cnum");
+                   ERecordAccess (ERecordAccess (EVar lexbuf, "Lexing.lex_curr_p"), "Lexing.pos_cnum") ],
+           ERecord ([
+             (flexer, EVar lexer);
+             (flexbuf, EVar lexbuf);
+             (ftoken, EVar token);
+             (fstartp, ERecordAccess (EVar lexbuf, "Lexing.lex_start_p"));
+             (fendp, ERecordAccess (EVar lexbuf, "Lexing.lex_curr_p"));
+             (fshifted, EIntConst max_int)
+           ] @
+           insertif previouserror_required (fpreviouserror, EIntConst max_int)
+           )
+         )
+       ),
+        type2scheme (marrow [ tlexer; tlexbuf ] tenv)
+      )
+  } 
+
+(* ------------------------------------------------------------------------ *)
+(* Here is complete code for the parser. *)
+
+let program = {
+
+  paramdefs =
+    Front.grammar.UnparameterizedSyntax.parameters;
+
+  prologue =
+    Front.grammar.UnparameterizedSyntax.preludes;
+
+  excdefs =
+    [ excdef ];
+
+  typedefs =
+    tokentypedef @
+    [ envtypedef; statetypedef ];
+
+  nonrecvaldefs =
+    [ excvaldef ];
+
+  valdefs =
+    ProductionMap.fold (fun _ s defs ->
+      entrydef s :: defs
+    ) Lr1.entry (
+    Lr1.fold (fun defs s ->
+      runactiondef s @ errordef s :: defs
+    ) (
+    Nonterminal.foldx (fun nt defs ->
+      gotodef nt :: defs
+    ) (Production.fold (fun prod defs ->
+      if Invariant.ever_reduced prod then
+       reducedef prod :: defs
+      else
+       defs
+    ) [ discarddef; initenvdef; printtokendef; assertfalsedef; errorcasedef ])));
+
+  moduledefs =
+    [];
+       
+  postlogue =
+    Front.grammar.UnparameterizedSyntax.postludes
+
+} 
+
+(* ------------------------------------------------------------------------ *)
+(* We are done! *)
+
+let () =
+  Error.logC 1 (fun f ->
+    Printf.fprintf f
+       "%d out of %d states can peek at an error.\n\
+        %d out of %d states can do error recovery.\n"
+       !errorpeekers Lr1.n
+       !recoverers Lr1.n)
+
+let () =
+  if not !can_die then
+    Error.logC 1 (fun f -> Printf.fprintf f 
+      "The generated parser cannot raise Error.\n")
+
+let () =
+  Time.tick "Producing abstract syntax"
+
+end
+
diff --git a/bundles/menhirLib/menhir-20120123/src/codeBackend.mli b/bundles/menhirLib/menhir-20120123/src/codeBackend.mli
new file mode 100644 (file)
index 0000000..45da7f0
--- /dev/null
@@ -0,0 +1,22 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* The (code-based) code generator. *)
+
+module Run (T : sig end) : sig
+
+  val program: IL.program
+
+end
+
diff --git a/bundles/menhirLib/menhir-20120123/src/codeBits.ml b/bundles/menhirLib/menhir-20120123/src/codeBits.ml
new file mode 100644 (file)
index 0000000..b4fabbb
--- /dev/null
@@ -0,0 +1,161 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* This module provides a number of tiny functions that help produce
+   [IL] code. *)
+
+open IL
+
+(* The unit type. *)
+
+let tunit =
+  TypApp ("unit", [])
+
+(* The integer type. *)
+
+let tint =
+  TypApp ("int", [])
+
+(* The string type. *)
+
+let tstring =
+  TypApp ("string", [])
+
+(* The exception type. *)
+
+let texn =
+  TypApp ("exn", [])
+
+(* The type of lexer positions. *)
+
+let tposition =
+  TypApp ("Lexing.position", [])
+
+(* The type of lexer buffers. *)
+
+let tlexbuf =
+  TypApp ("Lexing.lexbuf", [])
+
+(* The type of untyped semantic values. *)
+
+let tobj =
+  TypApp ("Obj.t", [])
+
+(* Building a type variable. *)
+
+let tvar x : typ =
+  TypVar x
+
+(* Building a type scheme. *)
+
+let scheme qs t =
+  {
+    quantifiers = qs;
+    body = t
+  } 
+
+(* Building a type scheme with no quantifiers out of a type. *)
+
+let type2scheme t =
+  scheme [] t
+
+let pat2var = function
+  | PVar x ->
+      x
+  | _ ->
+      assert false
+
+(* [simplify] removes bindings of the form [let v = v in ...] and
+   [let _ = v in ...]. *)
+
+let rec simplify = function
+  | [] ->
+      []
+  | (PVar v1, EVar v2) :: bindings when v1 = v2 ->
+      (* Avoid a useless let binding. *)
+      simplify bindings
+  | (PWildcard, EVar _) :: bindings ->
+      (* Avoid a useless let binding. *)
+      simplify bindings
+  | binding :: bindings ->
+      binding :: simplify bindings
+
+(* Building a [let] construct, with on-the-fly simplification. *)
+
+let rec blet (bindings, body) =
+  match simplify bindings with
+  | [] ->
+      body
+  | bindings ->
+      ELet (bindings, body)
+
+let mlet formals actuals body =
+  blet (List.combine formals actuals, body)
+
+(* [bottom] is an expression that has every type. Its semantics is
+   irrelevant. *)
+
+let bottom =
+  ERaise (EData ("Not_found", []))
+
+(* Boolean constants. *)
+
+let efalse : expr =
+  EData ("false", [])
+
+let etrue : expr =
+  EData ("true", [])
+
+let eboolconst b =
+  if b then etrue else efalse
+
+(* These help build function types. *)
+
+let arrow typ body : typ =
+  TypArrow (typ, body)
+
+let arrowif flag typ body : typ =
+  if flag then
+    arrow typ body
+  else
+    body
+
+let marrow typs body : typ =
+  List.fold_right arrow typs body
+
+(* ------------------------------------------------------------------------ *)
+(* Here is a bunch of naming conventions. Our names are chosen to minimize
+   the likelihood that a name in a semantic action is captured. In other
+   words, all global definitions as well as the parameters to [reduce]
+   are given far-fetched names, unless [--no-prefix] was specified. Note
+   that the prefix must begin with '_'. This allows avoiding warnings
+   about unused variables with ocaml 3.09 and later. *)
+
+let prefix name =
+  if Settings.noprefix then
+    name
+  else
+    "_menhir_" ^ name
+
+let dataprefix name =
+  if Settings.noprefix then
+    name
+  else
+    "Menhir" ^ name
+
+let tvprefix name =
+  if Settings.noprefix then
+    name
+  else
+    "ttv_" ^ name
diff --git a/bundles/menhirLib/menhir-20120123/src/codeBits.mli b/bundles/menhirLib/menhir-20120123/src/codeBits.mli
new file mode 100644 (file)
index 0000000..81c7fd5
--- /dev/null
@@ -0,0 +1,68 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* This module provides a number of tiny functions that help produce
+   [IL] code. *)
+
+open IL
+
+(* Standard types. *)
+
+val tunit: typ
+val tint: typ
+val tstring: typ
+val texn: typ
+val tposition: typ
+val tlexbuf: typ
+val tobj : typ
+
+(* Building a type variable. *)
+
+val tvar: string -> typ
+
+(* Building a type scheme. *)
+
+val scheme: string list -> typ -> typescheme
+val type2scheme: typ -> typescheme
+
+(* Projecting out of a [PVar] pattern. *)
+
+val pat2var: pattern -> string
+
+(* Building a [let] construct, with on-the-fly simplification. *)
+
+val blet: (pattern * expr) list * expr -> expr
+val mlet: pattern list -> expr list -> expr -> expr
+
+(* [bottom] is an expression that has every type. Its semantics is
+   irrelevant. *)
+
+val bottom: expr
+
+(* Boolean constants. *)
+
+val etrue: expr
+val efalse: expr
+val eboolconst: bool -> expr
+
+(* These help build function types. *)
+
+val arrow: typ -> typ -> typ
+val arrowif: bool -> typ -> typ -> typ
+val marrow: typ list -> typ -> typ
+
+(* These functions are used to generate names in menhir's namespace. *)
+val prefix: string -> string
+val dataprefix: string -> string
+val tvprefix: string -> string
diff --git a/bundles/menhirLib/menhir-20120123/src/codePieces.ml b/bundles/menhirLib/menhir-20120123/src/codePieces.ml
new file mode 100644 (file)
index 0000000..a148d6f
--- /dev/null
@@ -0,0 +1,255 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* This module defines many internal naming conventions for use by the
+   two code generators, [CodeBackend] and [TableBackend]. It also offers
+   a few code generation facilities. *)
+
+open IL
+open CodeBits
+open Grammar
+
+(* ------------------------------------------------------------------------ *)
+
+(* Naming conventions. *)
+
+(* The type variable associated with a nonterminal [nt]. *)
+
+let ntvar nt =
+  Infer.ntvar (Nonterminal.print true nt)
+
+(* The variable that holds the environment. This is a parameter to all
+   functions. We do not make it a global variable because we wish to
+   preserve re-entrancy. *)
+
+let env =
+   prefix "env"
+
+(* A variable used to hold a semantic value. *)
+
+let semv =
+  "_v"
+
+(* A variable used to hold a stack. *)
+
+let stack =
+  prefix "stack"
+
+(* A variable used to hold a state. *)
+
+let state =
+  prefix "s"
+
+(* A variable used to hold a token. *)
+
+let token =
+  "_tok"
+
+(* Variables used to hold start and end positions. Do not change these
+   names! They are chosen to coincide with the $startpos and $endpos
+   keywords, which the lexer rewrites to _startpos and _endpos, so
+   that binding these variables before executing a semantic action is
+   meaningful. *)
+
+let startp =
+  "_startpos"
+
+let endp =
+  "_endpos"
+
+(* ------------------------------------------------------------------------ *)
+
+(* Types for semantic values. *)
+
+(* [semvtypent nt] is the type of the semantic value associated
+   with nonterminal [nt]. *)
+
+let semvtypent nt =
+  match Nonterminal.ocamltype nt with
+  | None ->
+
+      (* [nt] has unknown type. If we we have run [Infer], then this
+        can't happen. However, running type inference is only an
+        option, so we still have to deal with that case. *)
+
+      TypVar (ntvar nt)
+
+  | Some ocamltype ->
+
+      (* [nt] has known type. *)
+
+      TypTextual ocamltype
+
+(* [semvtypetok tok] is the type of the semantic value associated with
+   token [tok]. There is no such type if the token does not have a
+   semantic value. *)
+
+let semvtypetok tok =
+  match Terminal.ocamltype tok with
+  | None ->
+
+      (* Token has unit type and is omitted in stack cell. *)
+
+      []
+
+  | Some ocamltype ->
+
+      (* Token has known type. *)
+
+      [ TypTextual ocamltype ]
+
+(* [semvtype symbol] is the type of the semantic value associated with
+   [symbol]. *)
+
+let semvtype = function
+  | Symbol.T tok ->
+      semvtypetok tok
+  | Symbol.N nt ->
+      [ semvtypent nt ]
+
+(* [symvalt] returns the empty list if the symbol at hand carries no
+   semantic value and the singleton list [[f t]] if it carries a
+   semantic value of type [t]. *)
+
+let symvalt symbol f =
+  match semvtype symbol with
+  | [] ->
+      []
+  | [ t ] ->
+      [ f t ]
+  | _ ->
+      assert false
+
+(* [symval symbol x] returns either the empty list or the singleton
+   list [[x]], depending on whether [symbol] carries a semantic
+   value. *)
+
+let symval symbol x =
+  match semvtype symbol with
+  | [] ->
+      []
+  | [ t ] ->
+      [ x ]
+  | _ ->
+      assert false
+
+(* [tokval] is a version of [symval], specialized for terminal symbols. *)
+
+let tokval tok x =
+  symval (Symbol.T tok) x
+
+(* ------------------------------------------------------------------------ *)
+
+(* Patterns for tokens. *)
+
+(* [tokpat tok] is a pattern that matches the token [tok], without binding
+   its semantic value. *)
+
+let tokpat tok =
+  PData (TokenType.tokenprefix (Terminal.print tok), tokval tok PWildcard)
+
+(* [tokpatv tok] is a pattern that matches the token [tok], and binds
+   its semantic value, if it has one, to the variable [semv]. *)
+
+let tokpatv tok =
+  PData (TokenType.tokenprefix (Terminal.print tok), tokval tok (PVar semv))
+
+(* [tokspat toks] is a pattern that matches any token in the set [toks],
+   without binding its semantic value. *)
+
+let tokspat toks =
+  POr (
+    TerminalSet.fold (fun tok pats ->
+      tokpat tok :: pats
+    ) toks []
+  )
+
+(* [destructuretokendef name codomain bindsemv branch] generates the
+   definition of a function that destructures tokens. [name] is the
+   name of the function that is generated. [codomain] is its return
+   type. [bindsemv] tells whether the variable [semv] should be
+   bound. [branch] is applied to each (non-pseudo) terminal and must
+   produce code for each branch. *)
+
+let destructuretokendef name codomain bindsemv branch = {
+  valpublic = false;
+  valpat = PVar name;
+  valval =
+    EAnnot (
+      EFun ([ PVar token ],
+       EMatch (EVar token,
+         Terminal.fold (fun tok branches ->
+           if Terminal.pseudo tok then
+             branches
+           else
+             { branchpat = (if bindsemv then tokpatv else tokpat) tok;
+               branchbody = branch tok } :: branches
+         ) []
+       )
+      ),
+      type2scheme (arrow TokenType.ttoken codomain)
+    )
+}
+
+(* ------------------------------------------------------------------------ *)
+
+(* Bindings for exotic keywords. *)
+
+(* [extrabindings fpreviouserror action] provides definitions for the
+   [$startofs], [$endofs], and [$previouserror] keywords, if required
+   by a semantic action. The parameter [fpreviouserror] is the name of
+   the [previouserror] field in the environment -- the table-based and
+   code-based back-ends use different names. The parameter [action] is
+   the semantic action within which these keywords might be used. *)
+
+(* The [ofs] keyword family is defined in terms of the [pos] family by
+   accessing the [pos_cnum] field. The [$previouserror] keyword simply
+   provides access to the current value of [env.previouserror]. *)
+
+let extrabindings fpreviouserror action =
+  Keyword.KeywordSet.fold (fun keyword bindings ->
+    match keyword with
+    | Keyword.Dollar _
+    | Keyword.Position (_, _, Keyword.FlavorPosition)
+    | Keyword.SyntaxError ->
+       bindings
+    | Keyword.Position (s, w, (Keyword.FlavorOffset as f)) ->
+       (PVar (Keyword.posvar s w f),
+        ERecordAccess (EVar (Keyword.posvar s w Keyword.FlavorPosition), "Lexing.pos_cnum")) :: bindings
+    | Keyword.PreviousError ->
+       (PVar "_previouserror", ERecordAccess (EVar env, fpreviouserror)) :: bindings
+  ) (Action.keywords action) []
+
+(* ------------------------------------------------------------------------ *)
+
+(* A global variable holds the exception [Error]. *)
+
+(* We preallocate the [Error] exception and store it into a global
+   variable. This allows saving code at the sites where the exception
+   is raised. Don't change the conventional name [_eRR], it is shared
+   with the lexer, which replaces occurrences of the [$syntaxerror]
+   keyword with [(raise _eRR)]. *)
+
+let parse_error =
+  "_eRR"
+
+let errorval =
+  EVar parse_error
+
+let excvaldef = {
+  valpublic = false;
+  valpat = PVar parse_error;
+  valval = EData (Interface.excname, [])
+} 
+
diff --git a/bundles/menhirLib/menhir-20120123/src/codePieces.mli b/bundles/menhirLib/menhir-20120123/src/codePieces.mli
new file mode 100644 (file)
index 0000000..9e760fa
--- /dev/null
@@ -0,0 +1,144 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* This module defines many internal naming conventions for use by the
+   two code generators, [CodeBackend] and [TableBackend]. It also offers
+   a few code generation facilities. *)
+
+open IL
+open Grammar
+
+(* ------------------------------------------------------------------------ *)
+
+(* Naming conventions. *)
+
+(* The type variable associated with a nonterminal [nt]. *)
+
+val ntvar : Nonterminal.t -> string
+
+(* The variable that holds the environment. This is a parameter to all
+   functions. We do not make it a global variable because we wish to
+   preserve re-entrancy. *) 
+
+val env : string
+
+(* A variable used to hold a semantic value. *)
+
+val semv : string
+
+(* A variable used to hold a stack. *)
+
+val stack: string
+
+(* A variable used to hold a state. *)
+
+val state: string
+
+(* A variable used to hold a token. *)
+
+val token: string
+
+(* Variables used to hold start and end positions. *)
+
+val startp: string
+val endp: string
+
+(* ------------------------------------------------------------------------ *)
+
+(* Types for semantic values. *)
+
+(* [semvtypent nt] is the type of the semantic value associated
+   with nonterminal [nt]. *)
+
+val semvtypent : Nonterminal.t -> typ
+
+(* [semvtypetok tok] is the type of the semantic value associated with
+   token [tok]. There is no such type if the token does not have a
+   semantic value. *)
+
+val semvtypetok : Terminal.t -> typ list
+
+(* [semvtype symbol] is the type of the semantic value associated with
+   [symbol]. *)
+
+val semvtype : Symbol.t -> typ list
+
+(* [symvalt] returns the empty list if the symbol at hand carries no
+   semantic value and the singleton list [[f t]] if it carries a
+   semantic value of type [t]. *)
+
+val symvalt : Symbol.t -> (typ -> 'a) -> 'a list
+
+(* [symval symbol x] returns either the empty list or the singleton
+   list [[x]], depending on whether [symbol] carries a semantic
+   value. *)
+
+val symval : Symbol.t -> 'a -> 'a list
+
+(* [tokval] is a version of [symval], specialized for terminal symbols. *)
+
+val tokval : Terminal.t -> 'a -> 'a list
+
+(* ------------------------------------------------------------------------ *)
+
+(* Patterns for tokens. *)
+
+(* [tokpat tok] is a pattern that matches the token [tok], without binding
+   its semantic value. *)
+
+val tokpat:  Terminal.t -> pattern
+
+(* [tokpatv tok] is a pattern that matches the token [tok], and binds
+   its semantic value, if it has one, to the variable [semv]. *)
+
+val tokpatv: Terminal.t -> pattern
+
+(* [tokspat toks] is a pattern that matches any token in the set [toks],
+   without binding its semantic value. *)
+
+val tokspat: TerminalSet.t -> pattern
+
+(* [destructuretokendef name codomain bindsemv branch] generates the
+   definition of a function that destructure tokens. [name] is the
+   name of the function that is generated. [codomain] is its return
+   type. [bindsemv] tells whether the variable [semv] should be
+   bound. [branch] is applied to each (non-pseudo) terminal and must
+   produce code for each branch. *)
+
+val destructuretokendef: string -> typ -> bool -> (Terminal.t -> expr) -> valdef
+
+(* ------------------------------------------------------------------------ *)
+
+(* Bindings for exotic keywords. *)
+
+(* This provides definitions for the [$startofs], [$endofs], and
+   [$previouserror] keywords, if required by a semantic action. The
+   [ofs] keyword family is defined in terms of the [pos] family by
+   accessing the [pos_cnum] field. The [$previouserror] keyword simply
+   provides access to the current value of [env.previouserror]. *)
+
+val extrabindings: string -> Action.t -> (pattern * expr) list
+
+(* ------------------------------------------------------------------------ *)
+
+(* A global variable holds the exception [Error]. *)
+
+(* The definition of this global variable. *)
+
+val excvaldef: valdef
+
+(* A reference to this global variable. *)
+
+val errorval: expr
+
diff --git a/bundles/menhirLib/menhir-20120123/src/compressedBitSet.ml b/bundles/menhirLib/menhir-20120123/src/compressedBitSet.ml
new file mode 100644 (file)
index 0000000..89f3f03
--- /dev/null
@@ -0,0 +1,227 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* A compressed (or should we say sparse?) bit set is a list of pairs
+   of integers. The first component of every pair is an index, while
+   the second component is a bit field. The list is sorted by order
+   of increasing indices. *)
+
+type t =
+  | N
+  | C of int * int * t
+
+type element =
+    int
+
+let word_size =
+  Sys.word_size - 1
+
+let empty =
+  N
+
+let is_empty = function
+  | N ->
+      true
+  | C _ ->
+      false
+
+let add i s = 
+  let ioffset = i mod word_size in
+  let iaddr = i - ioffset
+  and imask = 1 lsl ioffset in
+  let rec add = function
+    | N ->
+       (* Insert at end. *)
+       C (iaddr, imask, N)
+    | C (addr, ss, qs) as s ->
+       if iaddr < addr then
+         (* Insert in front. *)
+         C (iaddr, imask, s)
+       else if iaddr = addr then
+         (* Found appropriate cell, update bit field. *)
+         let ss' = ss lor imask in
+         if ss' = ss then
+           s
+         else
+           C (addr, ss', qs)
+       else
+         (* Not there yet, continue. *)
+         let qs' = add qs in
+         if qs == qs' then
+           s
+         else
+           C (addr, ss, qs')
+  in
+  add s
+    
+let singleton i = 
+   add i N
+
+let remove i s = 
+  let ioffset = i mod word_size in
+  let iaddr = i - ioffset
+  and imask = 1 lsl ioffset in
+  let rec remove = function
+    | N ->
+       N
+    | C (addr, ss, qs) as s ->
+       if iaddr < addr then
+         s
+       else if iaddr = addr then
+         (* Found appropriate cell, update bit field. *)
+         let ss' = ss land (lnot imask) in
+         if ss' = 0 then
+           qs
+         else if ss' = ss then
+           s
+         else
+           C (addr, ss', qs)
+       else
+         (* Not there yet, continue. *)
+         let qs' = remove qs in
+         if qs == qs' then
+           s
+         else
+           C (addr, ss, qs')
+  in
+  remove s
+    
+let rec fold f s accu = 
+  match s with
+  | N ->
+      accu
+  | C (base, ss, qs) ->
+      let limit = base + word_size in
+      let rec loop i ss accu =
+       if i = limit then
+         accu
+       else
+         loop (i + 1) (ss lsr 1) (if ss land 1 = 1 then f i accu else accu)
+      in
+      fold f qs (loop base ss accu)
+
+let iter f s =
+  fold (fun x () -> f x) s ()
+
+let cardinal s = 
+  fold (fun _ m -> m + 1) s 0
+
+let elements s =
+  fold (fun tl hd -> tl :: hd) s []
+
+let rec subset s1 s2 = 
+  match s1, s2 with
+  | N, _ ->
+      true
+  | _, N ->
+      false
+  | C (addr1, ss1, qs1), C (addr2, ss2, qs2) -> 
+      if addr1 < addr2 then
+       false
+      else if addr1 = addr2 then
+       if (ss1 land ss2) <> ss1 then 
+         false
+       else
+         subset qs1 qs2
+      else 
+       subset s1 qs2
+
+let mem i s =
+  subset (singleton i) s
+
+let rec union s1 s2 =  
+  match s1, s2 with
+  | N, s
+  | s, N ->
+      s
+  | C (addr1, ss1, qs1), C (addr2, ss2, qs2) ->
+      if addr1 < addr2 then
+       C (addr1, ss1, union qs1 s2)
+      else if addr1 > addr2 then
+       let s = union s1 qs2 in
+       if s == qs2 then
+         s2
+       else 
+         C (addr2, ss2, s)
+      else 
+       let ss = ss1 lor ss2 in
+       let s = union qs1 qs2 in
+       if ss == ss2 && s == qs2 then 
+         s2 
+       else
+         C (addr1, ss, s)
+
+let rec inter s1 s2 =  
+  match s1, s2 with
+  | N, _
+  | _, N ->
+      N
+  | C (addr1, ss1, qs1), C (addr2, ss2, qs2) ->
+      if addr1 < addr2 then
+       inter qs1 s2
+      else if addr1 > addr2 then
+       inter s1 qs2
+      else 
+       let ss = ss1 land ss2 in
+       let s = inter qs1 qs2 in
+       if ss = 0 then
+         s
+       else
+         if (ss = ss1) && (s == qs1) then
+           s1
+         else
+           C (addr1, ss, s)
+
+exception Found of int
+
+let choose s = 
+  try
+    iter (fun x ->
+      raise (Found x)
+    ) s;
+    raise Not_found
+  with Found x ->
+    x
+
+let rec compare s1 s2 = 
+  match s1, s2 with
+      N, N ->  0
+    | _, N ->  1
+    | N, _ -> -1
+    | C (addr1, ss1, qs1), C (addr2, ss2, qs2) ->
+       if addr1 < addr2 then -1
+       else if addr1 > addr2 then 1
+       else if ss1 < ss2 then -1
+       else if ss1 > ss2 then 1
+       else compare qs1 qs2
+
+let rec equal s1 s2 =
+  compare s1 s2 = 0
+
+let rec disjoint s1 s2 = 
+  match s1, s2 with
+  | N, _
+  | _, N ->
+      true
+  | C (addr1, ss1, qs1), C (addr2, ss2, qs2) -> 
+      if addr1 = addr2 then
+       if (ss1 land ss2) = 0 then 
+         disjoint qs1 qs2
+       else 
+         false
+      else if addr1 < addr2 then 
+       disjoint qs1 s2
+      else 
+       disjoint s1 qs2
+
diff --git a/bundles/menhirLib/menhir-20120123/src/compressedBitSet.mli b/bundles/menhirLib/menhir-20120123/src/compressedBitSet.mli
new file mode 100644 (file)
index 0000000..b12f417
--- /dev/null
@@ -0,0 +1,15 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+include GSet.S with type element = int
diff --git a/bundles/menhirLib/menhir-20120123/src/concreteSyntax.mli b/bundles/menhirLib/menhir-20120123/src/concreteSyntax.mli
new file mode 100644 (file)
index 0000000..5010af9
--- /dev/null
@@ -0,0 +1,24 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* $Id: concreteSyntax.mli,v 1.3 2005/12/01 16:20:06 regisgia Exp $ *)
+type grammar =
+    { 
+      pg_filename         : Syntax.filename;
+      pg_declarations     : (Syntax.declaration Positions.located) list;
+      pg_rules             : Syntax.parameterized_rule list;
+      pg_trailer          : Syntax.trailer option;
+    }
+
+    
diff --git a/bundles/menhirLib/menhir-20120123/src/conflict.ml b/bundles/menhirLib/menhir-20120123/src/conflict.ml
new file mode 100644 (file)
index 0000000..eb64d77
--- /dev/null
@@ -0,0 +1,496 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+open Grammar
+
+(* -------------------------------------------------------------------------- *)
+(* Our output channel. *)
+
+let out =
+  lazy (open_out (Settings.base ^ ".conflicts"))
+
+(* -------------------------------------------------------------------------- *)
+(* Explaining shift actions. *)
+
+(* The existence of a shift action stems from the existence of a shift
+   item in the LR(0) core that underlies the LR(1) state of interest.
+   That is, lookahead sets are not relevant. The existence of a shift
+   item in the LR(0) core is explained by finding a path from a start
+   item to the shift item in the LR(0) nondeterministic automaton,
+   such that the symbols read along this path form the (previously
+   fixed) symbol string that leads to the conflict state in the LR(1)
+   automaton. There may be several such paths: a shortest one is
+   chosen. There may also be several shift items in the conflict
+   state: an arbitrary one is chosen. I believe it would not be
+   interesting to display traces for several shift items: they would
+   be identical except in their last line (where the desired shift
+   item actually appears). *)
+
+(* Symbolic execution of the nondeterministic LR(0) automaton. *)
+
+(* Configurations are pairs of an LR(0) item and an offset into
+   the input string, which indicates how much has been read so
+   far. *)
+
+type configuration0 =
+    Item.t * int
+
+(* This function builds a derivation out of a (nonempty, reversed) sequence of
+   configurations. The derivation is constructed from bottom to top, that is,
+   beginning at the last configuration and moving back towards to the start
+   configuration. *)
+
+let rec follow derivation offset' = function
+  | [] ->
+      assert (offset' = 0);
+      derivation
+  | (item, offset) :: configs ->
+      let _, _, rhs, pos, _ = Item.def item in
+      let derivation =
+       if offset = offset' then
+         (* This is an epsilon transition. Put a new root node on top of
+            the existing derivation. *)
+         Derivation.build pos rhs derivation None
+       else
+         (* This was a shift transition. Tack symbol in front of the
+            forest. *)
+         Derivation.prepend rhs.(pos) derivation
+      in
+      follow derivation offset configs
+
+(* Symbolic execution begins with a start item (corresponding
+   to one of the automaton's entry nodes), a fixed string of
+   input symbols, to be fully consumed, and a goal item. The
+   objective is to find a path through the automaton that
+   leads from the start configuration [(stop, 0)] to the goal
+   configuration [(stop, n)], where [n] is the length of the
+   input string. The automaton is explored via breadth-first
+   search. A hash table is used to record which configurations
+   have been visited and to build a spanning tree of shortest
+   paths. *)
+
+exception Done
+
+let explain_shift_item
+    (start : Item.t)
+    (input : Symbol.t array)
+    (stop : Item.t)
+    : Derivation.t =
+
+  let n =
+    Array.length input
+  in
+
+  let table : (configuration0, configuration0 option) Hashtbl.t =
+    Hashtbl.create 1023
+  in
+
+  let queue : configuration0 Queue.t =
+    Queue.create()
+  in
+
+  let enqueue ancestor config =
+    try
+      let _ = Hashtbl.find table config in
+      ()
+    with Not_found ->
+      Hashtbl.add table config ancestor;
+      Queue.add config queue
+  in
+
+  enqueue None (start, 0);
+  try
+    Misc.qiter (function (item, offset) as config ->
+
+      (* If the item we're looking at is the goal item and if
+        we have read all of the input symbols, stop. *)
+
+      if (Item.equal item stop) && (offset = n) then
+       raise Done;
+
+      (* Otherwise, explore the transitions out of this item. *)
+
+      let prod, _, rhs, pos, length = Item.def item in
+
+      (* Shift transition, followed only if the symbol matches
+        the symbol found in the input string. *)
+
+      if (pos < length)
+      && (offset < n)
+      && (Symbol.equal rhs.(pos) input.(offset)) then begin
+       let config' = (Item.import (prod, pos+1), offset+1) in
+       enqueue (Some config) config'
+      end;
+
+      (* Epsilon transitions. *)
+
+      if pos < length then
+       match rhs.(pos) with
+       | Symbol.N nt ->
+           Production.iternt nt (fun prod ->
+             let config' = (Item.import (prod, 0), offset) in
+             enqueue (Some config) config'
+            )
+       | Symbol.T _ ->
+           ()
+
+    ) queue;
+    assert false
+  with Done ->
+
+    (* We have found a (shortest) path from the start configuration to
+       the goal configuration. Turn it into an explicit derivation. *)
+
+    let configs = Misc.materialize table (stop, n) in
+    let _, _, rhs, pos, _ = Item.def stop in
+    let derivation = Derivation.tail pos rhs in
+    let derivation = follow derivation n configs in
+    derivation
+
+(* -------------------------------------------------------------------------- *)
+(* Explaining reduce actions. *)
+
+(* The existence of a reduce action stems from the existence of a
+   reduce item, whose lookahead set contains the token of interest, in
+   the state of interest. Here, lookahead sets are relevant only
+   insofar as they contain or do not contain the token of interest --
+   in other words, lookahead sets can be abstracted by Boolean
+   values. The existence of the reduce item is explained by finding a
+   path from a start item to the reduce item in the LR(1)
+   nondeterministic automaton, such that the symbols read along this
+   path form the (previously fixed) symbol string that leads to the
+   conflict state in the LR(1) automaton. There may be several such
+   paths: a shortest one is chosen. *)
+
+(* Symbolic execution of the nondeterministic LR(1) automaton. *)
+
+(* Configurations are pairs of an LR(1) item and an offset into the
+   input string, which indicates how much has been read so far. An
+   LR(1) item is itself represented as the combination of an LR(0)
+   item and a Boolean flag, telling whether the token of interest
+   appears or does not appear in the lookahead set. *)
+
+type configuration1 =
+    Item.t * bool * int
+
+(* This function builds a derivation out of a sequence of configurations. The
+   end of the sequence is dealt with specially -- we want to explain how the
+   lookahead symbol appears and is inherited. Once that is done, the rest
+   (that is, the beginning) of the derivation is dealt with as above. *)
+
+let config1toconfig0 (item, _, offset) =
+  (item, offset)
+
+let rec follow1 tok derivation offset' = function
+  | [] ->
+      assert (Terminal.equal tok Terminal.sharp);
+      (* One could emit a comment saying that the lookahead token is
+        initially [#]. That comment would have to be displayed above
+        the derivation, though, and there is no support for that
+        at the moment, so let's skip it. *)
+      derivation
+  | (item, _, offset) :: configs ->
+      let _, _, rhs, pos, length = Item.def item in
+      if offset = offset' then
+
+       (* This is an epsilon transition. Attack a new line and add
+          a comment that explains why the lookahead symbol is
+          produced or inherited. *)
+       
+       let nullable, first = Analysis.nullable_first_rhs rhs (pos + 1) in
+
+       if TerminalSet.mem tok first then
+
+         (* The lookahead symbol is produced (and perhaps also inherited,
+            but let's ignore that). *)
+
+         let e = Analysis.explain_first_rhs tok rhs (pos + 1) in
+         let comment =
+           "lookahead token appears" ^ (if e = "" then "" else " because " ^ e)
+         in
+         let derivation =
+           Derivation.build pos rhs derivation (Some comment)
+         in
+
+         (* Print the rest of the derivation without paying attention to
+            the lookahead symbols. *)
+
+         follow derivation offset (List.map config1toconfig0 configs)
+
+       else begin
+
+         (* The lookahead symbol is not produced, so it is definitely inherited. *)
+
+         assert nullable;
+
+         let comment =
+           "lookahead token is inherited" ^
+           (if pos + 1 < length then Printf.sprintf " because %scan vanish" (Symbol.printao (pos + 1) rhs) else "")
+         in
+         let derivation =
+           Derivation.build pos rhs derivation (Some comment)
+         in
+
+         follow1 tok derivation offset configs
+
+       end
+
+      else
+
+       (* This is a shift transition. Tack symbol in front of forest. *)
+
+       let derivation = 
+         Derivation.prepend rhs.(pos) derivation
+       in
+
+       follow1 tok derivation offset configs
+
+(* Symbolic execution is performed in the same manner as above. *)
+
+let explain_reduce_item
+    (tok : Terminal.t)
+    (start : Item.t)
+    (input : Symbol.t array)
+    (stop : Item.t)
+    : Derivation.t =
+
+  let n =
+    Array.length input
+  in
+
+  let table : (configuration1, configuration1 option) Hashtbl.t =
+    Hashtbl.create 1023
+  in
+
+  let queue : configuration1 Queue.t =
+    Queue.create()
+  in
+
+  let enqueue ancestor config =
+    try
+      let _ = Hashtbl.find table config in
+      ()
+    with Not_found ->
+      Hashtbl.add table config ancestor;
+      Queue.add config queue
+  in
+
+  (* If the lookahead token is #, then it initially appear in the lookahead
+     set, otherwise it doesn't. *)
+
+  enqueue None (start, Terminal.equal tok Terminal.sharp, 0);
+  try
+    Misc.qiter (function (item, lookahead, offset) as config ->
+
+      (* If the item we're looking at is the goal item and if
+        we have read all of the input symbols, stop. *)
+
+      if (Item.equal item stop) && lookahead && (offset = n) then
+       raise Done;
+
+      (* Otherwise, explore the transitions out of this item. *)
+
+      let prod, nt, rhs, pos, length = Item.def item in
+
+      (* Shift transition, followed only if the symbol matches
+        the symbol found in the input string. *)
+
+      if (pos < length)
+      && (offset < n)
+      && (Symbol.equal rhs.(pos) input.(offset)) then begin
+       let config' = (Item.import (prod, pos+1), lookahead, offset+1) in
+       enqueue (Some config) config'
+      end;
+
+      (* Epsilon transitions. *)
+
+      if pos < length then
+       match rhs.(pos) with
+       | Symbol.N nt ->
+           let nullable, first = Analysis.nullable_first_rhs rhs (pos + 1) in
+           let first : bool = TerminalSet.mem tok first in
+           let lookahead' =
+             if nullable then first || lookahead else first
+           in
+           Production.iternt nt (fun prod ->
+             let config' = (Item.import (prod, 0), lookahead', offset) in
+             enqueue (Some config) config'
+            )
+       | Symbol.T _ ->
+           ()
+
+    ) queue;
+    assert false
+  with Done ->
+
+    (* We have found a (shortest) path from the start configuration to
+       the goal configuration. Turn it into an explicit derivation. *)
+
+    let configs = Misc.materialize table (stop, true, n) in
+    let derivation = Derivation.empty in
+    let derivation = follow1 tok derivation n configs in
+    derivation
+
+(* -------------------------------------------------------------------------- *)
+(* Putting it all together. *)
+
+let () =
+  if Settings.explain then begin
+
+    Lr1.conflicts (fun toks node ->
+
+      (* Construct a partial LR(1) automaton, looking for a conflict
+        in a state that corresponds to this node. Because Pager's
+        algorithm can merge two states as soon as one of them has a
+        conflict, we can't be too specific about the conflict that we
+        expect to find in the canonical automaton. So, we must supply
+        a set of conflict tokens and accept any kind of conflict that
+        involves one of them. *)
+
+      (* TEMPORARY with the new compatibility criterion, we can be
+        sure that every conflict token is indeed involved in a
+        conflict. Exploit that? Avoid focusing on a single token? *)
+
+      let module P = Lr1partial.Run (struct
+       let tokens = toks
+       let goal = node
+      end) in
+
+      let closure =
+       Lr0.closure P.goal in
+
+      (* Determine what kind of conflict was found. *)
+
+      let shift, reduce = Item.Map.fold (fun item toks (shift, reduce) ->
+       match Item.classify item with
+       | Item.Shift (Symbol.T tok, _)
+         when Terminal.equal tok P.token ->
+             shift + 1, reduce
+       | Item.Reduce prod
+         when TerminalSet.mem P.token toks ->
+           shift, reduce + 1
+       | _ ->
+           shift, reduce
+      ) closure (0, 0) in
+
+      let kind =
+       if (shift > 0) && (reduce > 1) then
+         "shift/reduce/reduce"
+       else if (shift > 0) then
+         "shift/reduce"
+       else
+         "reduce/reduce"
+      in
+
+      (* Explain how the conflict state is reached. *)
+
+      let out = Lazy.force out in
+
+      Printf.fprintf out "\n\
+        ** Conflict (%s) in state %d.\n\
+       ** Token%s involved: %s\n%s\
+       ** This state is reached from %s after reading:\n\n%s\n"
+      kind (Lr1.number node)
+      (if TerminalSet.cardinal toks > 1 then "s" else "")
+      (TerminalSet.print toks)
+      (if TerminalSet.cardinal toks > 1 then
+       Printf.sprintf "** The following explanations concentrate on token %s.\n" (Terminal.print P.token)
+      else "")
+      (Nonterminal.print false (Item.startnt P.source))
+      (Symbol.printa P.path);
+
+      (* Examine the items in that state, focusing on one particular
+        token. Out of the shift items, we explain just one -- this
+        seems enough. We explain each of the reduce items. *)
+
+      (* First, build a mapping of items to derivations. *)
+
+      let (_ : bool), derivations =
+       Item.Map.fold (fun item toks (still_looking_for_shift_item, derivations) ->
+         match Item.classify item with
+
+         | Item.Shift (Symbol.T tok, _)
+           when still_looking_for_shift_item && (Terminal.equal tok P.token) ->
+
+             false,
+             let derivation = explain_shift_item P.source P.path item in
+             Item.Map.add item derivation derivations
+
+         | Item.Reduce prod
+           when TerminalSet.mem P.token toks ->
+
+             still_looking_for_shift_item,
+             let derivation = explain_reduce_item P.token P.source P.path item in
+             Item.Map.add item derivation derivations
+
+         | _ ->
+
+             still_looking_for_shift_item,
+             derivations
+
+        ) closure (true, Item.Map.empty)
+      in
+
+      (* Factor out the common context among all derivations, so as to avoid
+        repeating it. This helps prevent derivation trees from drifting too
+        far away towards the right. It also helps produce sub-derivations
+         that are quite compact. *)
+
+      let context, derivations =
+       Derivation.factor derivations
+      in
+
+      (* Display the common context. *)
+
+      Printf.fprintf out
+       "\n** The derivations that appear below have the following common factor:\
+        \n** (The question mark symbol (?) represents the spot where the derivations begin to differ.)\n\n";
+      Derivation.printc out context;
+
+      (* Then, display the sub-derivations. *)
+
+      Item.Map.iter (fun item derivation ->
+
+       Printf.fprintf out
+         "\n** In state %d, looking ahead at %s, "
+         (Lr1.number node)
+         (Terminal.print P.token);
+
+       begin match Item.classify item with
+       | Item.Shift _ ->
+           Printf.fprintf out "shifting is permitted\n** because of the following sub-derivation:\n\n"
+       | Item.Reduce prod ->
+           Printf.fprintf out
+             "reducing production\n** %s\n** is permitted because of the following sub-derivation:\n\n"
+             (Production.print prod)
+       end;
+
+       Derivation.print out derivation
+
+      ) derivations;
+
+      flush out
+
+    );
+    Time.tick "Explaining conflicts"
+
+  end
+
+(* ------------------------------------------------------------------------ *)
+(* Resolve the conflicts that remain in the automaton. *)
+
+let () =
+  Lr1.default_conflict_resolution();
+  Time.tick "Resolving remaining conflicts"
+
diff --git a/bundles/menhirLib/menhir-20120123/src/conflict.mli b/bundles/menhirLib/menhir-20120123/src/conflict.mli
new file mode 100644 (file)
index 0000000..176d4ff
--- /dev/null
@@ -0,0 +1,18 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* This module explains conflicts. Explanations are written
+   to the .conflicts file. No functionality is offered by this
+   module. *)
+
diff --git a/bundles/menhirLib/menhir-20120123/src/convert.ml b/bundles/menhirLib/menhir-20120123/src/convert.ml
new file mode 100644 (file)
index 0000000..94a41e6
--- /dev/null
@@ -0,0 +1,122 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the GNU Library General Public License, with the   *)
+(*  special exception on linking described in file LICENSE.               *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* An ocamlyacc-style, or Menhir-style, parser requires access to
+   the lexer, which must be parameterized with a lexing buffer, and
+   to the lexing buffer itself, where it reads position information. *)
+
+(* This traditional API is convenient when used with ocamllex, but
+   inelegant when used with other lexer generators. *)
+
+type ('token, 'semantic_value) traditional =
+    (Lexing.lexbuf -> 'token) -> Lexing.lexbuf -> 'semantic_value
+
+(* This revised API is independent of any lexer generator. Here, the
+   parser only requires access to the lexer, and the lexer takes no
+   parameters. The tokens returned by the lexer may contain position
+   information. *)
+
+type ('token, 'semantic_value) revised =
+    (unit -> 'token) -> 'semantic_value
+
+(* --------------------------------------------------------------------------- *)
+
+(* Converting a traditional parser, produced by ocamlyacc or Menhir,
+   into a revised parser. *)
+
+(* A token of the revised lexer is essentially a triple of a token
+   of the traditional lexer (or raw token), a start position, and
+   and end position. The three [get] functions are accessors. *)
+
+(* We do not require the type ['token] to actually be a triple type.
+   This enables complex applications where it is a record type with
+   more than three fields. It also enables simple applications where
+   positions are of no interest, so ['token] is just ['raw_token]
+   and [get_startp] and [get_endp] return dummy positions. *)
+
+let traditional2revised
+  (get_raw_token : 'token -> 'raw_token)
+  (get_startp    : 'token -> Lexing.position)
+  (get_endp      : 'token -> Lexing.position)
+  (parser : ('raw_token, 'semantic_value) traditional)
+: ('token, 'semantic_value) revised =
+
+  (* Accept a revised lexer. *)
+
+  fun (lexer : unit -> 'token) ->
+
+    (* Create a dummy lexing buffer. *)
+
+    let lexbuf : Lexing.lexbuf =
+      Lexing.from_string ""
+    in
+
+    (* Wrap the revised lexer as a traditional lexer. A traditional
+       lexer returns a raw token and updates the fields of the lexing
+       buffer with new positions, which will be read by the parser. *)
+
+    let lexer (lexbuf : Lexing.lexbuf) : 'raw_token =
+      let token : 'token = lexer() in
+      lexbuf.Lexing.lex_start_p <- get_startp token;
+      lexbuf.Lexing.lex_curr_p <- get_endp token;
+      get_raw_token token
+    in
+
+    (* Invoke the traditional parser. *)
+
+    parser lexer lexbuf
+
+(* --------------------------------------------------------------------------- *)
+
+(* Converting a revised parser back to a traditional parser. *)
+
+let revised2traditional
+  (make_token : 'raw_token -> Lexing.position -> Lexing.position -> 'token)
+  (parser : ('token, 'semantic_value) revised)
+: ('raw_token, 'semantic_value) traditional =
+
+  (* Accept a traditional lexer and a lexing buffer. *)
+
+  fun (lexer : Lexing.lexbuf -> 'raw_token) (lexbuf : Lexing.lexbuf) ->
+
+    (* Wrap the traditional lexer as a revised lexer. *)
+
+    let lexer () : 'token =
+      let token : 'raw_token = lexer lexbuf in
+      make_token token lexbuf.Lexing.lex_start_p lexbuf.Lexing.lex_curr_p
+    in
+
+    (* Invoke the revised parser. *)
+
+    parser lexer
+
+(* --------------------------------------------------------------------------- *)
+
+(* Simplified versions of the above, where concrete triples are used. *)
+
+module Simplified = struct
+
+  let traditional2revised parser =
+    traditional2revised
+      (fun (token, _, _)  -> token)
+      (fun (_, startp, _) -> startp)
+      (fun (_, _, endp)   -> endp)
+      parser
+
+  let revised2traditional parser =
+    revised2traditional
+      (fun token startp endp -> (token, startp, endp))
+      parser
+
+end
diff --git a/bundles/menhirLib/menhir-20120123/src/convert.mli b/bundles/menhirLib/menhir-20120123/src/convert.mli
new file mode 100644 (file)
index 0000000..cede992
--- /dev/null
@@ -0,0 +1,78 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the GNU Library General Public License, with the   *)
+(*  special exception on linking described in file LICENSE.               *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* An ocamlyacc-style, or Menhir-style, parser requires access to
+   the lexer, which must be parameterized with a lexing buffer, and
+   to the lexing buffer itself, where it reads position information. *)
+
+(* This traditional API is convenient when used with ocamllex, but
+   inelegant when used with other lexer generators. *)
+
+type ('token, 'semantic_value) traditional =
+    (Lexing.lexbuf -> 'token) -> Lexing.lexbuf -> 'semantic_value
+
+(* This revised API is independent of any lexer generator. Here, the
+   parser only requires access to the lexer, and the lexer takes no
+   parameters. The tokens returned by the lexer may contain position
+   information. *)
+
+type ('token, 'semantic_value) revised =
+    (unit -> 'token) -> 'semantic_value
+
+(* --------------------------------------------------------------------------- *)
+
+(* Converting a traditional parser, produced by ocamlyacc or Menhir,
+   into a revised parser. *)
+
+(* A token of the revised lexer is essentially a triple of a token
+   of the traditional lexer (or raw token), a start position, and
+   and end position. The three [get] functions are accessors. *)
+
+(* We do not require the type ['token] to actually be a triple type.
+   This enables complex applications where it is a record type with
+   more than three fields. It also enables simple applications where
+   positions are of no interest, so ['token] is just ['raw_token]
+   and [get_startp] and [get_endp] return dummy positions. *)
+
+val traditional2revised:
+  ('token -> 'raw_token) ->
+  ('token -> Lexing.position) ->
+  ('token -> Lexing.position) ->
+  ('raw_token, 'semantic_value) traditional ->
+  ('token, 'semantic_value) revised
+
+(* --------------------------------------------------------------------------- *)
+
+(* Converting a revised parser back to a traditional parser. *)
+
+val revised2traditional:
+  ('raw_token -> Lexing.position -> Lexing.position -> 'token) ->
+  ('token, 'semantic_value) revised ->
+  ('raw_token, 'semantic_value) traditional
+
+(* --------------------------------------------------------------------------- *)
+
+(* Simplified versions of the above, where concrete triples are used. *)
+
+module Simplified : sig
+
+  val traditional2revised:
+    ('token, 'semantic_value) traditional ->
+    ('token * Lexing.position * Lexing.position, 'semantic_value) revised
+
+  val revised2traditional:
+    ('token * Lexing.position * Lexing.position, 'semantic_value) revised ->
+    ('token, 'semantic_value) traditional
+
+end
diff --git a/bundles/menhirLib/menhir-20120123/src/coqBackend.ml b/bundles/menhirLib/menhir-20120123/src/coqBackend.ml
new file mode 100644 (file)
index 0000000..e5381da
--- /dev/null
@@ -0,0 +1,456 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+open Printf
+open Grammar
+
+module Run (T: sig end) = struct
+
+  let print_term t =
+    assert (not (Terminal.pseudo t));
+    sprintf "%s_t" (Terminal.print t)
+
+  let print_nterm nt =
+    sprintf "%s_nt" (Nonterminal.print true nt)
+
+  let print_symbol = function
+    | Symbol.N nt -> sprintf "NT %s" (print_nterm nt)
+    | Symbol.T t -> sprintf "T %s" (print_term t)
+
+  let print_type ty =
+    if Settings.coq_no_actions then
+      "unit"
+    else
+      match ty with
+        | None -> raise Not_found
+        | Some t -> match t with
+           | Stretch.Declared s -> s.Stretch.stretch_content
+           | Stretch.Inferred _ -> assert false (* We cannot infer coq types *)
+
+  let print_nis nis =
+    sprintf "Nis_%d" (Lr1.number nis)
+
+  let print_st st =
+    match Lr1.incoming_symbol st with
+      | Some _ -> sprintf "Ninit %s" (print_nis st)
+      | None -> "Init"
+
+  let print_prod p =
+    sprintf "Prod_%d" (Production.p2i p)
+
+  let print_pseudoprod p =
+    match Production.classify p with
+      | None -> sprintf "Some %s" (print_prod p)
+      | Some _ -> "None"
+
+  let start_nt =
+    match
+      ProductionMap.fold (fun _ rhs accu ->
+        match accu with
+          | None -> (match rhs with [|Symbol.N nt|] -> Some nt | _ -> assert false)
+          | _ -> Error.error [] ("Multiple start symbols are not supported "^
+                                 "by the coq back-end"))
+        (ProductionMap.start Production.rhs)
+        None
+    with
+      | Some start -> start
+      | _ -> Error.error [] "There is no start symbol"
+
+  let () =
+    if not Settings.coq_no_actions then
+      begin
+        Nonterminal.iterx (fun nonterminal ->
+          match Nonterminal.ocamltype nonterminal with
+            | None -> Error.error [] (sprintf "I don't know the type of non-terminal %s"
+                                     (Nonterminal.print false nonterminal))
+            | Some _ -> ());
+        Production.iterx (fun prod ->
+          let act =  Production.action prod in
+          if Action.has_previouserror act || Action.has_syntaxerror act ||
+            Action.has_leftstart act || Action.has_leftend act ||
+            Action.use_dollar act then
+              Error.error [] ("$previouserror, $syntaxerror, $start, $end, $i are not "^
+                             "supported by the coq back-end"))
+      end;
+
+    Production.iterx (fun prod ->
+      Array.iter (fun symb ->
+        match symb with
+          | Symbol.T t ->
+              if t = Terminal.error then
+                Error.error [] "The coq back-end does not support error"
+          | _ -> ())
+        (Production.rhs prod));
+
+    if Front.grammar.UnparameterizedSyntax.parameters <> [] then
+      Error.error [] "The coq back-end does not support %parameter"
+
+  let write_inductive_alphabet f name constrs =
+    fprintf f "Inductive %s' :=" name;
+    List.iter (fprintf f "\n  | %s") constrs;
+    fprintf f ".\n";
+    fprintf f "Definition %s := %s'.\n\n" name name;
+    if List.length constrs > 0 then
+      begin
+        let iteri f = ignore (List.fold_left (fun k x -> f k x; succ k) 0 constrs) in
+        fprintf f "Open Scope N_scope.\n";
+        fprintf f "Program Instance %sNum : Numbered %s :=\n" name name;
+        fprintf f "  { injN := fun x => match x return _ with ";
+        iteri (fun k constr -> fprintf f "| %s => %d " constr k);
+        fprintf f "end;\n";
+        fprintf f "    surjN := fun n => match n return _ with ";
+        iteri (fprintf f "| %d => %s ");
+        fprintf f "| _ => %s end;\n" (List.hd constrs);
+        fprintf f "  injN_bound := %d }.\n" (List.length constrs);
+        fprintf f "Solve Obligations using (intro x; case x; reflexivity).\n\n";
+      end
+    else
+      begin
+        fprintf f "Program Instance %sAlph : Alphabet %s :=\n" name name;
+        fprintf f "  { AlphabetComparable := {| compare := fun x y =>\n";
+        fprintf f "      match x, y return comparison with end |};\n";
+        fprintf f "    AlphabetEnumerable := {| all_list := [] |} }.";
+        fprintf f "Solve Obligations using (intro x; case x)."
+      end
+
+  let write_terminals f =
+    write_inductive_alphabet f "terminal" (
+      Terminal.fold (fun t l -> if Terminal.pseudo t then l else print_term t::l)
+        []);
+    fprintf f "Instance TerminalAlph : Alphabet terminal := _.\n\n"
+
+  let write_nonterminals f =
+    write_inductive_alphabet f "nonterminal" (
+      Nonterminal.foldx (fun nt l -> (print_nterm nt)::l) []);
+    fprintf f "Instance NonTerminalAlph : Alphabet nonterminal := _.\n\n"
+
+  let write_symbol_semantic_type f =
+    fprintf f "Definition symbol_semantic_type (s:symbol) : Type:=\n";
+    fprintf f "  match s with\n";
+
+    fprintf f "    | T t =>\n";
+    fprintf f "      match t with\n";
+    Terminal.iter (fun terminal ->
+      if not (Terminal.pseudo terminal) then
+        fprintf f "        | %s => %s%%type\n"
+          (print_term terminal)
+          (try print_type (Terminal.ocamltype terminal) with Not_found -> "unit")
+    );
+    fprintf f "      end\n";
+
+    fprintf f "    | NT nt =>\n";
+    fprintf f "      match nt with\n";
+    Nonterminal.iterx (fun nonterminal ->
+                         fprintf f "        | %s => %s%%type\n"
+                          (print_nterm nonterminal)
+                          (print_type (Nonterminal.ocamltype nonterminal)));
+    fprintf f "      end\n";
+
+    fprintf f "  end.\n\n"
+
+  let write_productions f =
+    write_inductive_alphabet f "production" (
+      Production.foldx (fun prod l -> (print_prod prod)::l) []);
+    fprintf f "Instance ProductionAlph : Alphabet production := _.\n\n"
+
+  let write_productions_contents f =
+    fprintf f "Definition prod_contents (p:production) :\n";
+    fprintf f "  { p:nonterminal * list symbol &\n";
+    fprintf f "    arrows (map symbol_semantic_type (snd p))\n";
+    fprintf f "      (symbol_semantic_type (NT (fst p))) }\n";
+    fprintf f " :=\n";
+    fprintf f "  let box := existT (fun p =>\n";
+    fprintf f "    arrows (map symbol_semantic_type (snd p))\n";
+    fprintf f "      (symbol_semantic_type (NT (fst p))))\n";
+    fprintf f "  in\n";
+    fprintf f "  match p with\n";
+    Production.iterx (fun prod ->
+      fprintf f "    | %s => box\n" (print_prod prod);
+      fprintf f "      (%s, [%s])\n"
+        (print_nterm (Production.nt prod))
+        (String.concat "; "
+           (List.map print_symbol (Array.to_list (Production.rhs prod))));
+      if Production.length prod = 0 then
+        fprintf f "      (\n"
+      else
+        fprintf f "      (fun %s => \n"
+          (String.concat " " (Array.to_list (Production.identifiers prod)));
+      if Settings.coq_no_actions then
+        fprintf f "()"
+      else
+        Action.print f (Production.action prod);
+      fprintf f "\n)\n");
+    fprintf f "  end.\n\n";
+
+    fprintf f "Definition prod_lhs (p:production) :=\n";
+    fprintf f "  fst (projT1 (prod_contents p)).\n";
+    fprintf f "Definition prod_rhs (p:production) :=\n";
+    fprintf f "  snd (projT1 (prod_contents p)).\n";
+    fprintf f "Definition prod_action (p:production) :=\n";
+    fprintf f "  projT2 (prod_contents p).\n\n"
+
+  let write_nullable_first f =
+    fprintf f "Definition nullable_nterm (nt:nonterminal) : bool :=\n";
+    fprintf f "  match nt with\n";
+    Nonterminal.iterx (fun nt ->
+      fprintf f "    | %s => %b\n"
+        (print_nterm nt)
+        (fst (Analysis.nullable_first_rhs (Array.of_list [Symbol.N nt]) 0)));
+    fprintf f "  end.\n\n";
+
+    fprintf f "Definition first_nterm (nt:nonterminal) : list terminal :=\n";
+    fprintf f "  match nt with\n";
+    Nonterminal.iterx (fun nt ->
+      let firstSet =
+        snd (Analysis.nullable_first_rhs (Array.of_list [Symbol.N nt]) 0)
+      in
+      fprintf f "    | %s => [" (print_nterm nt);
+      let first = ref true in
+      TerminalSet.iter (fun t ->
+        if !first then first := false else fprintf f "; ";
+        fprintf f "%s" (print_term t)
+        ) firstSet;
+      fprintf f "]\n");
+    fprintf f "  end.\n\n"
+
+  let write_grammar f =
+    fprintf f "Module Import Gram <: Grammar.T.\n\n";
+    write_terminals f;
+    write_nonterminals f;
+    fprintf f "Include Grammar.Symbol.\n\n";
+    write_symbol_semantic_type f;
+    write_productions f;
+    write_productions_contents f;
+    fprintf f "Definition start_symbol := %s.\n\n" (print_symbol (Symbol.N start_nt));
+    fprintf f "Include Grammar.Defs.\n\n";
+    fprintf f "End Gram.\n\n"
+
+  let write_nis f =
+    write_inductive_alphabet f "noninitstate" (
+      Lr1.foldx (fun l node -> (print_nis node)::l) []);
+    fprintf f "Instance NonInitStateAlph : Alphabet noninitstate := _.\n\n"
+
+  let write_actions f =
+    fprintf f "Definition action_table (state:state) :\n";
+    fprintf f "    default_action + (forall term:terminal, action term) :=\n";
+    fprintf f "  match state with\n";
+    Lr1.iter (fun node ->
+      fprintf f "    | %s => " (print_st node);
+      match Invariant.has_default_reduction node with
+        | Some (prod, _) ->
+            begin match Production.classify prod with
+              | Some _ -> fprintf f "inl Accept_act\n"
+              | None ->
+                  fprintf f "inl (Default_reduce_act %s)\n" (print_prod prod)
+            end
+        | None ->
+            fprintf f "inr (fun terminal:terminal =>\n";
+            fprintf f "      match terminal return action terminal with\n";
+            let has_fail = ref false in
+            Terminal.iter (fun t ->
+              if not (Terminal.pseudo t) then
+                begin
+                  try
+                    let target = SymbolMap.find (Symbol.T t) (Lr1.transitions node) in
+                    fprintf f "        | %s => Shift_act %s (eq_refl _)\n" (print_term t) (print_nis target)
+                  with Not_found ->
+                    try
+                      let prod =
+                        Misc.single (TerminalMap.find t (Lr1.reductions node))
+                      in
+                      fprintf f "        | %s => Reduce_act %s\n" (print_term t) (print_prod prod)
+                    with Not_found -> has_fail := true
+                end);
+            if !has_fail then
+              fprintf f "        | _ => Fail_act\n";
+            fprintf f "      end)\n"
+    );
+    fprintf f "  end.\n\n"
+
+  let write_gotos f =
+    fprintf f "Definition goto_table (state:state) (nt:nonterminal) :=\n";
+    fprintf f "  match state, nt return option { s:noninitstate | last_symb_of_non_init_state s = NT nt } with\n";
+    Lr1.iter (fun node ->
+      Nonterminal.iterx (fun nt ->
+        try
+          let target = SymbolMap.find (Symbol.N nt) (Lr1.transitions node) in
+          fprintf f "    | %s, %s => Some (exist _ %s (eq_refl _))\n"
+            (print_st node) (print_nterm nt) (print_nis target)
+        with Not_found -> ()));
+    fprintf f "    | _, _ => None\n";
+    fprintf f "  end.\n\n"
+
+  let write_last_symb f =
+    fprintf f "Definition last_symb_of_non_init_state (noninitstate:noninitstate) : symbol :=\n";
+    fprintf f "  match noninitstate with\n";
+    Lr1.iterx (fun node ->
+      match Lr1.incoming_symbol node with
+        | Some s -> fprintf f "    | %s => %s\n" (print_nis node) (print_symbol s)
+        | None -> assert false);
+    fprintf f "  end.\n\n"
+
+  let write_past_symb f =
+    fprintf f "Definition past_symb_of_non_init_state (noninitstate:noninitstate) : list symbol :=\n";
+    fprintf f "  match noninitstate with\n";
+    Lr1.iterx (fun node ->
+      let s =
+        String.concat "; " (List.tl
+          (Invariant.fold (fun l _ symb _ -> print_symbol symb::l)
+             [] (Invariant.stack node)))
+      in
+      fprintf f "    | %s => [%s]\n" (print_nis node) s);
+    fprintf f "  end.\n";
+    fprintf f "Extract Constant past_symb_of_non_init_state => \"fun _ -> []\".\n\n"
+
+  let write_past_states f =
+    fprintf f "Definition past_state_of_non_init_state (s:noninitstate) : list (state -> bool) :=\n";
+    fprintf f "  match s with\n";
+    Lr1.iterx (fun node ->
+      let s =
+        String.concat ";\n        " (Invariant.fold
+          (fun accu _ _ states ->
+             let b = Buffer.create 16 in
+             bprintf b "fun s:state =>\n";
+             bprintf b "          match s return bool with\n";
+             bprintf b "            ";
+             Lr1.NodeSet.iter
+               (fun st -> bprintf b "| %s " (print_st st)) states;
+             bprintf b "=> true\n";
+             bprintf b "            | _ => false\n";
+             bprintf b "          end";
+             Buffer.contents b::accu)
+          [] (Invariant.stack node))
+      in
+      fprintf f "    | %s =>\n      [ %s ]\n" (print_nis node) s);
+    fprintf f "  end.\n\n";
+    fprintf f "Extract Constant past_state_of_non_init_state => \"fun _ -> []\".\n\n"
+
+  let write_items f =
+    if not Settings.coq_no_complete then
+      begin
+       Lr1.iter (fun node ->
+         fprintf f "Definition items_of_state_%d : list item :=\n" (Lr1.number node);
+          fprintf f "  [ ";
+          let first = ref true in
+          Item.Map.iter (fun item lookaheads ->
+            let prod, pos = Item.export item in
+            if !first then first := false
+            else fprintf f ";\n    ";
+            fprintf f "{| pseudoprod_item := %s;\n" (print_pseudoprod prod);
+            fprintf f "      dot_pos_item := %d;\n" pos;
+            fprintf f "      lookaheads_item := [";
+           let first = ref true in
+            let lookaheads =
+              if TerminalSet.mem Terminal.sharp lookaheads then TerminalSet.universe
+              else lookaheads
+            in
+           TerminalSet.iter (fun lookahead ->
+                if !first then first := false
+               else fprintf f "; ";
+               fprintf f "%s" (print_term lookahead)
+             ) lookaheads;
+           fprintf f "] |}"
+          )  (Lr0.closure (Lr0.export (Lr1.state node)));
+          fprintf f " ].\n";
+         fprintf f "Extract Inlined Constant items_of_state_%d => \"assert false\".\n\n" (Lr1.number node)
+        );
+
+       fprintf f "Definition items_of_state (s:state) : list item :=\n";
+       fprintf f "  match s with\n";
+       Lr1.iter (fun node ->
+         fprintf f "    | %s => items_of_state_%d\n" (print_st node) (Lr1.number node));
+       fprintf f "  end.\n";
+      end
+    else
+      fprintf f "Definition items_of_state (s:state): list item := [].\n";
+    fprintf f "Extract Constant items_of_state => \"fun _ -> []\".\n\n"
+
+  let write_automaton f =
+    fprintf f "Module Aut <: Automaton.T.\n\n";
+    fprintf f "Module Gram := Gram.\n";
+    fprintf f "Module GramDefs := Gram.\n\n";
+    write_nullable_first f;
+    write_nis f;
+    write_last_symb f;
+    fprintf f "Include Automaton.Types.\n\n";
+    write_actions f;
+    write_gotos f;
+    write_past_symb f;
+    write_past_states f;
+    write_items f;
+    fprintf f "End Aut.\n\n"
+
+  let write_theorems f =
+    fprintf f "Require Import Main.\n\n";
+
+    fprintf f "Module Parser := Main.Make Aut.\n";
+
+    fprintf f "Theorem safe:\n";
+    fprintf f "  Parser.safe_validator = true.\n";
+    fprintf f "Proof eq_refl true<:Parser.safe_validator = true.\n\n";
+
+    if not Settings.coq_no_complete then
+      begin
+        fprintf f "Theorem complete:\n";
+        fprintf f "  Parser.complete_validator = true.\n";
+        fprintf f "Proof eq_refl true<:Parser.complete_validator = true.\n\n";
+      end;
+
+    fprintf f "Definition parse := Parser.parse safe.\n\n";
+
+    fprintf f "Theorem parse_correct iterator buffer:\n";
+    fprintf f "  match parse iterator buffer with\n";
+    fprintf f "    | Parser.Inter.Parsed_pr sem buffer_new =>\n";
+    fprintf f "      exists word,\n";
+    fprintf f "        buffer = Parser.Inter.app_str word buffer_new /\\\n";
+    fprintf f "        Gram.has_semantic_value word sem\n";
+    fprintf f "    | _ => True\n";
+    fprintf f "  end.\n";
+    fprintf f "Proof. apply Parser.parse_correct. Qed.\n\n";
+
+    if not Settings.coq_no_complete then
+      begin
+        fprintf f "Theorem parse_complete (iterator:nat) word buffer_end (output:%s):\n"
+          (print_type (Nonterminal.ocamltype start_nt));
+        fprintf f "  forall tree:Gram.parse_tree (%s) word output,\n" (print_symbol (Symbol.N start_nt));
+        fprintf f "  match parse iterator (Parser.Inter.app_str word buffer_end) with\n";
+        fprintf f "    | Parser.Inter.Fail_pr => False\n";
+        fprintf f "    | Parser.Inter.Parsed_pr output_res buffer_end_res =>\n";
+        fprintf f "      output_res = output /\\ buffer_end_res = buffer_end  /\\\n";
+        fprintf f "      ge iterator (Gram.parse_tree_size tree+2)\n";
+        fprintf f "    | Parser.Inter.Timeout_pr => lt iterator (Gram.parse_tree_size tree+2)\n";
+        fprintf f "  end.\n";
+        fprintf f "Proof. apply Parser.parse_complete; exact complete. Qed.\n\n";
+      end
+
+  let write_all f =
+    if not Settings.coq_no_actions then
+      List.iter (fun s -> fprintf f "%s\n\n" s.Stretch.stretch_content)
+        Front.grammar.UnparameterizedSyntax.preludes;
+
+    fprintf f "Require Import List.\n";
+    fprintf f "Require Import Syntax.\n";
+    fprintf f "Require Import NArith.\n";
+    fprintf f "Require Import Tuples.\n";
+    fprintf f "Require Import Alphabet.\n";
+    fprintf f "Require Grammar.\n";
+    fprintf f "Require Automaton.\n\n";
+    write_grammar f;
+    write_automaton f;
+    write_theorems f;
+
+    if not Settings.coq_no_actions then
+      List.iter (fprintf f "\n\n%s")
+        Front.grammar.UnparameterizedSyntax.postludes
+end
diff --git a/bundles/menhirLib/menhir-20120123/src/coqBackend.mli b/bundles/menhirLib/menhir-20120123/src/coqBackend.mli
new file mode 100644 (file)
index 0000000..199ff3b
--- /dev/null
@@ -0,0 +1,21 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* The coq code generator. *)
+
+module Run (T: sig end) : sig
+
+  val write_all: out_channel -> unit
+
+end
diff --git a/bundles/menhirLib/menhir-20120123/src/cst.ml b/bundles/menhirLib/menhir-20120123/src/cst.ml
new file mode 100644 (file)
index 0000000..6f8db99
--- /dev/null
@@ -0,0 +1,108 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+open Grammar
+
+(* Concrete syntax trees. *)
+
+(* A concrete syntax tree is one of a leaf -- which corresponds to a
+   terminal symbol; a node -- which corresponds to a non-terminal
+   symbol, and whose immediate descendants form an expansion of that
+   symbol; or an error leaf -- which corresponds to a point where the
+   [error] pseudo-token was shifted. *)
+
+type cst =
+  | CstTerminal of Terminal.t
+  | CstNonTerminal of Production.index * cst array
+  | CstError
+
+(* This is a (mostly) unambiguous printer for concrete syntax trees,
+   in an sexp-like notation. *)
+
+let rec pcst b = function
+  | CstTerminal tok ->
+
+      (* A leaf is denoted by a terminal symbol. *)
+
+      Printf.bprintf b "%s" (Terminal.print tok)
+
+  | CstNonTerminal (prod, csts) ->
+      
+      (* A node is denoted by a bracketed, whitespace-separated list,
+        whose head is a non-terminal symbol (followed with a colon)
+        and whose tail consists of the node's descendants. *)
+
+      (* There is in fact some ambiguity in this notation, since we
+        only print the non-terminal symbol that forms the left-hand
+        side of production [prod], instead of the production itself.
+
+        This abuse makes things much more readable, and should be
+        acceptable for the moment. The cases where ambiguity actually
+        arises should be rare. *)
+
+      Printf.bprintf b "[%s:%a]"
+       (Nonterminal.print false (Production.nt prod))
+       pcsts csts
+
+  | CstError ->
+
+      (* An error leaf is denoted by [error]. *)
+
+      Printf.bprintf b "error"
+
+and pcsts b (csts : cst array) =
+  Array.iter (fun cst ->
+    Printf.bprintf b " %a" pcst cst
+  ) csts
+
+(* This is the public interface. *)
+
+let wrap print f x =
+  let b = Buffer.create 32768 in
+  print b x;
+  Buffer.output_buffer f b
+
+let print =
+  wrap pcst
+
+(* This is a pretty-printer for concrete syntax trees. The notation is
+   the same as that used by the above printer; the only difference is
+   that the [Pprint] library is used to manage indentation. *)
+
+open Pprint 
+
+let rec build : cst -> document = function
+  | CstTerminal tok ->
+      text (Terminal.print tok)
+  | CstNonTerminal (prod, csts) ->
+      brackets (
+       group (
+         text (Nonterminal.print false (Production.nt prod)) ^^
+         colon ^^
+         group (
+           nest 2 (
+             Array.fold_left (fun doc cst ->
+               doc ^^ break1 ^^ build cst
+             ) empty csts
+           )
+         ) ^^
+         break0
+       )
+      )
+  | CstError ->
+      text "error"
+
+let show f cst =
+  Channel.pretty 0.8 80 f (build cst)
+
diff --git a/bundles/menhirLib/menhir-20120123/src/cst.mli b/bundles/menhirLib/menhir-20120123/src/cst.mli
new file mode 100644 (file)
index 0000000..b4a1796
--- /dev/null
@@ -0,0 +1,40 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+open Grammar
+
+(* Concrete syntax trees. *)
+
+(* A concrete syntax tree is one of a leaf -- which corresponds to a
+   terminal symbol; a node -- which corresponds to a non-terminal
+   symbol, and whose immediate descendants form an expansion of that
+   symbol; or an error leaf -- which corresponds to a point where the
+   [error] pseudo-token was shifted. *)
+
+type cst =
+  | CstTerminal of Terminal.t
+  | CstNonTerminal of Production.index * cst array
+  | CstError
+
+(* This is a (mostly) unambiguous printer for concrete syntax trees,
+   in an sexp-like notation. *)
+
+val print: out_channel -> cst -> unit
+
+(* This is a pretty-printer for concrete syntax trees. The notation is
+   the same as that used by the above printer; the only difference is
+   that the [Pprint] library is used to manage indentation. *)
+
+val show: out_channel -> cst -> unit
+
diff --git a/bundles/menhirLib/menhir-20120123/src/derivation.ml b/bundles/menhirLib/menhir-20120123/src/derivation.ml
new file mode 100644 (file)
index 0000000..1224fd1
--- /dev/null
@@ -0,0 +1,328 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+open Grammar
+
+(* -------------------------------------------------------------------------- *)
+
+(* This is a data structure for linear derivation trees. These are derivation
+   trees that are list-like (that is, they do not branch), because a single
+   path is of interest.
+
+   A tree is either empty or formed of a non-terminal symbol at the root and a
+   forest below the root.
+
+   A forest is an ordered list of elements. However, its elements are not
+   trees, as one would perhaps expect. Because we are interested in *linear*
+   derivation trees, only one element of the forest receives focus and is a
+   tree. All other elements remain un-expanded, so they are just symbols.
+
+   In other words, a linear derivation tree is roughly just a list of levels,
+   where each forest corresponds to one level. *)
+
+type 'focus level = {
+    prefix: Symbol.t list;
+    focus: 'focus;
+    suffix: Symbol.t list;
+    comment: string
+  }
+
+type tree =
+  | TEmpty
+  | TRooted of Symbol.t * forest
+
+and forest =
+    tree level
+
+(* We make use of contexts with a forest-shaped hole. We have tree contexts
+   and forest contexts.
+
+   Tree contexts do not have a case for holes, since we work with
+   forest-shaped holes only. Forest contexts have one. *)
+
+type ctree =
+  | CRooted of Symbol.t * cforest
+
+and cforest =
+  | CHole
+  | CCons of ctree level
+
+(* Make a few types visible to clients. *)
+
+type t =
+    forest
+
+type context =
+    cforest
+
+(* -------------------------------------------------------------------------- *)
+
+(* Construction. *)
+
+let rec array_to_list a i j =
+  if i = j then
+    []
+  else
+    a.(i) :: array_to_list a (i + 1) j
+
+let empty =
+  {
+    prefix = [];
+    focus = TEmpty;
+    suffix = [];
+    comment = ""
+  }
+
+let tail pos rhs =
+  let length = Array.length rhs in
+  assert (pos < length);
+  {
+    prefix = [];
+    focus = TEmpty;
+    suffix = array_to_list rhs pos length;
+    comment = ""
+  }
+
+let build pos rhs forest comment =
+  let length = Array.length rhs in
+  assert (pos < length);
+  match rhs.(pos) with
+  | Symbol.T _ ->
+      assert false
+  | Symbol.N _ as symbol ->
+      {
+       prefix = [];
+       focus = TRooted (symbol, forest);
+       suffix = array_to_list rhs (pos + 1) length;
+       comment = (match comment with None -> "" | Some comment -> comment)
+      }
+
+let prepend symbol forest =
+  { forest with
+    prefix = symbol :: forest.prefix }
+
+(* -------------------------------------------------------------------------- *)
+
+(* Display. *)
+
+let buffer =
+  Buffer.create 32768
+
+let rec print_blank k =
+  if k > 0 then begin
+    Buffer.add_char buffer ' ';
+    print_blank (k - 1)
+  end
+
+let print_symbol symbol =
+  let word = Symbol.print symbol in
+  Buffer.add_string buffer word;
+  Buffer.add_char buffer ' ';
+  String.length word + 1
+
+let print_symbols symbols =
+  List.fold_left (fun offset symbol ->
+    offset + print_symbol symbol
+  ) 0 symbols
+
+let print_level print_focus_root print_focus_remainder offset forest =
+  print_blank offset;
+  let offset = offset + print_symbols forest.prefix in
+  print_focus_root forest.focus;
+  let (_ : int) = print_symbols forest.suffix in
+  if String.length forest.comment > 0 then begin
+    Buffer.add_string buffer "// ";
+    Buffer.add_string buffer forest.comment
+  end;
+  Buffer.add_char buffer '\n';
+  print_focus_remainder offset forest.focus
+
+let print_tree_root = function
+  | TEmpty ->
+      Buffer.add_string buffer ". "
+  | TRooted (symbol, _) ->
+      let (_ : int) = print_symbol symbol in
+      ()
+
+let rec print_forest offset forest =
+  print_level print_tree_root print_tree_remainder offset forest
+
+and print_tree_remainder offset = function
+  | TEmpty ->
+      ()
+  | TRooted (_, forest) ->
+      print_forest offset forest
+
+let print_ctree_root = function
+  | CRooted (symbol, _) ->
+      let (_ : int) = print_symbol symbol in
+      ()
+
+let rec print_cforest offset cforest =
+  match cforest with
+  | CHole ->
+      print_blank offset;
+      Buffer.add_string buffer "(?)\n"
+  | CCons forest ->
+      print_level print_ctree_root print_ctree_remainder offset forest
+
+and print_ctree_remainder offset = function
+  | CRooted (_, cforest) ->
+      print_cforest offset cforest
+
+let wrap print channel x =
+  Buffer.clear buffer;
+  print 0 x;
+  Buffer.output_buffer channel buffer
+
+let print =
+  wrap print_forest
+
+let printc =
+  wrap print_cforest
+
+(* -------------------------------------------------------------------------- *)
+
+(* [punch] turns a (tree or forest) into a pair of a (tree or forest) context
+   and a residual forest, where the context is chosen maximal. In other words,
+   the residual forest consists of a single level -- its focus is [TEmpty]. *)
+
+let rec punch_tree tree : (ctree * forest) option =
+  match tree with
+  | TEmpty ->
+      None
+  | TRooted (symbol, forest) ->
+      let forest1, forest2 = punch_forest forest in
+      Some (CRooted (symbol, forest1), forest2)
+
+and punch_forest forest : cforest * forest =
+  match punch_tree forest.focus with
+  | None ->
+      CHole, forest
+  | Some (ctree1, forest2) ->
+      CCons {
+        prefix = forest.prefix;
+        focus = ctree1;
+        suffix = forest.suffix;
+        comment = forest.comment
+      }, forest2
+
+(* [fill] fills a (tree or forest) context with a forest so as to produce
+   a new (tree or forest). *)
+
+let rec fill_tree ctree1 forest2 : tree =
+  match ctree1 with
+  | CRooted (symbol1, cforest1) ->
+      TRooted (symbol1, fill_forest cforest1 forest2)
+
+and fill_forest cforest1 forest2 : forest =
+  match cforest1 with
+  | CHole ->
+      forest2
+  | CCons level1 ->
+      {
+        prefix = level1.prefix;
+        focus = fill_tree level1.focus forest2;
+        suffix = level1.suffix;
+        comment = level1.comment
+      }
+
+(* [common] factors the maximal common (tree or forest) context out of a pair
+   of a (tree or forest) context and a (tree or forest). It returns the (tree
+   or forest) context as well as the residuals of the two parameters. *)
+
+let rec common_tree ctree1 tree2 : (ctree * cforest * forest) option =
+  match ctree1, tree2 with
+  | CRooted _, TEmpty ->
+      None
+  | CRooted (symbol1, cforest1), TRooted (symbol2, forest2) ->
+      if Symbol.equal symbol1 symbol2 then
+       let cforest, cforest1, forest2 =
+         common_forest cforest1 forest2
+       in
+       Some (CRooted (symbol1, cforest), cforest1, forest2)
+      else
+       None
+
+and common_forest cforest1 forest2 : cforest * cforest * forest =
+  match cforest1 with
+  | CHole ->
+      CHole, cforest1, forest2
+  | CCons forest1 ->
+      if Symbol.lequal forest1.prefix forest2.prefix
+      && Symbol.lequal forest1.suffix forest2.suffix
+      && forest1.comment = forest2.comment
+      then begin
+       match common_tree forest1.focus forest2.focus with
+       | None ->
+           CHole, cforest1, forest2
+       | Some (ctree, csubforest1, subforest2) ->
+           let cforest = {
+             prefix = forest1.prefix;
+             focus = ctree;
+             suffix = forest1.suffix;
+             comment = forest1.comment
+           } in
+           CCons cforest, csubforest1, subforest2
+      end
+      else
+       CHole, cforest1, forest2
+
+(* [factor] factors the maximal common forest context out of a nonempty family
+   of forests. We assume that the family is represented as a map indexed by
+   items, because this is convenient for the application that we have in mind,
+   but this assumption is really irrelevant. *)
+
+let rec factor forests =
+  match
+    Item.Map.fold (fun item forest accu ->
+      match accu with
+      | None ->
+
+         (* First time through the loop, so [forest] is the first forest
+            that we examine. Punch it, so as to produce a maximal forest
+            context and a residual forest. *)
+
+         let context, residual = punch_forest forest in
+         Some (context, Item.Map.singleton item residual)
+
+      | Some (context, residuals) ->
+
+          (* Another iteration through the loop. [context] and [residuals] are
+            the maximal common context and the residuals of the forests
+            examined so far. *)
+
+          (* Combine the common context obtained so far with the forest at hand.
+            This yields a new, smaller common context, as well as residuals for
+            the previous common context and for the forest at hand. *)
+
+         let context, contextr, forestr = common_forest context forest in
+   
+          (* The residual forests are now: (i) the residual forest [forestr];
+            and (ii) the previous residual forests [residuals], each of which
+            must be placed with the residual context [contextr]. *)
+
+          let residuals =
+           Item.Map.add item forestr (Item.Map.map (fill_forest contextr) residuals)
+         in
+
+         Some (context, residuals)
+
+    ) forests None
+  with
+  | None ->
+      assert false (* parameter [forests] was an empty map *)
+  | Some (context, residuals) ->
+      context, residuals
+
diff --git a/bundles/menhirLib/menhir-20120123/src/derivation.mli b/bundles/menhirLib/menhir-20120123/src/derivation.mli
new file mode 100644 (file)
index 0000000..9d73e4e
--- /dev/null
@@ -0,0 +1,76 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+open Grammar
+
+(* -------------------------------------------------------------------------- *)
+
+(* This is the type of derivations. Derivations are forests: see inside. *)
+
+type t
+
+(* This is the type of derivations contexts, or derivations with a
+   derivation-shaped hole. *)
+
+type context
+
+(* -------------------------------------------------------------------------- *)
+
+(* Construction. *)
+
+(* [empty] is the forest that consists of a single empty tree. *)
+
+val empty: t
+
+(* [tail pos rhs] is the forest: (i) whose first element is the empty tree,
+   and (ii) whose remaining elements are the symbols found at positions
+   greater than or equal to [pos] in the array [rhs]. *)
+
+val tail: int -> Symbol.t array -> t
+
+(* [build pos rhs forest comment] is the forest: (i) whose first element is
+   the tree that has the non-terminal symbol [rhs.(pos)] at its root and the
+   forest [forest] below its root, and (ii) whose remaining elements are the
+   symbols found at positions greater than [pos] in the array [rhs]. *)
+
+val build: int -> Symbol.t array -> t -> string option -> t
+
+(* [prepend symbol forest] is the forest: (i) whose first element is the
+   symbol [symbol], and (ii) whose remaining elements form the forest
+   [forest]. *)
+
+val prepend: Symbol.t -> t -> t
+
+(* -------------------------------------------------------------------------- *)
+
+(* Factoring. *)
+
+(* [factor] factors the maximal common derivation context out of a
+   nonempty family of derivations. It produces a pair of the context
+   and of the residual derivations. *)
+
+val factor: t Item.Map.t -> context * t Item.Map.t
+
+(* -------------------------------------------------------------------------- *)
+
+(* Display. *)
+
+(* [print] prints a derivation. *)
+
+val print: out_channel -> t -> unit
+
+(* [printc] prints a derivation context. *)
+
+val printc: out_channel -> context -> unit
+
diff --git a/bundles/menhirLib/menhir-20120123/src/dot.ml b/bundles/menhirLib/menhir-20120123/src/dot.ml
new file mode 100644 (file)
index 0000000..03b3fac
--- /dev/null
@@ -0,0 +1,153 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+open Printf
+
+(* ------------------------------------------------------------------------- *)
+
+(* Type definitions. *)
+
+type size =
+    float * float (* in inches *)
+
+type orientation =
+  | Portrait
+  | Landscape
+
+type rankdir =
+  | LeftToRight
+  | TopToBottom
+
+type ratio =
+  | Compress
+  | Fill
+  | Auto
+
+type style =
+
+    (* Both nodes and edges. *)
+
+  | Solid
+  | Dashed
+  | Dotted
+  | Bold
+  | Invisible
+
+    (* Nodes only. *)
+
+  | Filled
+  | Diagonals
+  | Rounded
+
+(* ------------------------------------------------------------------------- *)
+
+(* Basic printers. *)
+
+let print_style = function
+  | None ->
+      ""
+  | Some style ->
+      let style =
+       match style with
+       | Solid ->
+           "solid"
+       | Dashed ->
+           "dashed"
+       | Dotted ->
+           "dotted"
+       | Bold ->
+           "bold"
+       | Invisible ->
+           "invis"
+       | Filled ->
+           "filled"
+       | Diagonals ->
+           "diagonals"
+       | Rounded ->
+           "rounded"
+      in
+      sprintf ", style = %s" style
+
+(* ------------------------------------------------------------------------- *)
+
+(* The graph printer. *)
+
+module Print (G : sig
+
+  type vertex
+
+  val name: vertex -> string
+
+  val successors: (?style:style -> label:string -> vertex -> unit) -> vertex -> unit
+
+  val iter: (?style:style -> label:string -> vertex -> unit) -> unit
+
+end) = struct
+
+  let print
+      ?(directed = true)
+      ?size
+      ?(orientation = Landscape)
+      ?(rankdir = LeftToRight)
+      ?(ratio = Compress)
+      (f : out_channel)
+      =
+
+    fprintf f "%s G {\n" (if directed then "digraph" else "graph");
+    Option.iter (fun (hsize, vsize) ->
+      fprintf f "size=\"%f, %f\";\n" hsize vsize
+    ) size;
+    begin match orientation with
+      | Portrait ->
+         fprintf f "orientation = portrait;\n"
+      | Landscape ->
+         fprintf f "orientation = landscape;\n"
+    end;
+    begin match rankdir with
+      | LeftToRight ->
+         fprintf f "rankdir = LR;\n"
+      | TopToBottom ->
+         fprintf f "rankdir = TB;\n"
+    end;
+    begin match ratio with
+      | Compress ->
+         fprintf f "ratio = compress;\n"
+      | Fill ->
+         fprintf f "ratio = fill;\n"
+      | Auto ->
+         fprintf f "ratio = auto;\n"
+    end;
+
+    G.iter (fun ?style ~label vertex ->
+      fprintf f "%s [ label=\"%s\"%s ] ;\n"
+       (G.name vertex)
+       label
+       (print_style style)
+    );
+
+    G.iter (fun ?style ~label source ->
+      G.successors (fun ?style ~label destination ->
+       fprintf f "%s %s %s [ label=\"%s\"%s ] ;\n"
+         (G.name source)
+         (if directed then "->" else "--")
+         (G.name destination)
+         label
+         (print_style style)
+      ) source
+    );
+
+    fprintf f "\n}\n"
+
+end
+
diff --git a/bundles/menhirLib/menhir-20120123/src/dot.mli b/bundles/menhirLib/menhir-20120123/src/dot.mli
new file mode 100644 (file)
index 0000000..dda9a35
--- /dev/null
@@ -0,0 +1,81 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* This module displays graphs in graphviz dot format. It is much more
+   basic than the one bundled with the ocamlgraph library, but offers
+   the advantage of being stand-alone. *)
+
+(* ------------------------------------------------------------------------- *)
+
+(* Type definitions. *)
+
+type size =
+    float * float (* in inches *)
+
+type orientation =
+  | Portrait
+  | Landscape
+
+type rankdir =
+  | LeftToRight
+  | TopToBottom
+
+type ratio =
+  | Compress
+  | Fill
+  | Auto
+
+type style =
+
+    (* Both nodes and edges. *)
+
+  | Solid
+  | Dashed
+  | Dotted
+  | Bold
+  | Invisible
+
+    (* Nodes only. *)
+
+  | Filled
+  | Diagonals
+  | Rounded
+
+(* ------------------------------------------------------------------------- *)
+
+(* The graph printer. *)
+
+module Print (G : sig
+
+  type vertex
+
+  val name: vertex -> string
+
+  val successors: (?style:style -> label:string -> vertex -> unit) -> vertex -> unit
+
+  val iter: (?style:style -> label:string -> vertex -> unit) -> unit
+
+end) : sig
+
+  val print:
+      ?directed: bool ->
+      ?size: size ->
+      ?orientation: orientation ->
+      ?rankdir: rankdir ->
+      ?ratio: ratio ->
+      out_channel ->
+      unit
+
+end
+
diff --git a/bundles/menhirLib/menhir-20120123/src/engine.ml b/bundles/menhirLib/menhir-20120123/src/engine.ml
new file mode 100644 (file)
index 0000000..f66c29c
--- /dev/null
@@ -0,0 +1,367 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the GNU Library General Public License, with the   *)
+(*  special exception on linking described in file LICENSE.               *)
+(*                                                                        *)
+(**************************************************************************)
+
+open EngineTypes
+
+(* The LR parsing engine. *)
+
+(* This module is used:
+
+   - at compile time, if so requested by the user, via the --interpret options;
+   - at run time, in the table-based back-end. *)
+
+module Make (T : TABLE) = struct
+
+  (* This propagates type and exception definitions. *)
+
+  include T
+
+  let _eRR : exn =
+    Error
+
+  (* --------------------------------------------------------------------------- *)
+
+  (* [discard] takes a token off the input stream, queries the lexer
+     for a new one, and stores it into [env.token], overwriting the
+     previous token. If [env.shifted] has not yet reached its limit,
+     it is incremented. *)
+
+  let discard env =
+    let lexbuf = env.lexbuf in
+    let token = env.lexer lexbuf in
+    env.token <- token;
+    Log.lookahead_token lexbuf (T.token2terminal token);
+    let shifted = env.shifted + 1 in
+    if shifted >= 0 then
+      env.shifted <- shifted
+
+  (* --------------------------------------------------------------------------- *)
+
+  (* The type [void] is empty. Many of the functions below have return type
+     [void]. This guarantees that they never return a value. Instead, they
+     must stop by raising an exception: either [Accept] or [Error]. *)
+
+  type void
+
+  (* --------------------------------------------------------------------------- *)
+
+  (* In the code-based back-end, the [run] function is sometimes responsible
+     for pushing a new cell on the stack. This is motivated by code sharing
+     concerns. In this interpreter, there is no such concern; [run]'s caller
+     is always responsible for updating the stack. *)
+
+  (* In the code-based back-end, there is a [run] function for each state
+     [s]. This function can behave in two slightly different ways, depending
+     on when it is invoked, or (equivalently) depending on [s].
+
+     If [run] is invoked after shifting a terminal symbol (or, equivalently,
+     if [s] has a terminal incoming symbol), then [run] discards a token,
+     unless [s] has a default reduction on [#]. (Indeed, in that case,
+     requesting the next token might drive the lexer off the end of the input
+     stream.)
+
+     If, on the other hand, [run] is invoked after performing a goto transition,
+     or invoked directly by an entry point, then there is nothing to discard.
+
+     These two cases are reflected in [CodeBackend.gettoken].
+
+     Here, the code is structured in a slightly different way. It is up to
+     the caller of [run] to indicate whether to discard a token. *)
+
+  let rec run env please_discard : void =
+
+    (* Log the fact that we just entered this state. *)
+    
+    let s = env.current in
+    Log.state s;
+
+    (* If [please_discard] is set, discard a token and fetch the next one. *)
+
+    (* This flag is set when [s] is being entered by shifting a terminal
+       symbol and [s] does not have a default reduction on [#]. *)
+
+    if please_discard then
+      discard env;
+
+    (* Examine what situation we are in. This case analysis is analogous to
+       that performed in [CodeBackend.gettoken], in the sub-case where we do
+       not have a terminal incoming symbol. *)
+
+    T.default_reduction
+      s
+      reduce   (* there is a default reduction; perform it *)
+      continue (* there is none; continue below *)
+      env
+
+  and continue env : void =
+
+    (* There is no default reduction. Consult the current lookahead token
+       so as to determine which action should be taken. *)
+
+    (* Peeking at the first input token, without taking it off the input
+       stream, is normally done by reading [env.token]. However, we check
+       [env.shifted] first: if it is -1, then the lookahead token is the
+       [error] token. *)
+
+    (* Note that, if we just called [discard] above, then the lookahead
+       token cannot be [error]. *)
+
+    if env.shifted = (-1) then begin
+      Log.resuming_error_handling();
+      error env
+    end
+    else
+      action env
+
+  (* --------------------------------------------------------------------------- *)
+
+  (* When [action] is invoked, we know that the current state does not have
+     a default reduction. We also know that the current lookahead token is
+     not [error]: it is a real token, stored in [env.token]. *)
+
+  and action env : void =
+
+    (* We consult the two-dimensional action table, indexed by the
+       current state and the current lookahead token, in order to
+       determine which action should be taken. *)
+
+    let token = env.token in
+    T.action
+      env.current                    (* determines a row *)
+      (T.token2terminal token)       (* determines a column *)
+      (T.token2value token)
+      shift                          (* shift continuation *)
+      reduce                         (* reduce continuation *)
+      initiate                       (* failure continuation *)
+      env
+
+  (* --------------------------------------------------------------------------- *)
+
+  (* This function takes care of shift transitions along a terminal symbol.
+     (Goto transitions are taken care of within [reduce] below.) The symbol
+     can be either an actual token or the [error] pseudo-token. *)
+
+  and shift env
+      (please_discard : bool)
+      (terminal : terminal)
+      (value : semantic_value)
+      (s' : state)
+      : void =
+
+    (* Log the transition. *)
+
+    Log.shift terminal s';
+
+    (* Push a new cell onto the stack, containing the identity of the
+       state that we are leaving. *)
+
+    let lexbuf = env.lexbuf in
+    env.stack <- {
+      state = env.current;
+      semv = value;
+      startp = lexbuf.Lexing.lex_start_p;
+      endp = lexbuf.Lexing.lex_curr_p;
+      next = env.stack;
+    };
+
+    (* Switch to state [s']. *)
+
+    env.current <- s';
+    run env please_discard
+
+  (* --------------------------------------------------------------------------- *)
+
+  (* This function takes care of reductions. *)
+
+  and reduce env (prod : production) : void =
+
+    (* Log a reduction event. *)
+
+    Log.reduce_or_accept prod;
+
+    (* Invoke the semantic action. The semantic action is responsible for
+       truncating the stack, updating the current state, producing a cell that
+       contains a new semantic value, and raising [Accept] or [Error] if
+       appropriate. *)
+
+    (* If the semantic action raises [Error], we catch it immediately and
+       initiate error handling. *)
+
+    (* The apparently weird idiom used here is an encoding for a
+       [let/unless] construct, which does not exist in ocaml. *)
+
+    if (
+      try
+       T.semantic_action prod env;
+       true
+      with Error ->
+       false
+    ) then begin
+
+      (* By our convention, the semantic action is responsible for updating
+        the stack. The state now found in the top stack cell is the return
+        state. *)
+
+      (* Perform a goto transition. The target state is determined
+        by consulting the goto table at the return state and at
+        production [prod]. *)
+
+      env.current <- T.goto env.stack.state prod;
+      run env false
+
+    end
+    else
+      errorbookkeeping env
+
+
+  (* --------------------------------------------------------------------------- *)
+
+  (* The following functions deal with errors. *)
+
+  (* [initiate] and [errorbookkeeping] initiate error handling. See the functions
+     by the same names in [CodeBackend]. *)
+
+  and initiate env : void =
+    assert (env.shifted >= 0);
+    if T.recovery && env.shifted = 0 then begin
+      Log.discarding_last_token (T.token2terminal env.token);
+      discard env;
+      env.shifted <- 0;
+      action env
+    end
+    else
+      errorbookkeeping env
+
+  and errorbookkeeping env =
+    Log.initiating_error_handling();
+    env.previouserror <- env.shifted;
+    env.shifted <- (-1);
+    error env
+
+  (* [error] handles errors. *)
+
+  and error env : void =
+
+    (* Consult the column associated with the [error] pseudo-token in the
+       action table. *)
+
+    T.action
+      env.current                    (* determines a row *)
+      T.error_terminal               (* determines a column *)
+      T.error_value
+      error_shift                    (* shift continuation *)
+      error_reduce                   (* reduce continuation *)
+      error_fail                     (* failure continuation *)
+      env
+
+  and error_shift env please_discard terminal value s' =
+
+    (* Here, [terminal] is [T.error_terminal], and [value] is [T.error_value]. *)
+
+    assert (terminal = T.error_terminal && value = T.error_value);
+
+    (* This state is capable of shifting the [error] token. *)
+
+    Log.handling_error env.current;
+    shift env please_discard terminal value s'
+
+  and error_reduce env prod =
+
+    (* This state is capable of performing a reduction on [error]. *)
+
+    Log.handling_error env.current;
+    reduce env prod
+
+  and error_fail env =
+
+    (* This state is unable to handle errors. Attempt to pop a stack
+       cell. *)
+
+    let cell = env.stack in
+    let next = cell.next in
+    if next == cell then
+
+      (* The stack is empty. Die. *)
+
+      raise _eRR
+
+    else begin
+
+      (* The stack is nonempty. Pop a cell, updating the current state
+        with that found in the popped cell, and try again. *)
+
+      env.stack <- next;
+      env.current <- cell.state;
+      error env
+
+    end
+
+  (* --------------------------------------------------------------------------- *)
+
+  let entry
+      (s : state)
+      (lexer : Lexing.lexbuf -> token)
+      (lexbuf : Lexing.lexbuf)
+      : semantic_value =
+
+    (* Build an empty stack. This is a dummy cell, which is its own
+       successor. Its fields other than [next] contain dummy values. *)
+
+    let rec empty = {
+      state = s;                          (* dummy *)
+      semv = T.error_value;               (* dummy *)
+      startp = lexbuf.Lexing.lex_start_p; (* dummy *)
+      endp = lexbuf.Lexing.lex_curr_p;    (* dummy *)
+      next = empty;
+    } in
+
+    (* Perform an initial call to the lexer. *)
+
+    let token : token =
+      lexer lexbuf
+    in
+
+    (* Log our first lookahead token. *)
+
+    Log.lookahead_token lexbuf (T.token2terminal token);
+
+    (* Build an initial environment. *)
+
+    let env = {
+      lexer = lexer;
+      lexbuf = lexbuf;
+      token = token;
+      shifted = max_int;
+      previouserror = max_int;
+      stack = empty;
+      current = s;
+    } in
+
+    (* Run. Catch [Accept], which represents normal termination. Let [Error]
+       escape. *)
+
+    try
+
+      (* If ocaml offered a [match/with] construct with zero branches, this is
+        what we would use here, since the type [void] has zero cases. *)
+
+      let (_ : void) = run env false in
+      assert false (* cannot fail *)
+
+    with
+    | Accept v ->
+       v
+
+end
+
diff --git a/bundles/menhirLib/menhir-20120123/src/engine.mli b/bundles/menhirLib/menhir-20120123/src/engine.mli
new file mode 100644 (file)
index 0000000..f48c7ee
--- /dev/null
@@ -0,0 +1,21 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the GNU Library General Public License, with the   *)
+(*  special exception on linking described in file LICENSE.               *)
+(*                                                                        *)
+(**************************************************************************)
+
+open EngineTypes
+
+(* The LR parsing engine. *)
+
+module Make (T : TABLE) : ENGINE with type state = T.state
+                                  and type token = T.token
+                                 and type semantic_value = T.semantic_value
diff --git a/bundles/menhirLib/menhir-20120123/src/engineTypes.ml b/bundles/menhirLib/menhir-20120123/src/engineTypes.ml
new file mode 100644 (file)
index 0000000..279d6e8
--- /dev/null
@@ -0,0 +1,331 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the GNU Library General Public License, with the   *)
+(*  special exception on linking described in file LICENSE.               *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* This file defines several types and module types that are used in the
+   specification of module [Engine]. *)
+
+(* --------------------------------------------------------------------------- *)
+
+(* It would be nice if we could keep the structure of stacks and environments
+   hidden. However, stacks and environments must be accessible to semantic
+   actions, so the following data structure definitions must be public. *)
+
+(* --------------------------------------------------------------------------- *)
+
+(* A stack is a linked list of cells. A sentinel cell -- which is its own
+   successor -- is used to mark the bottom of the stack. The sentinel cell
+   itself is not significant -- it contains dummy values. *)
+
+type ('state, 'semantic_value) stack = {
+
+  (* The state that we should go back to if we pop this stack cell. *)
+
+  (* This convention means that the state contained in the top stack cell is
+     not the current state [env.current]. It also means that the state found
+     within the sentinel is a dummy -- it is never consulted. This convention
+     is the same as that adopted by the code-based back-end. *)
+
+  state: 'state;
+
+  (* The semantic value associated with the chunk of input that this cell
+     represents. *)
+
+  semv: 'semantic_value;
+
+  (* The start and end positions of the chunk of input that this cell
+     represents. *)
+
+  startp: Lexing.position;
+  endp: Lexing.position;
+
+  (* The next cell down in the stack. If this is a self-pointer, then this
+     cell is the sentinel, and the stack is conceptually empty. *)
+
+  next: ('state, 'semantic_value) stack;
+
+}
+
+(* --------------------------------------------------------------------------- *)
+
+(* A parsing environment contains basically all of the automaton's state. *)
+
+type ('state, 'semantic_value, 'token) env = {
+
+  (* The lexer. *)
+
+  lexer: Lexing.lexbuf -> 'token;
+
+  (* The lexing buffer. It is used as an argument to the lexer, and also
+     accessed directly when extracting positions. *)
+
+  lexbuf: Lexing.lexbuf;
+
+  (* The last token that was obtained from the lexer. *)
+
+  mutable token: 'token;
+
+  (* A count of how many tokens were shifted since the beginning, or since
+     the last [error] token was encountered. By convention, if [shifted]
+     is (-1), then the current lookahead token is [error]. *)
+
+  mutable shifted: int;
+
+  (* A copy of the value of [shifted] just before the most recent error
+     was detected. This value is not used by the automaton itself, but
+     is made accessible to semantic actions. *)
+
+  mutable previouserror: int;
+
+  (* The stack. In [CodeBackend], it is passed around on its own,
+     whereas, here, it is accessed via the environment. *)
+
+  mutable stack: ('state, 'semantic_value) stack;
+
+  (* The current state. In [CodeBackend], it is passed around on its
+     own, whereas, here, it is accessed via the environment. *)
+
+  mutable current: 'state;
+
+}
+
+(* --------------------------------------------------------------------------- *)
+
+(* This signature describes the parameters that must be supplied to the LR
+   engine. *)
+
+module type TABLE = sig
+
+  (* The type of automaton states. *)
+
+  type state
+
+  (* The type of tokens. These can be thought of as real tokens, that is,
+     tokens returned by the lexer. They carry a semantic value. This type
+     does not include the [error] pseudo-token. *)
+
+  type token
+
+  (* The type of terminal symbols. These can be thought of as integer codes.
+     They do not carry a semantic value. This type does include the [error]
+     pseudo-token. *)
+
+  type terminal
+
+  (* The type of semantic values. *)
+
+  type semantic_value
+
+  (* A token is conceptually a pair of a (non-[error]) terminal symbol and
+     a semantic value. The following two functions are the pair projections. *)
+
+  val token2terminal: token -> terminal
+  val token2value: token -> semantic_value
+
+  (* Even though the [error] pseudo-token is not a real token, it is a
+     terminal symbol. Furthermore, for regularity, it must have a semantic
+     value. *)
+
+  val error_terminal: terminal
+  val error_value: semantic_value
+
+  (* The type of productions. *)
+
+  type production
+
+  (* If a state [s] has a default reduction on production [prod], then, upon
+     entering [s], the automaton should reduce [prod] without consulting the
+     lookahead token. The following function allows determining which states
+     have default reductions. *)
+
+  (* Instead of returning a value of a sum type -- either [DefRed prod], or
+     [NoDefRed] -- it accepts two continuations, and invokes just one of
+     them. This mechanism allows avoiding a memory allocation. *)
+
+  val default_reduction:
+    state ->
+    ('env -> production -> 'answer) ->
+    ('env -> 'answer) ->
+    'env -> 'answer
+
+  (* An LR automaton can normally take three kinds of actions: shift, reduce,
+     or fail. (Acceptance is a particular case of reduction: it consists in
+     reducing a start production.) *)
+
+  (* There are two variants of the shift action. [shift/discard s] instructs
+     the automaton to discard the current token, request a new one from the
+     lexer, and move to state [s]. [shift/nodiscard s] instructs it to move to
+     state [s] without requesting a new token. This instruction should be used
+     when [s] has a default reduction on [#]. See [CodeBackend.gettoken] for
+     details. *)
+
+  (* This is the automaton's action table. It maps a pair of a state and a
+     terminal symbol to an action. *)
+
+  (* Instead of returning a value of a sum type -- one of shift/discard,
+     shift/nodiscard, reduce, or fail -- this function accepts three
+     continuations, and invokes just one them. This mechanism allows avoiding
+     a memory allocation. *)
+
+  (* In summary, the parameters to [action] are as follows:
+
+     - the first two parameters, a state and a terminal symbol, are used to
+       look up the action table;
+
+     - the next parameter is the semantic value associated with the above
+       terminal symbol; it is not used, only passed along to the shift
+       continuation, as explained below;
+
+     - the shift continuation expects an environment; a flag that tells
+       whether to discard the current token; the terminal symbol that
+       is being shifted; its semantic value; and the target state of
+       the transition;
+
+     - the reduce continuation expects an environment and a production;
+
+     - the fail continuation expects an environment;
+
+     - the last parameter is the environment; it is not used, only passed
+       along to the selected continuation. *)
+
+  val action:
+    state ->
+    terminal ->
+    semantic_value ->
+    ('env -> bool -> terminal -> semantic_value -> state -> 'answer) ->
+    ('env -> production -> 'answer) ->
+    ('env -> 'answer) ->
+    'env -> 'answer
+
+  (* This is the automaton's goto table. It maps a pair of a state and a
+     production to a new state.
+
+     This convention is slightly different from the textbook approach. The
+     goto table is usually indexed by a state and a non-terminal symbol. *)
+
+  val goto: state -> production -> state
+
+  (* By convention, a semantic action is responsible for:
+
+     1. fetching whatever semantic values and positions it needs off the stack;
+
+     2. popping an appropriate number of cells off the stack, as dictated
+     by the length of the right-hand side of the production; this involves
+     updating [env.stack];
+
+     3. computing a new semantic value, as well as new start and end positions;
+
+     4. pushing a new stack cell, which contains the three values
+     computed in step 3; this again involves updating [env.stack]
+     (only one update is necessary).
+
+     Point 1 is essentially forced upon us: if semantic values were fetched
+     off the stack by this interpreter, then the calling convention for
+     semantic actions would be variadic: not all semantic actions would have
+     the same number of arguments. The rest follows rather naturally. *)
+
+  (* If production [prod] is an accepting production, then the semantic action
+     is responsible for raising exception [Accept], instead of returning
+     normally. This convention allows us to not distinguish between regular
+     productions and accepting productions. All we have to do is catch that
+     exception at top level. *)
+
+  (* Semantic actions are allowed to raise [Error]. *)
+
+  exception Accept of semantic_value
+  exception Error
+
+  type semantic_action =
+      (state, semantic_value, token) env -> unit
+
+  val semantic_action: production -> semantic_action
+
+  (* The LR engine can attempt error recovery. This consists in discarding
+     tokens, just after an error has been successfully handled, until a token
+     that can be successfully handled is found. This mechanism is optional.
+     The following flag enables it. *)
+
+  val recovery: bool
+
+  (* The LR engine requires a number of hooks, which are used for logging. *)
+
+  (* The comments below indicate the conventional messages that correspond
+     to these hooks in the code-based back-end; see [CodeBackend]. *)
+
+  module Log : sig
+
+    (* State %d: *)
+
+    val state: state -> unit
+
+    (* Shifting (<terminal>) to state <state> *)
+
+    val shift: terminal -> state -> unit
+
+    (* Reducing a production should be logged either as a reduction
+       event (for regular productions) or as an acceptance event (for
+       start productions). *)
+
+    (* Reducing production <production> / Accepting *)
+
+    val reduce_or_accept: production -> unit
+
+    (* Lookahead token is now <terminal> (<pos>-<pos>) *)
+
+    val lookahead_token: Lexing.lexbuf -> terminal -> unit
+
+    (* Initiating error handling *)
+
+    val initiating_error_handling: unit -> unit
+
+    (* Resuming error handling *)
+
+    val resuming_error_handling: unit -> unit
+
+    (* Handling error in state <state> *)
+
+    val handling_error: state -> unit
+
+    (* Discarding last token read (<terminal>) *)
+
+    val discarding_last_token: terminal -> unit
+
+  end
+
+end
+
+(* --------------------------------------------------------------------------- *)
+
+(* This signature describes the LR engine. *)
+
+module type ENGINE = sig
+
+  type state
+
+  type token
+
+  type semantic_value
+
+  (* An entry point to the engine requires a start state, a lexer, and a lexing
+     buffer. It either succeeds and produces a semantic value, or fails and
+     raises [Error]. *)
+
+  exception Error
+
+  val entry:
+    state ->
+    (Lexing.lexbuf -> token) ->
+    Lexing.lexbuf ->
+    semantic_value
+
+end
diff --git a/bundles/menhirLib/menhir-20120123/src/error.ml b/bundles/menhirLib/menhir-20120123/src/error.ml
new file mode 100644 (file)
index 0000000..0dd878f
--- /dev/null
@@ -0,0 +1,126 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+open Printf
+open Lexing
+
+(* TEMPORARY Vérifier que les messages d'erreur sont standardisés au
+   maximum, localisés au maximum. Supprimer autant de fonctions que
+   possible dans ce module. *)
+
+(* TEMPORARY reprendre compl`etement implementation et interface
+   de ce module *)
+
+(* ---------------------------------------------------------------------------- *)
+
+(* Global state. *)
+
+let get_initialized_ref ref =
+  match !ref with
+  | None ->
+      assert false
+  | Some contents ->
+      contents
+
+let filename =
+  ref (None : string option)
+
+let filemark =
+  ref Mark.none
+
+(* 2011/10/19: do not use [Filename.basename]. The [#] annotations that
+   we insert in the [.ml] file must retain their full path. This does
+   mean that the [#] annotations depend on how menhir is invoked -- e.g.
+   [menhir foo/bar.mly] and [cd foo && menhir bar.mly] will produce
+   different files. Nevertheless, this seems useful/reasonable. *)
+
+(* This also influences the type error messages produced by [--infer]. *)
+
+let set_filename name =
+  filename := Some name;
+  filemark := Mark.fresh()
+
+let get_filename () =
+  get_initialized_ref filename
+
+let get_filemark () =
+  !filemark
+
+let file_contents =
+  ref (None : string option)
+
+let get_file_contents () =
+  get_initialized_ref file_contents
+
+(* ---------------------------------------------------------------------------- *)
+
+(* Logging and log levels. *)
+
+let log kind verbosity msg =
+  if kind >= verbosity then
+    Printf.fprintf stderr "%t%!" msg
+
+let logG =
+  log Settings.logG
+
+let logA =
+  log Settings.logA
+
+let logC =
+  log Settings.logC
+
+(* ---------------------------------------------------------------------------- *)
+
+(* Errors and warnings. *)
+
+let errors =
+  ref false
+
+let printN positions message = 
+  List.iter (fun position -> 
+    fprintf stderr "%s:\n" (Positions.string_of_pos position)
+  ) positions;
+  fprintf stderr "%s\n%!" message
+
+let error_message message =
+  "Error: " ^ message
+
+let error positions message =
+  printN positions (error_message message);
+  exit 1
+
+let errorp v message =
+  error [ Positions.position v ] message
+
+let signal positions message =
+  printN positions message;
+  errors := true
+
+let warning positions message =
+  printN positions (Printf.sprintf "Warning: %s" message)
+
+let errors () =
+  !errors
+
+(* Certain warnings about the grammar can optionally be treated as errors.
+   The following function emits a warning or error message, via [warning] or
+   [signal]. It does not stop the program; the client must at some point call
+   [errors] and stop the program if any errors have been reported. *)
+
+let grammar_warning positions message =
+  if Settings.strict then
+    signal positions (error_message message)
+  else
+    warning positions message
+
diff --git a/bundles/menhirLib/menhir-20120123/src/error.mli b/bundles/menhirLib/menhir-20120123/src/error.mli
new file mode 100644 (file)
index 0000000..5cd865f
--- /dev/null
@@ -0,0 +1,79 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* This module helps report errors and maintains some information
+   about the source file that is being read. *)
+
+(* ---------------------------------------------------------------------------- *)
+
+(* Call [set_filename] before lexing and parsing in order to inform
+   the module [Error] about the name of the file that is being
+   examined. *)
+
+(* TEMPORARY limiter ou supprimer ou commenter cette interface stateful *)
+
+val set_filename: string -> unit
+
+val get_filename: unit -> string
+
+val get_filemark: unit -> Mark.t
+
+val file_contents: string option ref
+
+val get_file_contents: unit -> string
+
+(* ---------------------------------------------------------------------------- *)
+
+(* Logging and log levels. *)
+
+val logG: int -> (out_channel -> unit) -> unit
+val logA: int -> (out_channel -> unit) -> unit
+val logC: int -> (out_channel -> unit) -> unit
+
+(* ---------------------------------------------------------------------------- *)
+
+(* Errors and warnings. *)
+
+(* [error ps msg] displays the error message [msg], referring to the
+   positions [ps], and exits. *)
+
+val error: Positions.positions -> string -> 'a
+
+(* [errorp v msg] displays the error message [msg], referring to the
+   position range carried by [v], and exits. *)
+
+val errorp: 'a Positions.located -> string -> 'b
+
+(* [warning ps msg] displays the warning message [msg], referring to
+   the positions [ps]. *)
+
+val warning: Positions.positions -> string -> unit
+
+(* [signal ps msg] displays the error message [msg], referring to the
+   positions [ps], and does not exit immediately. *)
+
+val signal: Positions.positions -> string -> unit
+
+(* [errors] returns [true] if [signal] was previously called. Together
+   [signal] and [errors] allow reporting multiple errors before aborting. *)
+
+val errors: unit -> bool
+
+(* Certain warnings about the grammar can optionally be treated as errors.
+   The following function emits a warning or error message, via [warning] or
+   [signal]. It does not stop the program; the client must at some point call
+   [errors] and stop the program if any errors have been reported. *)
+
+val grammar_warning: Positions.positions -> string -> unit
+
diff --git a/bundles/menhirLib/menhir-20120123/src/fancy-parser.mly b/bundles/menhirLib/menhir-20120123/src/fancy-parser.mly
new file mode 100644 (file)
index 0000000..c7af48a
--- /dev/null
@@ -0,0 +1,389 @@
+/**************************************************************************/
+/*                                                                        */
+/*  Menhir                                                                */
+/*                                                                        */
+/*  François Pottier, INRIA Rocquencourt                                  */
+/*  Yann Régis-Gianas, PPS, Université Paris Diderot                      */
+/*                                                                        */
+/*  Copyright 2005-2008 Institut National de Recherche en Informatique    */
+/*  et en Automatique. All rights reserved. This file is distributed      */
+/*  under the terms of the Q Public License version 1.0, with the change  */
+/*  described in file LICENSE.                                            */
+/*                                                                        */
+/**************************************************************************/
+
+/* This is the fancy version of the parser, to be processed by menhir.
+   It is kept in sync with [Parser], but exercises menhir's features. */
+
+/* ------------------------------------------------------------------------- */
+/* Imports. */
+
+%{
+
+open Keyword
+open ConcreteSyntax
+open Syntax
+open Positions
+
+%}
+
+/* ------------------------------------------------------------------------- */
+/* Tokens. */
+
+%token TOKEN TYPE LEFT RIGHT NONASSOC START PREC PUBLIC COLON BAR EOF EQUAL
+%token INLINE LPAREN RPAREN COMMA QUESTION STAR PLUS PARAMETER
+%token <string Positions.located> LID UID 
+%token <Stretch.t> HEADER
+%token <Stretch.ocamltype> OCAMLTYPE
+%token <string Lazy.t> PERCENTPERCENT
+%token <Action.t> ACTION
+
+/* ------------------------------------------------------------------------- */
+/* Start symbol. */
+
+%start <ConcreteSyntax.grammar> grammar
+
+/* ------------------------------------------------------------------------- */
+/* Priorities. */
+
+/* These declarations solve a shift-reduce conflict in favor of
+   shifting: when the declaration of a non-terminal symbol begins with
+   a leading bar, it is understood as an (insignificant) leading
+   optional bar, *not* as an empty right-hand side followed by a bar.
+   This ambiguity arises due to the existence of a new notation for
+   letting several productions share a single semantic action. */
+
+%nonassoc no_optional_bar
+%nonassoc BAR
+
+/* These declarations encourage the [error] token to be shifted if
+   found at the end of what seems like a legal declaration. */
+
+%nonassoc decl
+%nonassoc error
+
+%%
+
+/* ------------------------------------------------------------------------- */
+/* A grammar consists of declarations and rules, followed by an optional
+   trailer, which we do not parse. */
+
+grammar:
+  ds = declaration* PERCENTPERCENT rs = rule* t = trailer
+    { 
+      { 
+       pg_filename          = ""; (* filled in by the caller *)
+       pg_declarations      = List.flatten ds;
+       pg_rules             = List.flatten rs;
+       pg_trailer           = t
+      }
+    }
+
+/* ------------------------------------------------------------------------- */
+/* A declaration is an %{ Objective Caml header %}, or a %token, %start,
+   %type, %left, %right, or %nonassoc declaration. */
+
+declaration:
+
+| h = HEADER /* lexically delimited by %{ ... %} */
+    { [ with_poss $startpos $endpos (DCode h) ] }
+
+| TOKEN t = OCAMLTYPE? ts = clist(terminal) %prec decl
+    { List.map (Positions.map (fun terminal -> DToken (t, terminal))) ts }
+
+| TOKEN OCAMLTYPE? clist(terminal) error
+| TOKEN OCAMLTYPE? error
+    { Error.signal (Positions.two $startpos $endpos) "\
+Syntax error in a %token declaration.
+Here are sample valid declarations:
+  %token DOT SEMICOLON
+  %token <string> LID UID";
+      []
+    }
+
+| START t = OCAMLTYPE? nts = clist(nonterminal) %prec decl
+    /* %start <ocamltype> foo is syntactic sugar for %start foo %type <ocamltype> foo */
+    {
+      match t with
+      | None ->
+         List.map (Positions.map (fun nonterminal -> DStart nonterminal)) nts
+      | Some t ->
+         Misc.mapd (fun ntloc ->
+            Positions.mapd (fun nt -> DStart nt, DType (t, ParameterVar ntloc)) ntloc) nts
+    }
+
+| START OCAMLTYPE? clist(nonterminal) error
+| START OCAMLTYPE? error
+    { Error.signal (Positions.two $startpos $endpos) "\
+Syntax error in a %start declaration.
+Here are sample valid declarations:
+  %start expression phrase
+  %start <int> date time";
+      []
+    }
+
+| TYPE t = OCAMLTYPE ss = clist(actual_parameter) %prec decl
+    { List.map (Positions.map (fun nt -> DType (t, nt)))
+        (List.map Parameters.with_pos ss) }
+
+| TYPE OCAMLTYPE clist(actual_parameter) error
+| TYPE OCAMLTYPE error
+| TYPE error
+    { Error.signal (Positions.two $startpos $endpos) "\
+Syntax error in a %type declaration.
+Here are sample valid declarations:
+  %type <Syntax.expression> expression
+  %type <int> date time";
+      []
+    }
+
+| k = priority_keyword ss = clist(symbol) %prec decl
+    { let prec = ParserAux.current_token_precedence $startpos(k) $endpos(k) in
+      List.map (Positions.map (fun symbol -> DTokenProperties (symbol, k, prec))) ss }
+
+| priority_keyword clist(symbol) error
+| priority_keyword error
+    { Error.signal (Positions.two $startpos $endpos) "\
+Syntax error in a precedence declaration.
+Here are sample valid declarations:
+  %left PLUS TIMES
+  %nonassoc unary_minus
+  %right CONCAT";
+      []
+    }
+
+| PARAMETER t = OCAMLTYPE
+    { [ with_poss $startpos $endpos (DParameter t) ] }
+
+| PARAMETER error
+    { Error.signal (Positions.two $startpos $endpos) "\
+Syntax error in a %parameter declaration.
+Here is a sample valid declaration:
+  %parameter <X : sig type t end>";
+      []
+    }
+
+/* This error production should lead to resynchronization on the next %something.
+   The use of $previouserror prevents reporting errors that are too close to one
+   another -- presumably, the second error only means that we failed to properly
+   recover after the first error. */
+| error
+    { if $previouserror >= 3 then
+        Error.signal (Positions.two $startpos $endpos) "Syntax error inside a declaration.";
+      [] }
+
+/* This production recognizes tokens that are valid in the rules section,
+   but not in the declarations section. This is a hint that a %% was
+   forgotten. */
+
+| rule_specific_token
+    {
+      if $previouserror >= 3 then
+       Error.signal (Positions.two $startpos $endpos)
+         "Syntax error inside a declaration.\n\
+          Did you perhaps forget the %% that separates declarations and rules?";
+
+      (* Do not attempt to perform error recovery. There is no way of
+        forcing the automaton into a state where rules are expected. *)
+
+      exit 1
+    }
+
+priority_keyword:
+  LEFT
+    { LeftAssoc }
+| RIGHT
+    { RightAssoc }
+| NONASSOC
+    { NonAssoc }
+
+rule_specific_token:
+| PUBLIC
+| INLINE
+| COLON
+| EOF
+    { () }
+
+/* ------------------------------------------------------------------------- */
+/* Our lists of symbols are separated with optional commas. Order is
+   irrelevant. */
+
+%inline clist(X):
+  xs = separated_nonempty_list(COMMA?, X)
+    { xs }
+
+/* ------------------------------------------------------------------------- */
+/* A symbol is a terminal or nonterminal symbol. One would like to
+   require nonterminal symbols to begin with a lowercase letter, so as
+   to lexically distinguish them from terminal symbols, which must
+   begin with an uppercase letter. However, for compatibility with
+   ocamlyacc, this is impossible. It can be required only for
+   nonterminal symbols that are also start symbols. */
+
+symbol:
+  id = LID
+| id = UID
+    { id }
+
+/* ------------------------------------------------------------------------- */
+/* Terminals must begin with an uppercase letter. Nonterminals that are
+   declared to be start symbols must begin with a lowercase letter. */
+
+%inline terminal:
+  id = UID
+    { id }
+
+%inline nonterminal:
+  id = LID
+    { id }
+
+/* ------------------------------------------------------------------------- */
+/* A rule defines a symbol. It is optionally declared %public, and optionally
+   carries a number of formal parameters. The right-hand side of the definition
+   consists of a list of productions. */
+
+rule:
+  flags = flags                                             /* flags */
+  symbol = symbol                                           /* the symbol that is being defined */
+  params = plist(symbol)                                    /* formal parameters */
+  COLON optional_bar
+  prods = separated_nonempty_list(BAR, production_group)    /* productions */
+    { 
+      let public, inline = flags in
+      [
+        {
+          pr_public_flag = public; 
+          pr_inline_flag = inline; 
+         pr_nt          = Positions.value symbol;
+         pr_positions   = [ Positions.position symbol ];
+         pr_parameters  = List.map Positions.value params;
+         pr_branches    = List.flatten prods
+        }
+      ]
+    }
+| error
+    /* This error production should lead to resynchronization on the next
+       well-formed rule. */
+    { if $previouserror >= 3 then
+        Error.signal (Positions.two $startpos $endpos) "Syntax error inside the definition of a nonterminal symbol.";
+      [] }
+
+flags:
+  /* epsilon */
+    { false, false }
+| PUBLIC
+    { true, false }
+| INLINE
+    { false, true }
+| PUBLIC INLINE
+| INLINE PUBLIC
+    { true, true }
+
+optional_bar:
+  /* epsilon */ %prec no_optional_bar
+| BAR
+    { () }
+
+/* ------------------------------------------------------------------------- */
+/* A production group consists of a list of productions, followed by a
+   semantic action and an optional precedence specification. */
+
+production_group:
+  productions = separated_nonempty_list(BAR, production)
+  action = ACTION
+  oprec2 = precedence?
+    { 
+      ParserAux.check_production_group
+       productions
+       $startpos(action) $endpos(action) action;
+
+      List.map (fun (producers, oprec1, rprec, pos) -> {
+       pr_producers                = producers;
+       pr_action                   = action;
+       pr_branch_shift_precedence  = ParserAux.override pos oprec1 oprec2;
+       pr_branch_reduce_precedence = rprec;
+       pr_branch_position          = pos
+      }) productions
+    }
+| error ACTION precedence?
+| error EOF
+    /* This error production should lead to resynchronization on the next
+       semantic action, unless the end of file is reached before a semantic
+       action is found. */
+    { if $previouserror >= 3 then
+        Error.signal (Positions.two $startpos($1) $endpos($1)) "Syntax error inside a production.";
+      [] }
+
+%inline precedence:
+  PREC symbol = symbol
+    { symbol }
+
+/* ------------------------------------------------------------------------- */
+/* A production is a list of producers, optionally followed by a
+   precedence declaration. */
+
+production:
+  producers = producer* oprec = precedence?
+    { producers,
+      oprec,
+      ParserAux.current_reduce_precedence(),
+      Positions.lex_join $startpos $endpos
+    }
+
+/* ------------------------------------------------------------------------- */
+/* A producer is an actual parameter, possibly preceded by a
+   binding.
+
+   Because both [ioption] and [terminated] are defined as inlined by
+   the standard library, this definition expands to two productions,
+   one of which begins with id = LID, the other of which begins with
+   p = actual_parameter. The token LID is in FIRST(actual_parameter),
+   but the LR(1) formalism can deal with that. If [option] was used
+   instead of [ioption], an LR(1) conflict would arise -- looking
+   ahead at LID would not allow determining whether to reduce an
+   empty [option] or to shift. */
+
+producer:
+| id = ioption(terminated(LID, EQUAL)) p = actual_parameter
+    { id, p }
+
+/* ------------------------------------------------------------------------- */
+/* The syntax of actual parameters allows applications, whereas the syntax
+   of formal parameters does not. It also allows use of the "?", "+", and
+   "*" shortcuts. */
+
+actual_parameter:
+  symbol = symbol actuals = plist(actual_parameter) modifier = modifier?
+    { Parameters.oapp1 modifier (Parameters.app symbol actuals) }
+
+/* ------------------------------------------------------------------------- */
+/* Formal or actual parameter lists are delimited with parentheses and
+   separated with commas. They are optional. */
+
+%inline plist(X):
+  params = loption(delimited(LPAREN, separated_nonempty_list(COMMA, X), RPAREN))
+    { params }
+
+/* ------------------------------------------------------------------------- */
+/* The "?", "+", and "*" modifiers are short-hands for applications of
+   certain parameterized nonterminals, defined in the standard library. */
+
+modifier:
+  QUESTION
+    { with_poss $startpos $endpos "option" }
+| PLUS
+    { with_poss $startpos $endpos "nonempty_list" }
+| STAR
+    { with_poss $startpos $endpos "list" }
+
+/* ------------------------------------------------------------------------- */
+/* A trailer is announced by %%, but is optional. */
+
+trailer:
+  EOF
+    { None }
+| p = PERCENTPERCENT /* followed by actual trailer */
+    { Some (Lazy.force p) }
+
+%%
+
diff --git a/bundles/menhirLib/menhir-20120123/src/front.ml b/bundles/menhirLib/menhir-20120123/src/front.ml
new file mode 100644 (file)
index 0000000..4a3630f
--- /dev/null
@@ -0,0 +1,78 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* Start where [PreFront] left off. *)
+
+let grammar =
+  PreFront.grammar
+
+(* Perform reachability analysis. *)
+
+let grammar =
+  Reachability.trim grammar
+
+let () =
+  Time.tick "Trimming"
+
+(* If [--depend] was specified on the command line, perform
+   dependency analysis and stop. *)
+
+let () =
+  match Settings.depend with
+  | Settings.OMRaw
+  | Settings.OMPostprocess ->
+      Infer.depend grammar (* never returns *)
+  | Settings.OMNone ->
+      ()
+
+(* If [--infer] was specified on the command line, perform
+   type inference and stop. *)
+
+let grammar =
+  if Settings.infer then
+    let grammar = Infer.infer grammar in
+    Time.tick "Inferring types for nonterminals";
+    grammar
+  else
+    grammar
+
+(* If [--no-inline] was specified on the command line, skip the
+   inlining of non terminal definitions marked with %inline. *)
+
+let grammar =
+  if Settings.inline then begin
+    let grammar, inlined = 
+      NonTerminalDefinitionInlining.inline grammar
+    in
+    if not Settings.infer && inlined && not Settings.coq then
+      Error.warning []
+       "you are using the standard library and/or the %inline keyword. We\n\
+        recommend switching on --infer in order to avoid obscure type error messages.";
+    Time.tick "Inlining";
+    grammar
+  end
+  else 
+    grammar
+
+(* If [--only-preprocess] or [--only-preprocess-drop] was specified on the
+   command line, print the grammar and stop. Otherwise, continue. *)
+
+let () =
+  match Settings.preprocess_mode with
+  | Settings.PMOnlyPreprocess mode ->
+      UnparameterizedPrinter.print mode stdout grammar;
+      exit 0
+  | Settings.PMNormal ->
+      ()
+
diff --git a/bundles/menhirLib/menhir-20120123/src/front.mli b/bundles/menhirLib/menhir-20120123/src/front.mli
new file mode 100644 (file)
index 0000000..76bfc51
--- /dev/null
@@ -0,0 +1,21 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* This module drives the second half of the front-end. It starts
+   where [PreFront] left off, and performs type inference. This yields
+   the grammar that the back-end works with (through the interface
+   provided by module [Grammar]). *)
+
+val grammar: UnparameterizedSyntax.grammar
+
diff --git a/bundles/menhirLib/menhir-20120123/src/gMap.ml b/bundles/menhirLib/menhir-20120123/src/gMap.ml
new file mode 100644 (file)
index 0000000..002847f
--- /dev/null
@@ -0,0 +1,176 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+module type S = sig
+
+  (* Keys are assumed to have a natural total order. *)
+
+  type key
+
+  (* The type of maps whose data have type ['a]. *)
+
+  type 'a t
+
+  (* The empty map. *)
+
+  val empty: 'a t
+
+  (* [lookup k m] looks up the value associated to the key [k] in the
+     map [m], and raises [Not_found] if no value is bound to [k]. *)
+
+  val lookup: key -> 'a t -> 'a
+  val find: key -> 'a t -> 'a
+
+  (* [add k d m] returns a map whose bindings are all bindings in [m],
+     plus a binding of the key [k] to the datum [d]. If a binding
+     already exists for [k], it is overridden. *)
+
+  val add: key -> 'a -> 'a t -> 'a t
+
+  (* [strict_add k d m] returns a map whose bindings are all bindings
+     in [m], plus a binding of the key [k] to the datum [d]. If a
+     binding already exists for [k] then [Unchanged] is raised. *)
+
+  exception Unchanged
+
+  val strict_add: key -> 'a -> 'a t -> 'a t
+
+  (* [fine_add decide k d m] returns a map whose bindings are all
+     bindings in [m], plus a binding of the key [k] to the datum
+     [d]. If a binding from [k] to [d0] already exists, then the
+     resulting map contains a binding from [k] to [decide d0 d]. *)
+
+  type 'a decision = 'a -> 'a -> 'a
+
+  val fine_add: 'a decision -> key -> 'a -> 'a t -> 'a t
+
+  (* [mem k m] tells whether the key [k] appears in the domain of the
+     map [m]. *)
+
+  val mem: key -> 'a t -> bool
+
+  (* [singleton k d] returns a map whose only binding is from [k] to [d]. *)
+
+  val singleton: key -> 'a -> 'a t
+
+  (* [is_empty m] returns [true] if and only if the map [m] defines no
+     bindings at all. *)
+
+  val is_empty: 'a t -> bool
+
+  (* [is_singleton s] returns [Some x] if [s] is a singleton
+     containing [x] as its only element; otherwise, it returns
+     [None]. *)
+
+  val is_singleton: 'a t -> (key * 'a) option
+
+  (* [cardinal m] returns [m]'s cardinal, that is, the number of keys
+     it binds, or, in other words, the cardinal of its domain. *)
+
+  val cardinal: 'a t -> int
+
+  (* [choose m] returns an arbitrarily chosen binding in [m], if [m]
+     is nonempty, and raises [Not_found] otherwise. *)
+
+  val choose: 'a t -> key * 'a
+
+  (* [lookup_and_remove k m] looks up the value [v] associated to the
+     key [k] in the map [m], and raises [Not_found] if no value is
+     bound to [k]. The call returns the value [v], together with the
+     map [m] deprived from the binding from [k] to [v]. *)
+
+  val lookup_and_remove: key -> 'a t -> 'a * 'a t
+  val find_and_remove: key -> 'a t -> 'a * 'a t
+
+  (* [remove k m] is the map [m] deprived from any binding for [k]. *)
+
+  val remove: key -> 'a t -> 'a t
+
+  (* [union m1 m2] returns the union of the maps [m1] and
+     [m2]. Bindings in [m2] take precedence over those in [m1]. *)
+
+  val union: 'a t -> 'a t -> 'a t
+
+  (* [fine_union decide m1 m2] returns the union of the maps [m1] and
+     [m2]. If a key [k] is bound to [x1] (resp. [x2]) within [m1]
+     (resp. [m2]), then [decide] is called. It is passed [x1] and
+     [x2], and must return the value that shall be bound to [k] in the
+     final map. *)
+
+  val fine_union: 'a decision -> 'a t -> 'a t -> 'a t
+
+  (* [iter f m] invokes [f k x], in turn, for each binding from key
+     [k] to element [x] in the map [m]. Keys are presented to [f] in
+     increasing order. *)
+
+  val iter: (key -> 'a -> unit) -> 'a t -> unit
+
+  (* [fold f m seed] invokes [f k d accu], in turn, for each binding
+     from key [k] to datum [d] in the map [m]. Keys are presented to
+     [f] in increasing order. The initial value of [accu] is [seed];
+     then, at each new call, its value is the value returned by the
+     previous invocation of [f]. The value returned by [fold] is the
+     final value of [accu]. *)
+
+  val fold: (key -> 'a -> 'b -> 'b) -> 'a t -> 'b -> 'b
+
+  (* [fold_rev] performs exactly the same job as [fold], but presents
+     keys to [f] in the opposite order. *)
+
+  val fold_rev: (key -> 'a -> 'b -> 'b) -> 'a t -> 'b -> 'b
+
+  (* It is valid to evaluate [iter2 f m1 m2] if and only if [m1] and
+     [m2] have equal domains. Doing so invokes [f k x1 x2], in turn,
+     for each key [k] bound to [x1] in [m1] and to [x2] in
+     [m2]. Bindings are presented to [f] in increasing order. *)
+
+  val iter2: (key -> 'a -> 'b -> unit) -> 'a t -> 'b t -> unit
+
+  (* [map f m] returns the map obtained by composing the map [m] with
+     the function [f]; that is, the map $k\mapsto f(m(k))$. *)
+
+  val map: ('a -> 'b) -> 'a t -> 'b t
+
+  (* [endo_map] is similar to [map], but attempts to physically share
+     its result with its input. This saves memory when [f] is the
+     identity function. *)
+
+  val endo_map: ('a -> 'a) -> 'a t -> 'a t
+
+  (* If [dcompare] is an ordering over data, then [compare dcompare]
+     is an ordering over maps. *)
+
+  val compare: ('a -> 'a -> int) -> 'a t -> 'a t -> int
+
+  (* A map's domain is a set. Thus, to be able to perform operations
+     on domains, we need set operations, provided by the [Domain]
+     sub-module. The two-way connection between maps and their domains
+     is given by two additional functions, [domain] and
+     [lift]. [domain m] returns [m]'s domain. [lift f s] returns the
+     map $k\mapsto f(k)$, where $k$ ranges over a set of keys [s]. *)
+
+  module Domain : GSet.S with type element = key
+
+  val domain: 'a t -> Domain.t
+  val lift: (key -> 'a) -> Domain.t -> 'a t
+
+  (* [corestrict m d] performs a co-restriction of the map [m] to the
+     domain [d]. That is, it returns the map $k\mapsto m(k)$, where
+     $k$ ranges over all keys bound in [m] but \emph{not} present in
+     [d]. *)
+
+  val corestrict: 'a t -> Domain.t -> 'a t
+
+end
+
diff --git a/bundles/menhirLib/menhir-20120123/src/gSet.ml b/bundles/menhirLib/menhir-20120123/src/gSet.ml
new file mode 100644 (file)
index 0000000..ed7ebeb
--- /dev/null
@@ -0,0 +1,112 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* This is a stripped down version of [GSet] that describes both [Patricia]
+   and [CompressedBitSet]. The full version of [GSet] is in [AlphaLib]. *)
+
+module type S = sig
+
+  (* Elements are assumed to have a natural total order. *)
+
+  type element
+
+  (* Sets. *)
+
+  type t
+
+  (* The empty set. *)
+
+  val empty: t
+
+  (* [is_empty s] tells whether [s] is the empty set. *)
+
+  val is_empty: t -> bool
+
+  (* [singleton x] returns a singleton set containing [x] as its only
+     element. *)
+
+  val singleton: element -> t
+
+  (* [cardinal s] returns the cardinal of [s]. *)
+
+  val cardinal: t -> int
+
+  (* [choose s] returns an arbitrarily chosen element of [s], if [s]
+     is nonempty, and raises [Not_found] otherwise. *)
+
+  val choose: t -> element
+
+  (* [mem x s] returns [true] if and only if [x] appears in the set
+     [s]. *)
+
+  val mem: element -> t -> bool
+
+  (* [add x s] returns a set whose elements are all elements of [s],
+     plus [x]. *)
+
+  val add: element -> t -> t
+
+  (* [remove x s] returns a set whose elements are all elements of
+     [s], except [x]. *)
+
+  val remove: element -> t -> t
+
+  (* [union s1 s2] returns the union of the sets [s1] and [s2]. *)
+
+  val union: t -> t -> t
+
+  (* [inter s t] returns the set intersection of [s] and [t], that is,
+     $s\cap t$. *)
+
+  val inter: t -> t -> t
+
+  (* [disjoint s1 s2] returns [true] if and only if the sets [s1] and
+     [s2] are disjoint, i.e. iff their intersection is empty. *)
+
+  val disjoint: t -> t -> bool
+
+  (* [iter f s] invokes [f x], in turn, for each element [x] of the
+     set [s]. Elements are presented to [f] in increasing order. *)
+
+  val iter: (element -> unit) -> t -> unit
+
+  (* [fold f s seed] invokes [f x accu], in turn, for each element [x]
+     of the set [s]. Elements are presented to [f] in increasing
+     order. The initial value of [accu] is [seed]; then, at each new
+     call, its value is the value returned by the previous invocation
+     of [f]. The value returned by [fold] is the final value of
+     [accu]. In other words, if $s = \{ x_1, x_2, \ldots, x_n \}$,
+     where $x_1 < x_2 < \ldots < x_n$, then [fold f s seed] computes
+     $([f]\,x_n\,\ldots\,([f]\,x_2\,([f]\,x_1\,[seed]))\ldots)$. *)
+
+  val fold: (element -> 'b -> 'b) -> t -> 'b -> 'b
+
+  (* [elements s] is a list of all elements in the set [s]. *)
+
+  val elements: t -> element list
+
+  (* [compare] is an ordering over sets. *)
+
+  val compare: t -> t -> int
+
+  (* [equal] implements equality over sets. *)
+
+  val equal: t -> t -> bool
+
+  (* [subset] implements the subset predicate over sets. *)
+
+  val subset: (t -> t -> bool)
+
+end
+
diff --git a/bundles/menhirLib/menhir-20120123/src/grammar.ml b/bundles/menhirLib/menhir-20120123/src/grammar.ml
new file mode 100644 (file)
index 0000000..7c34f37
--- /dev/null
@@ -0,0 +1,1118 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+open UnparameterizedSyntax
+open Syntax
+open Stretch
+open Positions
+
+(* ------------------------------------------------------------------------ *)
+(* Precedence levels for tokens or pseudo-tokens alike. *)
+
+module TokPrecedence = struct
+
+  (* This set records, on a token by token basis, whether the token's
+     precedence level is ever useful. This allows emitting warnings
+     about useless precedence declarations. *)
+
+  let ever_useful : StringSet.t ref =
+    ref StringSet.empty
+
+  let use id =
+    ever_useful := StringSet.add id !ever_useful
+
+  (* This function is invoked when someone wants to consult a token's
+     precedence level. This does not yet mean that this level is
+     useful, though. Indeed, if it is subsequently compared against
+     [UndefinedPrecedence], it will not allow solving a conflict. So,
+     in addition to the desired precedence level, we return a delayed
+     computation which, when evaluated, records that this precedence
+     level was useful. *)
+
+  let levelip id properties =
+    lazy (use id), properties.tk_priority
+
+  let leveli id = 
+    let properties =
+      try
+       StringMap.find id Front.grammar.tokens
+      with Not_found ->
+       assert false (* well-formedness check has been performed earlier *)
+    in
+    levelip id properties    
+
+  (* This function is invoked after the automaton has been constructed.
+     It warns about unused precedence levels. *)
+
+  let diagnostics () =
+    StringMap.iter (fun id properties ->
+      if not (StringSet.mem id !ever_useful) then
+       match properties.tk_priority with
+       | UndefinedPrecedence ->
+           ()
+       | PrecedenceLevel (_, _, pos1, pos2) ->
+           Error.grammar_warning (Positions.two pos1 pos2)
+             (Printf.sprintf "the precedence level assigned to %s is never useful." id)
+    ) Front.grammar.tokens
+
+end
+
+(* ------------------------------------------------------------------------ *)
+(* Nonterminals. *)
+
+module Nonterminal = struct
+
+  type t = int
+
+  let n2i i = i
+
+  let compare = (-)
+
+  (* Determine how many nonterminals we have and build mappings
+     both ways between names and indices. A new nonterminal is
+     created for every start symbol. *)
+
+  let new_start_nonterminals =
+    StringSet.fold (fun symbol ss -> (symbol ^ "'") :: ss) Front.grammar.start_symbols []
+
+  let original_nonterminals =
+    StringMap.fold (fun nt _ rules -> nt :: rules) Front.grammar.rules []
+  
+  let start =
+    List.length new_start_nonterminals
+
+  let (n : int), (name : string array), (map : int StringMap.t) =
+    Misc.index (new_start_nonterminals @ original_nonterminals)
+
+  let () =
+    Error.logG 1 (fun f ->
+      Printf.fprintf f
+       "Grammar has %d nonterminal symbols, among which %d start symbols.\n"
+       (n - start) start
+    )
+
+  let is_start nt =
+    nt < start
+
+  let print normalize nt =
+    if normalize then
+      Misc.normalize name.(nt)
+    else
+      name.(nt)
+
+  let lookup name =
+    StringMap.find name map
+
+  let positions nt =
+    (StringMap.find (print false nt) Front.grammar.rules).positions
+
+  let iter f =
+    Misc.iteri n f
+
+  let fold f accu =
+    Misc.foldi n f accu
+
+  let map f =
+    Misc.mapi n f
+
+  let iterx f =
+    for nt = start to n - 1 do
+      f nt
+    done
+
+  let foldx f accu =
+    Misc.foldij start n f accu
+
+  let ocamltype nt =
+    assert (not (is_start nt));
+    try
+      Some (StringMap.find (print false nt) Front.grammar.types)
+    with Not_found ->
+      None
+
+  let tabulate f =
+    Array.get (Array.init n f)
+
+end
+
+(* Sets and maps over nonterminals, used only below. *)
+
+module NonterminalMap = Patricia.Big
+
+module NonterminalSet = Patricia.Big.Domain
+
+(* ------------------------------------------------------------------------ *)
+(* Terminals. *)
+
+module Terminal = struct
+
+  type t = int
+
+  let t2i i = i
+
+  let compare = (-)
+
+  let equal (tok1 : t) (tok2 : t) =
+    tok1 = tok2
+
+  (* Determine how many terminals we have and build mappings
+     both ways between names and indices. A new terminal "#"
+     is created. A new terminal "error" is created. The fact
+     that the integer code assigned to the "error" pseudo-terminal
+     is the last one is exploited in the table-based back-end.
+
+     Pseudo-tokens (used in %prec declarations, but never
+     declared using %token) are filtered out. *)
+
+  let (n : int), (name : string array), (map : int StringMap.t) =
+    let tokens = 
+      StringMap.fold (fun token properties tokens ->
+       if properties.tk_is_declared then token :: tokens else tokens
+      ) Front.grammar.tokens []
+    in
+    match tokens with
+    | [] ->
+       Error.error [] "no tokens have been declared."
+    | _ ->
+       Misc.index ("error" :: tokens @ [ "#" ])
+
+  let print tok =
+    name.(tok)
+
+  let lookup name =
+    StringMap.find name map
+
+  let sharp =
+    lookup "#"
+
+  let error =
+    lookup "error"
+
+  let pseudo tok =
+    (tok = sharp) || (tok = error)
+
+  let token_properties = 
+    let not_so_dummy_properties = (* applicable to [error] and [#] *)
+      {
+       tk_filename      = "__primitives__";
+       tk_priority      = UndefinedPrecedence;
+       tk_associativity = UndefinedAssoc;
+       tk_ocamltype     = None;
+       tk_is_declared   = true;
+       tk_position      = Positions.dummy;
+      }
+    in
+    Array.init n (fun tok ->
+      try 
+        StringMap.find name.(tok) Front.grammar.tokens 
+       with Not_found ->
+        assert (tok = sharp || tok = error);
+        not_so_dummy_properties
+    )
+
+  let () =
+    Error.logG 1 (fun f ->
+      Printf.fprintf f "Grammar has %d terminal symbols.\n" (n - 2)
+    )
+
+  let precedence_level tok = 
+    TokPrecedence.levelip (print tok) token_properties.(tok)
+
+  let associativity tok =
+    token_properties.(tok).tk_associativity
+
+  let ocamltype tok =
+    token_properties.(tok).tk_ocamltype
+
+  let iter f =
+    Misc.iteri n f
+
+  let fold f accu =
+    Misc.foldi n f accu
+
+  let map f =
+    Misc.mapi n f
+
+  let mapx f =
+    assert (sharp = n - 1);
+    Misc.mapi (n-1) f
+
+  (* If a token named [EOF] exists, then it is assumed to represent
+     ocamllex's [eof] pattern, which means that the lexer may
+     eventually produce an infinite stream of [EOF] tokens. This,
+     combined with our error recovery mechanism, may lead to
+     non-termination. We provide a warning against this somewhat
+     obscure situation.
+
+     Relying on the token's name is somewhat fragile, but this saves
+     introducing an extra keyword for declaring which token represents
+     [eof], and should not introduce much confusion. *)
+
+  let eof =
+    try
+      Some (lookup "EOF")
+    with Not_found ->
+      None
+
+end
+
+(* Sets of terminals are used intensively in the LR(1) construction,
+   so it is important that they be as efficient as possible. *)
+
+module TerminalSet = struct
+
+  include CompressedBitSet 
+
+  let print toks =
+    let _, accu =
+      fold (fun tok (first, accu) ->
+       false,
+       if first then
+          accu ^ (Terminal.print tok)
+       else
+         accu ^ " " ^ (Terminal.print tok)
+    ) toks (true, "") in
+    accu
+
+  let universe =
+    remove Terminal.sharp (
+      remove Terminal.error (
+        Terminal.fold add empty
+      )
+    )
+
+end
+
+(* Maps over terminals. *)
+
+module TerminalMap = Patricia.Big
+
+(* ------------------------------------------------------------------------ *)
+(* Symbols. *)
+
+module Symbol = struct
+
+  type t =
+    | N of Nonterminal.t
+    | T of Terminal.t
+
+  let compare sym1 sym2 =
+    match sym1, sym2 with
+    | N nt1, N nt2 ->
+       Nonterminal.compare nt1 nt2
+    | T tok1, T tok2 ->
+       Terminal.compare tok1 tok2
+    | N _, T _ ->
+       1
+    | T _, N _ ->
+       -1
+
+  let equal sym1 sym2 =
+    compare sym1 sym2 = 0
+
+  let rec lequal syms1 syms2 =
+    match syms1, syms2 with
+    | [], [] ->
+       true
+    | sym1 :: syms1, sym2 :: syms2 ->
+       equal sym1 sym2 && lequal syms1 syms2
+    | _ :: _, []
+    | [], _ :: _ ->
+       false
+
+  let print = function
+    | N nt ->
+       Nonterminal.print false nt
+    | T tok ->
+       Terminal.print tok
+
+  let nonterminal = function
+    | T _ ->
+       false
+    | N _ ->
+       true
+
+  (* Printing an array of symbols. [offset] is the start offset -- we
+     print everything to its right. [dot] is the dot offset -- we
+     print a dot at this offset, if we find it. *)
+
+  let printaod offset dot symbols =
+    let buffer = Buffer.create 512 in
+    let length = Array.length symbols in
+    for i = offset to length do
+      if i = dot then
+       Buffer.add_string buffer ". ";
+      if i < length then begin
+       Buffer.add_string buffer (print symbols.(i));
+       Buffer.add_char buffer ' '
+      end
+    done;
+    Buffer.contents buffer
+
+  let printao offset symbols =
+    printaod offset (-1) symbols
+
+  let printa symbols =
+    printao 0 symbols
+
+  let printl symbols =
+    printa (Array.of_list symbols)
+
+  let lookup name =
+    try
+      T (Terminal.lookup name)
+    with Not_found ->
+      try
+       N (Nonterminal.lookup name)
+      with Not_found ->
+       assert false (* well-formedness check has been performed earlier *)
+
+end
+
+(* Sets of symbols. *)
+
+module SymbolSet = Set.Make(Symbol)
+
+(* Maps over symbols. *)
+
+module SymbolMap = struct
+
+  include Map.Make(Symbol)
+
+  let domain m =
+    fold (fun symbol _ accu ->
+      symbol :: accu
+    ) m []
+
+  let purelynonterminal m =
+    fold (fun symbol _ accu ->
+      accu && Symbol.nonterminal symbol
+    ) m true
+
+end
+
+(* ------------------------------------------------------------------------ *)
+(* Productions. *)
+
+module Production = struct
+
+  type index =
+      int
+
+  (* Create an array of productions. Record which productions are
+     associated with every nonterminal. A new production S' -> S
+     is created for every start symbol S. It is known as a
+     start production. *)
+
+  let n : int =
+    let n = StringMap.fold (fun _ { branches = branches } n ->
+      n + List.length branches
+    ) Front.grammar.rules 0 in
+    Error.logG 1 (fun f -> Printf.fprintf f "Grammar has %d productions.\n" n);
+    n + StringSet.cardinal Front.grammar.start_symbols
+
+  let p2i prod =
+    prod
+
+  let i2p prod =
+    assert (prod >= 0 && prod < n);
+    prod
+
+  let table : (Nonterminal.t * Symbol.t array) array =
+    Array.make n (-1, [||])
+
+  let identifiers : identifier array array =
+    Array.make n [||]
+
+  let used : bool array array =
+    Array.make n [||]
+
+  let actions : action option array =
+    Array.make n None
+
+  let ntprods : (int * int) array =
+    Array.make Nonterminal.n (-1, -1)
+
+  let positions : Positions.t list array =
+    Array.make n []
+
+  let (start : int),
+      (startprods : index NonterminalMap.t) =
+    StringSet.fold (fun nonterminal (k, startprods) ->
+      let nt = Nonterminal.lookup nonterminal
+      and nt' = Nonterminal.lookup (nonterminal ^ "'") in
+      table.(k) <- (nt', [| Symbol.N nt |]);
+      identifiers.(k) <- [| "_1" |];
+      used.(k) <- [| true |];
+      ntprods.(nt') <- (k, k+1);
+      positions.(k) <- Nonterminal.positions nt;
+      k+1,
+      NonterminalMap.add nt k startprods
+    ) Front.grammar.start_symbols (0, NonterminalMap.empty)
+
+  let prec_decl : symbol located option array = 
+    Array.make n None
+
+  let reduce_precedence : precedence_level array = 
+    Array.make n UndefinedPrecedence
+
+  let (_ : int) = StringMap.fold (fun nonterminal { branches = branches } k ->
+    let nt = Nonterminal.lookup nonterminal in
+    let k' = List.fold_left (fun k branch ->
+      let action = branch.action
+      and sprec = branch.branch_shift_precedence 
+      and rprec = branch.branch_reduce_precedence in   
+      let symbols = Array.of_list branch.producers in
+      table.(k) <- (nt, Array.map (fun (v, _) -> Symbol.lookup v) symbols);
+      identifiers.(k) <- Array.mapi (fun i (_, ido) ->
+       match ido with
+       | None ->
+           (* Symbols for which no name was chosen will be represented
+              by variables named _1, _2, etc. *)
+           Printf.sprintf "_%d" (i + 1)
+        | Some id ->
+           (* Symbols for which a name was explicitly chosen will be
+              known by that name in semantic actions. *)
+           id
+      ) symbols;
+      used.(k) <- Array.mapi (fun i (_, ido) ->
+       match ido with
+       | None ->
+           (* A symbol referred to as [$i] is used if and only if the
+              [$i] keyword appears in the semantic action. *)
+            Action.has_dollar (i + 1) action
+       | Some _ ->
+           (* A symbol referred to via a name is considered used.
+              This is a conservative approximation. *)
+            true
+      ) symbols;
+      actions.(k) <- Some action;
+      reduce_precedence.(k) <- rprec;
+      prec_decl.(k) <- sprec;
+      positions.(k) <- [ branch.branch_position ];
+      k+1
+    ) k branches in
+    ntprods.(nt) <- (k, k');
+    k'
+  ) Front.grammar.rules start
+
+  (* Iteration over the productions associated with a specific
+     nonterminal. *)
+
+  let iternt nt f =
+    let k, k' = ntprods.(nt) in
+    for prod = k to k' - 1 do
+      f prod
+    done
+
+  let foldnt (nt : Nonterminal.t) (accu : 'a) (f : index -> 'a -> 'a) : 'a =
+    let k, k' = ntprods.(nt) in
+    let rec loop accu prod =
+      if prod < k' then
+       loop (f prod accu) (prod + 1)
+      else
+       accu
+    in
+    loop accu k
+
+  (* Accessors. *)
+
+  let def prod =
+    table.(prod)
+
+  let nt prod =
+    let nt, _ = table.(prod) in
+    nt
+
+  let rhs prod =
+    let _, rhs = table.(prod) in
+    rhs
+
+  let length prod =
+    Array.length (rhs prod)
+
+  let identifiers prod =
+    identifiers.(prod)
+
+  let used prod =
+    used.(prod)
+
+  let is_start prod =
+    prod < start
+
+  let classify prod =
+    if is_start prod then
+      match (rhs prod).(0) with
+      | Symbol.N nt ->
+         Some nt
+      | Symbol.T _ ->
+         assert false
+    else
+      None
+
+  let action prod =
+    match actions.(prod) with
+    | Some action ->
+       action
+    | None ->
+       (* Start productions have no action. *)
+       assert (is_start prod);
+       assert false
+
+  let positions prod =
+    positions.(prod)
+
+  let startsymbol2startprod nt =
+    try
+      NonterminalMap.find nt startprods
+    with Not_found ->
+      assert false (* [nt] is not a start symbol *)
+
+  (* Iteration. *)
+
+  let iter f =
+    Misc.iteri n f
+
+  let fold f accu =
+    Misc.foldi n f accu
+
+  let map f =
+    Misc.mapi n f
+
+  let iterx f =
+    for prod = start to n - 1 do
+      f prod
+    done
+
+  let foldx f accu =
+    Misc.foldij start n f accu
+
+  (* Printing a production. *)
+
+  let print prod =
+    assert (not (is_start prod));
+    let nt, rhs = table.(prod) in
+    Printf.sprintf "%s -> %s" (Nonterminal.print false nt) (Symbol.printao 0 rhs)
+
+  (* Tabulation. *)
+
+  let tabulate f =
+    Misc.tabulateb n f
+
+  (* This array allows recording, on a production by production basis,
+     whether the production's shift precedence is ever useful. This
+     allows emitting warnings about useless %prec declarations. *)
+
+  let prec_decl_ever_useful =
+    Array.make n false
+
+  let consult_prec_decl prod =
+    lazy (prec_decl_ever_useful.(prod) <- true),
+    prec_decl.(prod)
+
+  let diagnostics () =
+    iterx (fun prod ->
+      if not prec_decl_ever_useful.(prod) then
+       match prec_decl.(prod) with
+       | None ->
+           ()
+       | Some id ->
+           Error.grammar_warning [Positions.position id] "this %prec declaration is never useful."
+    )
+
+  (* Determining the precedence level of a production. If no %prec
+     declaration was explicitly supplied, it is the precedence level
+     of the rightmost terminal symbol in the production's right-hand
+     side. *)
+
+  type production_level =
+    | PNone
+    | PRightmostToken of Terminal.t
+    | PPrecDecl of symbol
+
+  let rightmost_terminal prod =
+    Array.fold_left (fun accu symbol ->
+      match symbol with
+      | Symbol.T tok ->
+         PRightmostToken tok
+      | Symbol.N _ ->
+         accu
+    ) PNone (rhs prod)
+
+  let combine e1 e2 =
+    lazy (Lazy.force e1; Lazy.force e2)
+
+  let shift_precedence prod =
+    let fact1, prec_decl = consult_prec_decl prod in
+    let oterminal =
+      match prec_decl with
+      | None ->
+         rightmost_terminal prod
+      | Some { value = terminal } ->
+         PPrecDecl terminal
+    in
+    match oterminal with
+    | PNone ->
+       fact1, UndefinedPrecedence
+    | PRightmostToken tok ->
+       let fact2, level = Terminal.precedence_level tok in
+       combine fact1 fact2, level
+    | PPrecDecl id ->
+       let fact2, level = TokPrecedence.leveli id  in
+       combine fact1 fact2, level
+
+end
+
+(* ------------------------------------------------------------------------ *)
+(* Maps over productions. *)
+
+module ProductionMap = struct
+
+  include Patricia.Big
+
+  (* Iteration over the start productions only. *)
+
+  let start f =
+    Misc.foldi Production.start (fun prod m ->
+      add prod (f prod) m
+    ) empty
+
+end
+
+(* ------------------------------------------------------------------------ *)
+(* Build the grammar's forward and backward reference graphs.
+
+   In the backward reference graph, edges relate each nonterminal [nt]
+   to each of the nonterminals whose definition mentions [nt]. The
+   reverse reference graph is used in the computation of the nullable,
+   nonempty, and FIRST sets.
+
+   The forward reference graph is unused but can be printed on demand. *)
+
+let forward : NonterminalSet.t array =
+  Array.create Nonterminal.n NonterminalSet.empty
+
+let backward : NonterminalSet.t array =
+  Array.create Nonterminal.n NonterminalSet.empty
+
+let () =
+  Array.iter (fun (nt1, rhs) ->
+    Array.iter (function
+      | Symbol.T _ ->
+         ()
+      | Symbol.N nt2 ->
+         forward.(nt1) <- NonterminalSet.add nt2 forward.(nt1);
+         backward.(nt2) <- NonterminalSet.add nt1 backward.(nt2)
+    ) rhs
+  ) Production.table
+
+(* ------------------------------------------------------------------------ *)
+(* If requested, dump the forward reference graph. *)
+
+let () =
+  if Settings.graph then
+    let module P = Dot.Print (struct
+      type vertex = Nonterminal.t
+      let name nt =
+       Printf.sprintf "nt%d" nt
+      let successors (f : ?style:Dot.style -> label:string -> vertex -> unit) nt =
+       NonterminalSet.iter (fun successor ->
+         f ~label:"" successor
+       ) forward.(nt)
+      let iter (f : ?style:Dot.style -> label:string -> vertex -> unit) =
+       Nonterminal.iter (fun nt ->
+         f ~label:(Nonterminal.print false nt) nt
+       )
+    end) in
+    let f = open_out (Settings.base ^ ".dot") in
+    P.print f;
+    close_out f
+
+(* ------------------------------------------------------------------------ *)
+(* Generic support for fixpoint computations.
+
+   A fixpoint computation associates a property with every nonterminal.
+   A monotone function tells how properties are computed. [compute nt]
+   updates the property associated with nonterminal [nt] and returns a
+   flag that tells whether the property actually needed an update. The
+   state of the computation is maintained entirely inside [compute] and
+   is invisible here.
+
+   Whenever a property of [nt] is updated, the properties of the
+   terminals whose definitions depend on [nt] are updated. The
+   dependency graph must be explicitly supplied. *)
+
+let fixpoint (dependencies : NonterminalSet.t array) (compute : Nonterminal.t -> bool) : unit =
+  let queue : Nonterminal.t Queue.t = Queue.create () in
+  let onqueue : bool array = Array.make Nonterminal.n true in
+  for i = 0 to Nonterminal.n - 1 do
+    Queue.add i queue
+  done;
+  Misc.qiter (fun nt ->
+    onqueue.(nt) <- false;
+    let changed = compute nt in
+    if changed then
+      NonterminalSet.iter (fun nt ->
+       if not onqueue.(nt) then begin
+         Queue.add nt queue;
+         onqueue.(nt) <- true
+       end
+      ) dependencies.(nt)
+  ) queue
+
+(* ------------------------------------------------------------------------ *)
+(* Compute which nonterminals are nonempty, that is, recognize a
+   nonempty language. Also, compute which nonterminals are
+   nullable. The two computations are almost identical. The only
+   difference is in the base case: a single terminal symbol is not
+   nullable, but is nonempty. *)
+
+let compute (basecase : bool) : (bool array) * (Symbol.t -> bool) =
+  let property : bool array =
+    Array.make Nonterminal.n false
+  in
+  let symbol_has_property = function
+    | Symbol.T _ ->
+       basecase
+    | Symbol.N nt ->
+       property.(nt)
+  in
+  fixpoint backward (fun nt ->
+    if property.(nt) then
+      false (* no change *)
+    else
+      (* disjunction over all productions for this nonterminal *)
+      let updated = Production.foldnt nt false (fun prod accu ->
+       accu ||
+       let rhs = Production.rhs prod in
+       (* conjunction over all symbols in the right-hand side *)
+       Array.fold_left (fun accu symbol ->
+         accu && symbol_has_property symbol
+       ) true rhs
+      ) in
+      property.(nt) <- updated;
+      updated
+  );
+  property, symbol_has_property
+
+let () =
+  let nonempty, _ = compute true in
+  for nt = Nonterminal.start to Nonterminal.n - 1 do
+    if not nonempty.(nt) then
+      Error.grammar_warning
+       (Nonterminal.positions nt)
+       (Printf.sprintf "%s generates the empty language." (Nonterminal.print false nt))
+  done
+
+let (nullable : bool array), (nullable_symbol : Symbol.t -> bool) =
+  compute false
+
+(* ------------------------------------------------------------------------ *)
+(* Compute FIRST sets. *)
+
+let first =
+  Array.make Nonterminal.n TerminalSet.empty
+
+let first_symbol = function
+  | Symbol.T tok ->
+      TerminalSet.singleton tok
+  | Symbol.N nt ->
+      first.(nt)
+
+let nullable_first_rhs (rhs : Symbol.t array) (i : int) : bool * TerminalSet.t =
+  let length = Array.length rhs in
+  assert (i <= length);
+  let rec loop i toks =
+    if i = length then
+      true, toks
+    else
+      let symbol = rhs.(i) in
+      let toks = TerminalSet.union (first_symbol symbol) toks in
+      if nullable_symbol symbol then
+       loop (i+1) toks
+      else
+       false, toks
+  in
+  loop i TerminalSet.empty
+
+let () =
+  fixpoint backward (fun nt ->
+    let original = first.(nt) in
+    (* union over all productions for this nonterminal *)
+    let updated = Production.foldnt nt TerminalSet.empty (fun prod accu ->
+      let rhs = Production.rhs prod in
+      let _, toks = nullable_first_rhs rhs 0 in
+      TerminalSet.union toks accu
+    ) in
+    first.(nt) <- updated;
+    TerminalSet.compare original updated <> 0
+  )
+
+(* ------------------------------------------------------------------------ *)
+(* Dump the analysis results. *)
+
+let () =
+  Error.logG 2 (fun f ->
+    for nt = 0 to Nonterminal.n - 1 do
+      Printf.fprintf f "nullable(%s) = %b\n"
+       (Nonterminal.print false nt)
+       nullable.(nt)
+    done;
+    for nt = 0 to Nonterminal.n - 1 do
+      Printf.fprintf f "first(%s) = %s\n"
+       (Nonterminal.print false nt)
+       (TerminalSet.print first.(nt))
+    done
+  )
+
+let () =
+  Time.tick "Analysis of the grammar"
+
+(* ------------------------------------------------------------------------ *)
+(* Compute FOLLOW sets. Unnecessary for us, but requested by a user. Also,
+   this is useful for the SLR(1) test. Thus, we perform this analysis only
+   on demand. *)
+
+let follow : TerminalSet.t array Lazy.t =
+  lazy (
+
+    let follow =
+      Array.make Nonterminal.n TerminalSet.empty
+
+    and forward : NonterminalSet.t array =
+      Array.create Nonterminal.n NonterminalSet.empty
+
+    and backward : NonterminalSet.t array =
+      Array.create Nonterminal.n NonterminalSet.empty
+
+    in
+
+    (* Iterate over all productions. *)
+    Array.iter (fun (nt1, rhs) ->
+      (* Iterate over all nonterminal symbols [nt2] in the right-hand side. *)
+      Array.iteri (fun i symbol ->
+       match symbol with
+       | Symbol.T _ ->
+           ()
+       | Symbol.N nt2 ->
+           let nullable, first = nullable_first_rhs rhs (i+1) in
+           (* The FIRST set of the remainder of the right-hand side
+              contributes to the FOLLOW set of [nt2]. *)
+           follow.(nt2) <- TerminalSet.union first follow.(nt2);
+           (* If the remainder of the right-hand side is nullable,
+              FOLLOW(nt1) contributes to FOLLOW(nt2). *)
+           if nullable then begin
+             forward.(nt1) <- NonterminalSet.add nt2 forward.(nt1);
+             backward.(nt2) <- NonterminalSet.add nt1 backward.(nt2)
+           end
+      ) rhs
+    ) Production.table;
+
+    (* The fixpoint computation used here is not the most efficient
+       algorithm -- one could do better by first collapsing the
+       strongly connected components, then walking the graph in
+       topological order. But this will do. *)
+
+    fixpoint forward (fun nt ->
+      let original = follow.(nt) in
+      (* union over all contributors *)
+      let updated = NonterminalSet.fold (fun nt' accu ->
+       TerminalSet.union follow.(nt') accu
+      ) backward.(nt) original in
+      follow.(nt) <- updated;
+      TerminalSet.compare original updated <> 0
+    );
+
+    follow
+
+  )
+
+(* Define an accessor that triggers the computation of the FOLLOW sets
+   if it has not been performed already. *)
+
+let follow nt =
+  (Lazy.force follow).(nt)
+
+(* At log level 2, display the FOLLOW sets. *)
+
+let () =
+  Error.logG 2 (fun f ->
+    for nt = 0 to Nonterminal.n - 1 do
+      Printf.fprintf f "follow(%s) = %s\n"
+       (Nonterminal.print false nt)
+       (TerminalSet.print (follow nt))
+    done
+  )
+
+(* ------------------------------------------------------------------------ *)
+(* Provide explanations about FIRST sets. *)
+
+(* The idea is to explain why a certain token appears in the FIRST set
+   for a certain sequence of symbols. Such an explanation involves
+   basic assertions of the form (i) symbol N is nullable and (ii) the
+   token appears in the FIRST set for symbol N. We choose to take
+   these basic facts for granted, instead of recursively explaining
+   them, so as to keep explanations short. *)
+
+(* We first produce an explanation in abstract syntax, then
+   convert it to a human-readable string. *)
+
+type explanation =
+  | EObvious                                 (* sequence begins with desired token *)
+  | EFirst of Terminal.t * Nonterminal.t     (* sequence begins with a nonterminal that produces desired token *)
+  | ENullable of Symbol.t list * explanation (* sequence begins with a list of nullable symbols and ... *)
+
+let explain (tok : Terminal.t) (rhs : Symbol.t array) (i : int) =
+  let length = Array.length rhs in
+  let rec loop i =
+    assert (i < length);
+    let symbol = rhs.(i) in
+    match symbol with
+    | Symbol.T tok' ->
+       assert (Terminal.equal tok tok');
+       EObvious
+    | Symbol.N nt ->
+       if TerminalSet.mem tok first.(nt) then
+         EFirst (tok, nt)
+       else begin
+         assert nullable.(nt);
+         match loop (i + 1) with
+         | ENullable (symbols, e) ->
+             ENullable (symbol :: symbols, e)
+         | e ->
+             ENullable ([ symbol ], e)
+       end
+  in
+  loop i
+
+let rec convert = function
+  | EObvious ->
+      ""
+  | EFirst (tok, nt) ->
+      Printf.sprintf "%s can begin with %s"
+       (Nonterminal.print false nt)
+       (Terminal.print tok)
+  | ENullable (symbols, e) ->
+      let e = convert e in
+      Printf.sprintf "%scan vanish%s%s"
+       (Symbol.printl symbols)
+       (if e = "" then "" else " and ")
+       e
+
+(* ------------------------------------------------------------------------ *)
+(* Package the analysis results. *)
+
+module Analysis = struct
+
+  let nullable_first_rhs = nullable_first_rhs
+
+  let explain_first_rhs (tok : Terminal.t) (rhs : Symbol.t array) (i : int) =
+    convert (explain tok rhs i)
+
+  let follow = follow
+
+end
+
+(* ------------------------------------------------------------------------ *)
+(* Conflict resolution via precedences. *)
+
+module Precedence = struct
+
+  type choice =
+    | ChooseShift
+    | ChooseReduce
+    | ChooseNeither
+    | DontKnow
+
+  type order = Lt | Gt | Eq | Ic
+
+  let precedence_order p1 p2 = 
+    match p1, p2 with
+      |        UndefinedPrecedence, _
+      | _, UndefinedPrecedence -> 
+         Ic
+
+      | PrecedenceLevel (m1, l1, _, _), PrecedenceLevel (m2, l2, _, _) ->
+         if not (Mark.same m1 m2) then
+           Ic
+         else
+           if l1 > l2 then 
+             Gt 
+           else if l1 < l2 then 
+             Lt
+           else 
+             Eq
+
+  let shift_reduce tok prod =
+    let fact1, tokp  = Terminal.precedence_level tok
+    and fact2, prodp = Production.shift_precedence prod in
+    match precedence_order tokp prodp with
+   
+      (* Our information is inconclusive. Drop [fact1] and [fact2],
+        that is, do not record that this information was useful. *)
+
+    | Ic ->
+       DontKnow
+
+      (* Our information is useful. Record that fact by evaluating
+        [fact1] and [fact2]. *)
+
+    | (Eq | Lt | Gt) as c ->
+       Lazy.force fact1;
+       Lazy.force fact2;
+       match c with
+
+       | Ic ->
+           assert false (* already dispatched *)
+
+       | Eq -> 
+           begin
+             match Terminal.associativity tok with
+             | LeftAssoc  -> ChooseReduce
+             | RightAssoc -> ChooseShift
+             | NonAssoc   -> ChooseNeither
+             | _          -> assert false
+                             (* If [tok]'s precedence level is defined, then
+                                its associativity must be defined as well. *)
+           end
+
+       | Lt ->
+           ChooseReduce
+
+       | Gt ->
+           ChooseShift
+
+
+  let reduce_reduce prod1 prod2 =
+    let rp1 = Production.reduce_precedence.(prod1) 
+    and rp2 = Production.reduce_precedence.(prod2) in
+    match precedence_order rp1 rp2 with
+    | Lt -> 
+       Some prod1
+    | Gt -> 
+       Some prod2
+    | Eq -> 
+       (* the order is strict except in presence of inlining: 
+          two branches can have the same precedence level when
+          they come from an inlined one. *)
+       None
+    | Ic -> 
+       None
+
+end
+  
+let diagnostics () =
+  TokPrecedence.diagnostics();
+  Production.diagnostics()
+
diff --git a/bundles/menhirLib/menhir-20120123/src/grammar.mli b/bundles/menhirLib/menhir-20120123/src/grammar.mli
new file mode 100644 (file)
index 0000000..e9cddf7
--- /dev/null
@@ -0,0 +1,437 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* This module transforms [Front.grammar], an abstract syntax tree for
+   the grammar, into an internal representation of the grammar that is
+   more usable. *)
+
+(* ------------------------------------------------------------------------ *)
+(* Nonterminals. *)
+
+module Nonterminal : sig
+
+  (* The type of nonterminals. *)
+
+  type t
+
+  (* The number of nonterminals. This includes the extra nonterminals
+     that are internally generated for the grammar's entry points. *)
+
+  val n: int
+
+  (* [lookup] maps an identifier to a nonterminal, or raises [Not_found]. *)
+
+  val lookup : string -> t
+
+  (* Nonterminals can be converted to integers. This feature is
+     exploited in the table-based back-end. *)
+
+  val n2i: t -> int
+
+  (* This produces a string representation of a nonterminal. It should
+     in principle never be applied to one of the internally generated
+     nonterminals, as we do not wish users to become aware of the
+     existence of these extra nonterminals. However, we do sometimes
+     violate this rule when it is difficult to do otherwise.
+
+     The Boolean parameter tells whether the string representation
+     should be normalized, that is, whether parentheses and commas
+     should be eliminated. This is necessary if the string is intended
+     for use as a valid nonterminal name or as a valid Objective Caml
+     identifier. *)
+
+  val print: bool -> t -> string
+
+  (* This is the Objective Caml type associated with a nonterminal
+     symbol. It is known only if a %type declaration was provided.
+     This function is not applicable to the internally generated
+     nonterminals. *)
+
+  val ocamltype: t -> Stretch.ocamltype option
+
+  (* Iteration over nonterminals. The order in which elements are
+     examined, and the order of [map]'s output list, correspond to the
+     numeric indices produced by [n2i] above. *)
+
+  val iter: (t -> unit) -> unit
+  val fold: (t -> 'a -> 'a) -> 'a -> 'a
+  val map: (t -> 'a) -> 'a list
+
+  (* Iteration over all nonterminals, except the start nonterminals. *)
+
+  val iterx: (t -> unit) -> unit
+  val foldx: (t -> 'a -> 'a) -> 'a -> 'a 
+
+  (* Tabulation of a function over nonterminals. *)
+
+  val tabulate: (t -> 'a) -> (t -> 'a)
+
+  (* [positions nt] is a list of the positions associated with the
+     definition of [nt]. There can be more than one position because
+     definitions can be split over multiple files. *)
+
+  val positions: t -> Positions.t list
+
+  (* This tells whether a non-terminal symbol is one of the start
+     symbols. *)
+
+  val is_start: t -> bool
+
+end
+
+(* ------------------------------------------------------------------------ *)
+(* Terminals. *)
+
+module Terminal : sig
+
+  (* The type of terminals. *)
+
+  type t
+
+  (* The number of terminals. This includes the two pseudo-tokens
+     [#] and [error]. *)
+
+  val n: int
+
+  (* Comparison. *)
+
+  val equal: t -> t -> bool
+
+  (* [lookup] maps an identifier to a terminal, or raises [Not_found]. *)
+
+  val lookup : string -> t
+
+  (* Terminals can be converted to integers. This feature is exploited
+     in the table-based back-end. *)
+
+  val t2i: t -> int
+
+  (* This produces a string representation of a terminal. *)
+
+  val print: t -> string
+
+  (* This is the Objective Caml type associated with a terminal
+     symbol. It is known only if the %token declaration was
+     accompanied with a type. *)
+
+  val ocamltype: t -> Stretch.ocamltype option
+
+  (* These are the two pseudo-tokens [#] and [error]. The former is
+     used to denote the end of the token stream. The latter is
+     accessible to the user and is used for handling errors. *)
+
+  val sharp: t
+  val error: t
+
+  (* This is the programmer-defined [EOF] token, if there is one. It
+     is recognized based solely on its name, which is fragile, but
+     this behavior is documented. This token is assumed to represent
+     [ocamllex]'s [eof] pattern. It is used only in emitting warnings
+     in [--error-recovery] mode. *)
+
+  val eof: t option
+
+  (* This returns [true] if and only if the token at hand is one of
+     [#] or [error]. *)
+
+  val pseudo: t -> bool
+
+  (* Iteration over terminals. The order in which elements are
+     examined, and the order of [map]'s output list, correspond to the
+     numeric indices produced by [t2i] above. [mapx] offers iteration
+     over all terminals except [#]. *)
+
+  val iter: (t -> unit) -> unit
+  val fold: (t -> 'a -> 'a) -> 'a -> 'a
+  val map: (t -> 'a) -> 'a list
+  val mapx: (t -> 'a) -> 'a list
+
+end
+
+(* ------------------------------------------------------------------------ *)
+(* Sets and maps over terminals. *)
+
+module TerminalSet : sig
+
+  (* All of the operations documented in [GSet] are available. *)
+
+  include GSet.S with type element = Terminal.t
+
+  (* This offers a string representation of a set of terminals. The
+     symbols are simply listed one after the other and separated with
+     spaces. *)
+
+  val print: t -> string
+
+  (* This is the set of all terminal symbols except the pseudo-tokens
+     [#] and [error]. *)
+
+  val universe: t
+
+end
+
+(* All of the operations documented in [GMap] are available. *)
+
+module TerminalMap : GMap.S with type key = Terminal.t
+
+(* ------------------------------------------------------------------------ *)
+(* Symbols. *)
+
+module Symbol : sig
+
+  (* A symbol is either a nonterminal or a terminal. *)
+
+  type t =
+    | N of Nonterminal.t
+    | T of Terminal.t
+
+  (* Comparison. *)
+
+  val equal: t -> t -> bool
+  val lequal: t list -> t list -> bool
+
+  (* These produce a string representation of a symbol, of a list of
+     symbols, or of an array of symbols. The symbols are simply listed
+     one after the other and separated with spaces. [printao] prints
+     an array of symbols, starting at a particular offset. [printaod]
+     is analogous, but can also print a single dot at a particular
+     position between two symbols. *)
+
+  val print: t -> string
+  val printl: t list -> string
+  val printa: t array -> string
+  val printao: int -> t array -> string
+  val printaod: int -> int -> t array -> string
+
+end
+
+(* ------------------------------------------------------------------------ *)
+(* Sets and maps over symbols. *)
+
+(* All of the operations documented in [Set] are available. *)
+
+module SymbolSet : Set.S with type elt = Symbol.t
+
+module SymbolMap : sig
+
+  (* All of the operations documented in [Map] are available. *)
+
+  include Map.S with type key = Symbol.t
+
+  val domain: 'a t -> key list
+
+  (* This returns [true] if and only if all of the symbols in
+     the domain of the map at hand are nonterminals. *)
+
+  val purelynonterminal: 'a t -> bool
+
+end
+
+(* ------------------------------------------------------------------------ *)
+(* Productions. *)
+
+module Production : sig
+
+  (* This is the type of productions. This includes user-defined
+     productions as well as the internally generated productions
+     associated with the start symbols. *)
+
+  type index
+
+  (* Productions can be converted to integers and back. This is unsafe
+     and should be avoided as much as possible. This feature is
+     exploited, for efficiency, in the encoding of items. *)
+
+  val p2i: index -> int
+  val i2p: int -> index
+
+  (* The number of productions. *)
+
+  val n: int
+
+  (* These map a production index to the production's definition, that
+     is, a nonterminal (the left-hand side) and an array of symbols
+     (the right-hand side). *)
+
+  val def: index -> Nonterminal.t * Symbol.t array
+  val nt: index -> Nonterminal.t
+  val rhs: index -> Symbol.t array
+  val length: index -> int
+
+  (* This maps a production index to an array of the identifiers that
+     should be used for naming the semantic values of the symbols in
+     the right-hand side. *)
+
+  val identifiers: index -> Syntax.identifier array
+
+  (* This maps a production index to an array of Boolean flag. Each
+     flag tells whether the semantic value of the corresponding symbol
+     is used in the semantic action. This is a conservative
+     approximation: [true] means maybe, while [false] means certainly
+     not. *)
+
+  val used: index -> bool array  
+
+  (* This maps a production index to the production's semantic action.
+     This function is not applicable to a start production. *)
+
+  val action: index -> Syntax.action
+
+  (* [positions prod] is a list of the positions associated with
+     production [prod]. This is usually a singleton list, but there
+     can be more than one position for start productions when the
+     definition of the corresponding start symbol is split over
+     multiple files. *)
+
+  val positions: index -> Positions.t list
+
+  (* Iteration over all productions. The order in which elements
+     are examined, and the order of [map]'s output list, correspond
+     to the numeric indices produced by [p2i] above. *)
+
+  val iter: (index -> unit) -> unit
+  val fold: (index -> 'a -> 'a) -> 'a -> 'a
+  val map: (index -> 'a) -> 'a list
+
+  (* Iteration over all productions, except the start productions. *)
+
+  val iterx: (index -> unit) -> unit
+  val foldx: (index -> 'a -> 'a) -> 'a -> 'a
+
+  (* This maps a (user) non-terminal start symbol to the corresponding
+     start production. *)
+
+  val startsymbol2startprod: Nonterminal.t -> index
+
+  (* Iteration over the productions associated with a specific
+     nonterminal. *)
+
+  val iternt: Nonterminal.t -> (index -> unit) -> unit
+  val foldnt: Nonterminal.t -> 'a -> (index -> 'a -> 'a) -> 'a
+
+  (* This allows determining whether a production is a start
+     production. If it is a start production, the start symbol that it
+     is associated with is returned. If it is a regular production,
+     nothing is returned. *)
+
+  val classify: index -> Nonterminal.t option
+
+  (* This produces a string representation of a production. It should
+     never be applied to a start production, as we do not wish users
+     to become aware of the existence of these extra productions. *)
+
+  val print: index -> string
+
+  (* Tabulation of a Boolean function over nonterminals. [tabulate f]
+     returns a tabulated version of [f] as well as the number of
+     productions where [f] is true. *)
+
+  val tabulate: (index -> bool) -> (index -> bool) * int
+
+end
+
+(* ------------------------------------------------------------------------ *)
+(* Maps over productions. *)
+
+module ProductionMap : sig
+
+  include GMap.S with type key = Production.index
+
+  (* Iteration over the start productions only. *)
+
+  val start: (Production.index -> 'a) -> 'a t
+
+end
+
+(* ------------------------------------------------------------------------ *)
+(* Analysis of the grammar. *)
+
+module Analysis : sig
+
+  (* [nullable_first_rhs rhs i] considers the string of symbols found at
+     offset [i] in the array [rhs]. It returns its NULLABLE flag as well
+     as its FIRST set. The offset [i] must be contained between [0] and
+     [n], where [n] is the length of [rhs], inclusive. *)
+
+  val nullable_first_rhs: Symbol.t array -> int -> bool * TerminalSet.t
+
+  (* [explain_first_rhs tok rhs i] explains why the token [tok] appears
+     in the FIRST set for the string of symbols found at offset [i] in
+     the array [rhs]. *)
+
+  val explain_first_rhs: Terminal.t -> Symbol.t array -> int -> string
+
+  (* [follow nt] is the FOLLOW set of the non-terminal symbol [nt], that
+     is, the set of terminal symbols that could follow an expansion of
+     [nt] in a valid sentence. *)
+
+  val follow: Nonterminal.t -> TerminalSet.t
+
+end
+
+(* ------------------------------------------------------------------------ *)
+(* Conflict resolution via precedences. *)
+
+module Precedence : sig
+
+  (* Shift/reduce conflicts require making a choice between shifting a
+     token and reducing a production. How these choices are made is of
+     no concern to the back-end, but here is a rough explanation.
+
+     Shifting is preferred when the token has higher precedence than
+     the production, or they have same precedence and the token is
+     right-associative.
+
+     Reducing is preferred when the token has lower precedence than
+     the production, or they have same precedence and the token is
+     left-associative.
+
+     Neither is allowed when the token and the production have same
+     precedence and the token is non-associative.
+
+     No preference is explicitly specified when the token or the
+     production has undefined precedence. In that case, the default
+     choice is to prefer shifting, but a conflict will be reported. *)
+
+  type choice =
+    | ChooseShift
+    | ChooseReduce
+    | ChooseNeither
+    | DontKnow
+
+  val shift_reduce: Terminal.t -> Production.index -> choice
+
+  (* Reduce/reduce conflicts require making a choice between reducing
+     two distinct productions. This is done by exploiting a partial
+     order on productions.
+
+     For compatibility with ocamlyacc, this order should be total and
+     should correspond to textual order when the two productions
+     originate in the same source file. When they originate in
+     different source files, the two productions should be
+     incomparable. *)
+
+  val reduce_reduce: Production.index -> Production.index -> Production.index option
+
+end
+
+(* ------------------------------------------------------------------------ *)
+(* Diagnostics. *)
+
+(* This function prints diagnostics about precedence declarations that
+   are never consulted. It is called after the automaton is
+   constructed. *)
+
+val diagnostics: unit -> unit
+
diff --git a/bundles/menhirLib/menhir-20120123/src/infer.ml b/bundles/menhirLib/menhir-20120123/src/infer.ml
new file mode 100644 (file)
index 0000000..c1965b1
--- /dev/null
@@ -0,0 +1,375 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+open Syntax
+open Stretch
+open UnparameterizedSyntax
+open IL
+open CodeBits
+open TokenType
+
+(* ------------------------------------------------------------------------- *)
+(* Naming conventions. *)
+
+(* The type variable associated with a nonterminal symbol. Its name
+   begins with a prefix which ensures that it cannot clash with
+   Objective Caml keywords. *)
+
+let ntvar symbol =
+  Printf.sprintf "tv_%s" (Misc.normalize symbol)
+
+(* The name of the temporary file. *)
+
+let base =
+  Settings.base
+
+let mlname =
+  base ^ ".ml"
+
+let mliname =
+  base ^ ".mli"
+
+(* ------------------------------------------------------------------------- *)
+(* Code production. *)
+
+(* [nttype nt] is the type of the nonterminal [nt], as currently
+   known. *)
+
+let nttype grammar nt =
+   try
+     TypTextual (StringMap.find nt grammar.types)
+   with Not_found ->
+     TypVar (ntvar nt)
+
+(* [is_standard] determines whether a branch derives from a standard
+   library definition. The method, based on a file name, is somewhat
+   fragile. *)
+
+let is_standard branch =
+  List.for_all (fun x -> x = Settings.stdlib_filename) (Action.filenames branch.action)
+
+(* [actiondef] turns a branch into a function definition. *)
+
+let actiondef grammar symbol branch =
+
+  (* Construct a list of the semantic action's formal parameters that
+     depend on the production's right-hand side. *)
+
+  let _, formals =
+    List.fold_left (fun (i, formals) (symbol, ido) ->
+      let id, startp, endp, starto, endo =
+       match ido with
+       | None ->
+           (* Symbols for which no name was chosen will be represented
+              by variables named _1, _2, etc. *)
+           Printf.sprintf "_%d" (i + 1),
+           Printf.sprintf "_startpos__%d_" (i + 1),
+           Printf.sprintf "_endpos__%d_" (i + 1),
+           Printf.sprintf "_startofs__%d_" (i + 1),
+           Printf.sprintf "_endofs__%d_" (i + 1)
+        | Some id ->
+           (* Symbols for which a name was explicitly chosen will be
+              known by that name in semantic actions. *)
+           id,
+           Printf.sprintf "_startpos_%s_" id,
+           Printf.sprintf "_endpos_%s_" id,
+           Printf.sprintf "_startofs_%s_" id,
+           Printf.sprintf "_endofs_%s_" id
+      in
+      let t =
+       try
+         let props = StringMap.find symbol grammar.tokens in
+         (* Symbol is a terminal. *)
+         match props.tk_ocamltype with
+         | None ->
+             tunit
+         | Some ocamltype ->
+             TypTextual ocamltype
+       with Not_found ->
+         (* Symbol is a nonterminal. *)
+         nttype grammar symbol
+      in
+      i + 1,
+      PAnnot (PVar id, t) ::
+      PAnnot (PVar startp, tposition) ::
+      PAnnot (PVar endp, tposition) ::
+      PAnnot (PVar starto, tint) ::
+      PAnnot (PVar endo, tint) ::
+      formals
+    ) (0, []) branch.producers
+  in
+
+  (* Extend the list with parameters that do not depend on the
+     right-hand side. *)
+
+  let formals =
+    PAnnot (PVar "_previouserror", tint) ::
+    PAnnot (PVar "_eRR", texn) ::
+    PAnnot (PVar "_startpos", tposition) ::
+    PAnnot (PVar "_endpos", tposition) ::
+    PAnnot (PVar "_startofs", tint) ::
+    PAnnot (PVar "_endofs", tint) ::
+    formals
+  in
+
+  (* Construct a function definition out of the above bindings and the
+     semantic action. *)
+
+  let body =
+    EAnnot (
+      Action.to_il_expr branch.action,
+      type2scheme (nttype grammar symbol)
+    )
+  in
+
+  match formals with
+  | [] ->
+      body
+  | _ ->
+      EFun (formals, body)
+
+(* [program] turns an entire grammar into a test program. *)
+
+let program grammar =
+
+  (* Turn the grammar into a bunch of function definitions. Grammar
+     productions that derive from the standard library are reflected
+     first, so that type errors are not reported in them. *)
+
+  let bindings1, bindings2 = 
+    StringMap.fold (fun symbol rule (bindings1, bindings2) ->
+      List.fold_left (fun (bindings1, bindings2) branch ->
+       if is_standard branch then
+         (PWildcard, actiondef grammar symbol branch) :: bindings1, bindings2
+       else
+         bindings1, (PWildcard, actiondef grammar symbol branch) :: bindings2
+      ) (bindings1, bindings2) rule.branches
+    ) grammar.rules ([], [])
+  in
+
+  (* Create entry points whose types are the unknowns that we are
+     looking for. *)
+
+  let ps, ts =
+    StringMap.fold (fun symbol _ (ps, ts) ->
+      PVar (Misc.normalize symbol) :: ps,
+      nttype grammar symbol :: ts
+    ) grammar.rules ([], [])
+  in
+
+  let def = {
+    valpublic = true;
+    valpat = PTuple ps;
+    valval = ELet (bindings1 @ bindings2, EAnnot (bottom, type2scheme (TypTuple ts)))
+  }
+  in
+
+  (* Insert markers to delimit the part of the file that we are
+     interested in. These markers are recognized by [Lexmli]. This
+     helps skip the values, types, exceptions, etc. that might be
+     defined by the prologue or postlogue. *)
+
+  let begindef = {
+    valpublic = true;
+    valpat = PVar "menhir_begin_marker";
+    valval = EIntConst 0
+  }
+  and enddef = {
+    valpublic = true;
+    valpat = PVar "menhir_end_marker";
+    valval = EIntConst 0
+  } in
+
+  (* Issue the test program. We include the definition of the type of
+     tokens, because, in principle, the semantic actions may refer to
+     it or to its data constructors. *)
+
+  {
+    paramdefs = PreFront.grammar.parameters;
+    prologue = PreFront.grammar.preludes;
+    excdefs = [];
+    typedefs = tokentypedef;
+    nonrecvaldefs = [ begindef; def; enddef ];
+    moduledefs = [];
+    valdefs = [];
+    postlogue = PreFront.grammar.postludes
+  }
+
+(* ------------------------------------------------------------------------- *)
+(* Writing the program associated with a grammar to a file. *)
+
+let write grammar () =
+  let ml = open_out mlname in
+  let module P = Printer.Make (struct
+    let f = ml
+    let locate_stretches = Some mlname
+    let raw_stretch_action = false
+  end) in
+  P.program (program grammar);
+  close_out ml
+
+let remove filename () =
+  Sys.remove filename
+
+(* ------------------------------------------------------------------------- *)
+(* Moving away and restoring a file. *)
+
+let mover filename =
+  if Sys.file_exists filename then
+    let newname =
+      filename ^ ".moved_by_menhir"
+    in
+    let moveaway () =
+      Sys.rename filename newname
+    and restore () =
+      Sys.rename newname filename
+    in
+    moveaway, restore
+  else
+    let nothing () = () in
+    nothing, nothing
+
+(* ------------------------------------------------------------------------- *)
+(* Running ocamldep on the program. *)
+
+type entry =
+    string (* basename *) * string (* filename *)
+
+type line =
+    entry (* target *) * entry list (* dependencies *)
+
+let depend grammar =
+
+  (* Create an [.ml] file and an [.mli] file, then invoke ocamldep to
+     compute dependencies for us. *)
+
+  (* If an old [.ml] or [.mli] file exists, we are careful to preserve
+     it. We temporarily move it out of the way and restore it when we
+     are done. There is no reason why dependency analysis should
+     destroy existing files. *)
+
+  let moveml, restoreml =
+    mover mlname
+  and movemli, restoremli =
+    mover mliname
+  in
+
+  let output =
+    IO.winvoke
+      [ moveml; movemli; write grammar; Interface.write ]
+      (Printf.sprintf "%s %s %s" Settings.ocamldep (Filename.quote mlname) (Filename.quote mliname))
+      [ remove mlname; remove mliname; restoreml; restoremli ]
+  in
+
+  (* Echo ocamldep's output. *)
+
+  print_string output;
+
+  (* If [--raw-depend] was specified on the command line, stop here.
+     This option is used by omake, which performs its own
+     postprocessing of [ocamldep]'s output. For normal [make] users,
+     who use [--depend], some postprocessing is required, which is
+     performed below. *)
+
+  begin match Settings.depend with
+  | Settings.OMNone ->
+      assert false (* we wouldn't be here in the first place *)
+  | Settings.OMRaw ->
+      ()
+  | Settings.OMPostprocess ->
+
+      (* Make sense out of ocamldep's output. *)
+
+      let lexbuf = Lexing.from_string output in
+      let lines : line list = Lexdep.main lexbuf in
+
+      (* Look for the line that concerns the [.cmo] target, and echo a
+        modified version of this line, where the [.cmo] target is
+        replaced with [.ml] and [.mli] targets, and where the dependency
+        over the [.cmi] file is dropped.
+
+        In doing so, we assume that the user's [Makefile] supports
+        bytecode compilation, so that it makes sense to request [bar.cmo]
+        to be built, as opposed to [bar.cmx]. This is not optimal, but
+        will do. [camldep] exhibits the same behavior. *)
+
+      (* TEMPORARY allow ocamldep to be called with flag -native. *)
+
+      List.iter (fun ((_, target_filename), dependencies) ->
+       if Filename.check_suffix target_filename ".cmo" then
+         let dependencies = List.filter (fun (basename, _) ->
+           basename <> base
+         ) dependencies in
+         if List.length dependencies > 0 then begin
+           Printf.printf "%s.ml %s.mli:" base base;
+           List.iter (fun (basename, filename) ->
+             Printf.printf " %s" filename
+           ) dependencies;
+           Printf.printf "\n%!"
+         end
+      ) lines
+
+  end;
+
+  (* Stop. *)
+
+  exit 0
+
+(* ------------------------------------------------------------------------- *)
+(* Inferring types for a grammar's nonterminals. *)
+
+let infer grammar =
+
+  (* Invoke ocamlc to do type inference for us. *)
+
+  let output =
+    IO.winvoke
+      [ write grammar ]
+      (Printf.sprintf "%s -c -i %s" Settings.ocamlc (Filename.quote mlname))
+      [ remove mlname ]
+  in
+
+  (* Make sense out of ocamlc's output. *)
+
+  let env : (string * int * int) list =
+    Lexmli.main (Lexing.from_string output)
+  in
+
+  let env : (string * ocamltype) list =
+    List.map (fun (id, openingofs, closingofs) ->
+      id, Inferred (String.sub output openingofs (closingofs - openingofs))
+    ) env
+  in
+
+  (* Augment the grammar with new %type declarations. *)
+
+  let types =
+    StringMap.fold (fun symbol _ types ->
+      let ocamltype =
+       try
+         List.assoc (Misc.normalize symbol) env
+       with Not_found ->
+         assert false
+      in
+      if StringMap.mem symbol grammar.types then
+       (* If there was a declared type, keep it. *)
+       types
+      else
+       (* Otherwise, insert the inferred type. *)
+       StringMap.add symbol ocamltype types
+    ) grammar.rules grammar.types
+  in
+
+  { grammar with types = types }
+
diff --git a/bundles/menhirLib/menhir-20120123/src/infer.mli b/bundles/menhirLib/menhir-20120123/src/infer.mli
new file mode 100644 (file)
index 0000000..432412c
--- /dev/null
@@ -0,0 +1,31 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* [ntvar symbol] is the name of the type variable associated with a
+   nonterminal symbol. *)
+
+val ntvar: string -> string
+
+(* [infer grammar] analyzes the grammar [grammar] and returns a new
+   grammar, augmented with a [%type] declaration for every nonterminal
+   symbol. The [ocamlc] compiler is used to infer types. *)
+
+val infer: UnparameterizedSyntax.grammar -> UnparameterizedSyntax.grammar
+
+(* [depend grammar] prints (on the standard output channel) the
+   Objective Caml dependencies induced by the semantic actions.
+   Then, it exits the program. *)
+
+val depend: UnparameterizedSyntax.grammar -> 'a
+
diff --git a/bundles/menhirLib/menhir-20120123/src/infiniteArray.ml b/bundles/menhirLib/menhir-20120123/src/infiniteArray.ml
new file mode 100644 (file)
index 0000000..5619845
--- /dev/null
@@ -0,0 +1,64 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the GNU Library General Public License, with the   *)
+(*  special exception on linking described in file LICENSE.               *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* $Id: infiniteArray.ml,v 1.6 2007/09/10 21:09:37 fpottier Exp $ *)
+
+(** This module implements infinite arrays, that is, arrays that grow
+    transparently upon demand. *)
+
+type 'a t = {
+    default: 'a;
+    mutable table: 'a array;
+    mutable extent: int; (* the index of the greatest [set] ever, plus one *)
+  } 
+
+let default_size =
+  16384 (* must be non-zero *)
+
+let make x = {
+  default = x;
+  table = Array.make default_size x;
+  extent = 0;
+} 
+
+let rec new_length length i =
+  if i < length then
+    length
+  else
+    new_length (2 * length) i
+
+let ensure a i =
+  let table = a.table in
+  let length = Array.length table in
+  if i >= length then begin
+    let table' = Array.make (new_length (2 * length) i) a.default in
+    Array.blit table 0 table' 0 length;
+    a.table <- table'
+  end
+
+let get a i =
+  ensure a i;
+  a.table.(i)
+
+let set a i x =
+  ensure a i;
+  a.table.(i) <- x;
+  a.extent <- max (i + 1) a.extent
+
+let extent a =
+  a.extent
+
+let domain a =
+  Array.sub a.table 0 a.extent
+
diff --git a/bundles/menhirLib/menhir-20120123/src/infiniteArray.mli b/bundles/menhirLib/menhir-20120123/src/infiniteArray.mli
new file mode 100644 (file)
index 0000000..f5d3b30
--- /dev/null
@@ -0,0 +1,39 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the GNU Library General Public License, with the   *)
+(*  special exception on linking described in file LICENSE.               *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* $Id: infiniteArray.mli,v 1.5 2007/09/10 21:09:37 fpottier Exp $ *)
+
+(** This module implements infinite arrays. **)
+type 'a t
+
+(** [make x] creates an infinite array, where every slot contains [x]. **)
+val make: 'a -> 'a t
+
+(** [get a i] returns the element contained at offset [i] in the array [a].
+   Slots are numbered 0 and up. **)
+val get: 'a t -> int -> 'a
+
+(** [set a i x] sets the element contained at offset [i] in the array
+    [a] to [x]. Slots are numbered 0 and up. **)
+val set: 'a t -> int -> 'a -> unit
+
+(** [extent a] is the length of an initial segment of the array [a]
+    that is sufficiently large to contain all [set] operations ever
+    performed. In other words, all elements beyond that segment have
+    the default value. *)
+val extent: 'a t -> int
+
+(** [domain a] is a fresh copy of an initial segment of the array [a]
+    whose length is [extent a]. *)
+val domain: 'a t -> 'a array
diff --git a/bundles/menhirLib/menhir-20120123/src/inliner.ml b/bundles/menhirLib/menhir-20120123/src/inliner.ml
new file mode 100644 (file)
index 0000000..9ba2d94
--- /dev/null
@@ -0,0 +1,290 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+open IL
+open CodeBits
+
+(* In the following, we only inline global functions. In order to
+   avoid unintended capture, as we traverse terms, we keep track of
+   local identifiers that hide global ones. The following little class
+   helps do that. (The pathological case where a local binding hides a
+   global one probably does not arise very often. Fortunately,
+   checking against it in this way is quite cheap, and lets me sleep
+   safely.) *)
+
+class locals table = object(self)
+
+  method pvar (locals : StringSet.t) (id : string) =
+    if Hashtbl.mem table id then StringSet.add id locals else locals
+
+end
+
+(* Here is the inliner. *)
+
+let inline ({ valdefs = defs } as p : program) =
+
+  (* Create a table of all global definitions. *)
+
+  let before, table = Traverse.tabulate_defs defs in
+
+  (* Prepare to count how many times each function is used, including
+     inside its own definition. The public functions serve as starting
+     points for this discovery phase. *)
+
+  let queue : valdef Queue.t =
+    Queue.create()
+  and usage : int StringMap.t ref =
+    ref StringMap.empty
+  in
+
+  (* [visit] is called at every identifier occurrence. *)
+
+  let visit locals id =
+    if StringSet.mem id locals then
+      (* This is a local identifier. Do nothing. *)
+      ()
+    else
+      try
+       let _, def = Hashtbl.find table id in
+
+       (* This is a globally defined identifier. Increment its usage
+          count. If it was never visited, enqueue its definition for
+           exploration. *)
+
+       let n =
+         try
+           StringMap.find id !usage
+         with Not_found ->
+           Queue.add def queue;
+           0
+       in
+       usage := StringMap.add id (n + 1) !usage
+
+      with Not_found ->
+       (* This identifier is not global. It is either local or a
+          reference to some external library, e.g. ocaml's standard
+          library. *)
+       ()
+  in
+
+  (* Look for occurrences of identifiers inside expressions. *)
+
+  let o =
+    object
+       inherit [ StringSet.t, unit ] Traverse.fold
+       inherit locals table
+       method evar locals () id =
+         visit locals id
+    end
+  in
+
+  (* Initialize the queue with all public definitions, and work from
+     there. We assume that the left-hand side of every definition is
+     a variable. *)
+
+  List.iter (fun { valpublic = public; valpat = p } ->
+    if public then
+      visit StringSet.empty (pat2var p)
+  ) defs;
+  Misc.qfold (o#valdef StringSet.empty) () queue;
+  let usage = !usage in
+
+  (* Now, inline every function that is called at most once. At the
+     same time, every function that is never called is dropped. The
+     public functions again serve as starting points for the
+     traversal. *)
+
+  let queue : valdef Queue.t =
+    Queue.create()
+  and emitted =
+    ref StringSet.empty
+  in
+
+  let enqueue def =
+    let id = pat2var def.valpat in
+    if not (StringSet.mem id !emitted) then begin
+      emitted := StringSet.add id !emitted;
+      Queue.add def queue
+    end
+  in
+
+  (* A simple application is an application of a variable to a number
+     of variables, constants, or record accesses out of variables. *)
+
+  let rec is_simple_arg = function
+    | EVar _
+    | EData (_, [])
+    | ERecordAccess (EVar _, _) ->
+       true
+    | EMagic e ->
+       is_simple_arg e
+    | _ ->
+       false
+  in
+
+  let is_simple_app = function
+    | EApp (EVar _, actuals) ->
+       List.for_all is_simple_arg actuals
+    | _ ->
+       false
+  in
+
+  (* Taking a fresh instance of a type scheme. Ugly. *)
+
+  let instance =
+    let count = ref 0 in
+    let fresh tv =
+      incr count;
+      tv, Printf.sprintf "freshtv%d" !count
+    in
+    fun scheme ->
+      let mapping = List.map fresh scheme.quantifiers in
+      let rec sub typ =
+       match typ with
+       | TypTextual _ ->
+           typ
+       | TypVar v ->
+           begin try
+             TypVar (List.assoc v mapping)
+           with Not_found ->
+             typ
+           end
+       | TypApp (f, typs) ->
+           TypApp (f, List.map sub typs)
+       | TypTuple typs ->
+           TypTuple (List.map sub typs)
+       | TypArrow (typ1, typ2) ->
+           TypArrow (sub typ1, sub typ2)
+      in
+      sub scheme.body
+  in
+
+  (* Destructuring a type annotation. *)
+
+  let rec annotate formals body typ =
+    match formals, typ with
+    | [], _ ->
+       [], EAnnot (body, type2scheme typ)
+    | formal :: formals, TypArrow (targ, tres) ->
+       let formals, body = annotate formals body tres in
+       PAnnot (formal, targ) :: formals, body
+    | _ :: _, _ ->
+       (* Type annotation has insufficient arity. *)
+       assert false
+  in
+
+  (* The heart of the inliner: rewriting a function call to a [let]
+     expression. 
+
+     If there was a type annotation at the function definition site,
+     it is dropped, provided [--infer] was enabled. Otherwise, it is
+     kept, because, due to the presence of [EMagic] expressions in the
+     code, dropping a type annotation could cause an ill-typed program
+     to become apparently well-typed. Keeping a type annotation
+     requires taking a fresh instance of the type scheme, because
+     OCaml doesn't have support for locally and existentially bound
+     type variables. Yuck. *)
+
+  let inline formals actuals body oscheme =
+    assert (List.length actuals = List.length formals);
+    match oscheme with
+    | Some scheme
+      when not Settings.infer ->
+
+       let formals, body = annotate formals body (instance scheme) in
+       mlet formals actuals body
+
+    | _ ->
+       mlet formals actuals body
+  in
+
+  (* Look for occurrences of identifiers inside expressions, branches,
+     etc. and replace them with their definitions if they have only
+     one use site or if their definitions are sufficiently simple. *)
+
+  let o =
+    object (self)
+      inherit [ StringSet.t ] Traverse.map as super
+      inherit locals table
+      method eapp locals e actuals =
+       match e with
+       | EVar id when
+           (Hashtbl.mem table id) &&       (* a global identifier *)
+           (not (StringSet.mem id locals)) (* not hidden by a local identifier *)
+         ->
+
+           let _, def = Hashtbl.find table id in (* cannot fail, thanks to the above check *)
+
+           let formals, body, oscheme =
+             match def with
+             | { valval = EFun (formals, body) } ->
+                 formals, body, None
+             | { valval = EAnnot (EFun (formals, body), scheme) } ->
+                 formals, body, Some scheme
+             | { valval = _ } ->
+                 (* The definition is not a function definition. This should not
+                    happen in the kind of code that we generate. *)
+                 assert false
+           in
+
+           assert (StringMap.mem id usage);
+           if StringMap.find id usage = 1 || is_simple_app body then
+
+             (* The definition can be inlined, with beta reduction. *)
+
+             inline formals (self#exprs locals actuals) (EComment (id, self#expr locals body)) oscheme
+
+           else begin
+
+             (* The definition cannot be inlined. *)
+
+             enqueue def;
+             super#eapp locals e actuals
+
+           end
+
+       | _ ->
+           (* The thing in function position is not a reference to a global. *)
+           super#eapp locals e actuals
+
+    end
+  in
+
+  (* Initialize the queue with all public definitions, and work from
+     there. *)
+
+  List.iter (function { valpublic = public } as def ->
+    if public then
+      enqueue def
+  ) defs;
+
+  let valdefs =
+    Misc.qfold (fun defs def ->
+      o#valdef StringSet.empty def :: defs
+    ) [] queue
+  in
+
+  Error.logC 1 (fun f ->
+    Printf.fprintf f "%d functions before inlining, %d functions after inlining.\n"
+       before (List.length valdefs));
+  
+  Time.tick "Inlining";
+
+  { p with valdefs = valdefs }
+
+(* The external entry point. *)
+
+let inline p =
+  if Settings.code_inlining then inline p else p
+
diff --git a/bundles/menhirLib/menhir-20120123/src/inliner.mli b/bundles/menhirLib/menhir-20120123/src/inliner.mli
new file mode 100644 (file)
index 0000000..7aa1305
--- /dev/null
@@ -0,0 +1,23 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* This transformer inlines every function that is called at most
+   once. It also inlines some functions whose body consists of a
+   single function call. At the same time, every function that is
+   never called is dropped. Public functions are never inlined or
+   dropped. *)
+
+val inline: IL.program -> IL.program
+
+
diff --git a/bundles/menhirLib/menhir-20120123/src/installation.mli b/bundles/menhirLib/menhir-20120123/src/installation.mli
new file mode 100644 (file)
index 0000000..0272d8b
--- /dev/null
@@ -0,0 +1,27 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* This module defines a number of installation settings.
+   Its source code is generated by the main [Makefile]. *)
+
+(* The directory where Menhir's standard library, [standard.mly],
+   is installed. *)
+
+val libdir: string
+
+(* Whether MenhirLib was installed via [ocamlfind] or (manually)
+   in the above directory. *)
+
+val ocamlfind: bool
+
diff --git a/bundles/menhirLib/menhir-20120123/src/interface.ml b/bundles/menhirLib/menhir-20120123/src/interface.ml
new file mode 100644 (file)
index 0000000..45c9b38
--- /dev/null
@@ -0,0 +1,77 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+open UnparameterizedSyntax
+open IL
+open CodeBits
+open TokenType
+
+(* This is the [Error] exception. *)
+
+let excname =
+  "Error"
+
+let excdef = {
+  excname = excname;
+  exceq = None;
+}
+
+let excredef = {
+  excdef with exceq = Some excname
+}
+
+(* The type of the entry point for the start symbol [symbol]. *)
+
+let entrytypescheme symbol =
+  let ocamltype =
+    try
+      StringMap.find symbol PreFront.grammar.types
+    with Not_found ->
+      (* Every start symbol should have a type. *)
+      assert false
+  in
+  type2scheme (marrow [ arrow tlexbuf ttoken; tlexbuf ] (TypTextual ocamltype))
+
+(* This is the interface of the generated parser. *)
+
+let interface = {
+
+  paramdecls =
+    PreFront.grammar.parameters;
+
+  excdecls =
+    [ excdef ];
+
+  typedecls =
+    tokentypedef;
+
+  valdecls =
+    StringSet.fold (fun symbol decls ->
+      (Misc.normalize symbol, entrytypescheme symbol) :: decls
+    ) PreFront.grammar.start_symbols []
+
+} 
+
+(* Writing the interface to a file. *)
+
+let write () =
+  let mli = open_out (Settings.base ^ ".mli") in
+  let module P = Printer.Make (struct
+    let f = mli
+    let locate_stretches = None
+    let raw_stretch_action = false
+  end) in
+  P.interface interface;
+  close_out mli
+
diff --git a/bundles/menhirLib/menhir-20120123/src/interface.mli b/bundles/menhirLib/menhir-20120123/src/interface.mli
new file mode 100644 (file)
index 0000000..bcbd888
--- /dev/null
@@ -0,0 +1,32 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* This module defines the interface of the generated parser. *)
+
+(* This is the [Error] exception. *)
+
+val excname: string
+val excdef: IL.excdef
+val excredef: IL.excdef
+
+(* The type of the entry point for the nonterminal start symbol
+   [symbol]. *)
+
+val entrytypescheme: string -> IL.typescheme
+
+(* This writes the interface of the generated parser to the [.mli]
+   file. *)
+
+val write: unit -> unit
+
diff --git a/bundles/menhirLib/menhir-20120123/src/internalSyntax.mli b/bundles/menhirLib/menhir-20120123/src/internalSyntax.mli
new file mode 100644 (file)
index 0000000..f4f3acd
--- /dev/null
@@ -0,0 +1,24 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+type grammar = 
+    {
+      p_preludes          : Stretch.t list;
+      p_postludes          : Syntax.trailer list;
+      p_parameters         : Stretch.t list;
+      p_start_symbols      : Positions.t StringMap.t;
+      p_types              : (Syntax.parameter * Stretch.ocamltype Positions.located) list;
+      p_tokens            : Syntax.token_properties StringMap.t;
+      p_rules             : Syntax.parameterized_rule StringMap.t;
+    }
diff --git a/bundles/menhirLib/menhir-20120123/src/interpret.ml b/bundles/menhirLib/menhir-20120123/src/interpret.ml
new file mode 100644 (file)
index 0000000..7e40865
--- /dev/null
@@ -0,0 +1,185 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* This module is in charge of handling the [--interpret] option,
+   if it is present. *)
+
+open Grammar
+
+(* --------------------------------------------------------------------------- *)
+
+(* A sentence is a pair of an optional non-terminal start symbol and a
+   list of terminal symbols. *)
+
+type sentence =
+    Nonterminal.t option * Terminal.t list
+
+(* --------------------------------------------------------------------------- *)
+
+(* [stream] turns a finite list of terminals into a stream of terminals. *)
+
+exception EndOfStream
+
+let stream (toks : Terminal.t list) : unit -> Terminal.t * Lexing.position * Lexing.position =
+  let toks = ref toks in
+  fun () ->
+
+    let tok =
+      match !toks with
+      | tok :: more ->
+
+         (* Take a token off the list, and return it. *)
+
+         toks := more;
+         tok
+
+      | [] ->
+
+         (* The finite list has been exhausted. Here, two plausible behaviors
+            come to mind.
+
+            The first behavior consists in raising an exception. In that case,
+            we are creating a finite stream, and it is up to the parser to not
+            read past its end.
+
+            The second behavior consists in returning a designated token. In
+            that case, we are creating an infinite, eventually constant,
+            stream.
+
+            The choice between these two behaviors is somewhat arbitrary;
+            furthermore, in the second case, the choice of the designated
+            token is arbitrary as well. Here, we adopt the second behavior if
+            and only if the grammar has an EOF token, and we use EOF as the
+            designated token. Again, this is arbitrary, and could be changed
+            in the future. *)
+
+         match Terminal.eof with
+         | Some eof ->
+             eof
+         | None ->
+             raise EndOfStream
+
+    in
+
+    (* For now, return dummy positions. *)
+
+    tok, Lexing.dummy_pos, Lexing.dummy_pos
+
+(* --------------------------------------------------------------------------- *)
+
+(* [interpret] interprets a sentence. *)
+
+let interpret ((nto, toks) : sentence) : unit =
+
+  (* Check whether a start symbol was provided. If not, use the grammar's
+     unique start symbol, if there is one. *)
+
+  (* The code that finds the unique start symbol is not very pretty. *)
+
+  let nt =
+    match nto, ProductionMap.is_singleton Lr1.entry with
+    | Some nt, _ ->
+       nt
+    | None, Some (prod, _) ->
+       begin match Production.classify prod with
+       | Some nt ->
+           nt
+       | None ->
+           assert false
+       end
+    | None, None ->
+       Error.error []
+         "Because the grammar has multiple start symbols, each of the\n\
+           sentences provided on the standard input channel must be of the\n\
+           form: <start symbol>: <token>*"
+  in
+
+  (* Run the reference interpreter. This can produce a concrete syntax tree
+     ([Some cst]), fail with a parser error ([None]), or fail with a lexer error
+     ([EndOfStream]). *)
+
+  (* In either case, we produce just one line of output, so it should be clear
+     to the user which outcomes correspond to which sentences (should multiple
+     sentences be supplied). *)
+
+  begin try
+    match
+      MenhirLib.Convert.Simplified.traditional2revised
+       (ReferenceInterpreter.interpret Settings.trace nt)
+       (stream toks)
+    with
+
+    | Some cst ->
+
+       (* Success. *)
+
+       Printf.printf "ACCEPT";
+       if Settings.interpret_show_cst then begin
+         print_newline();
+         Cst.show stdout cst
+       end
+
+    | None ->
+
+       (* Parser failure. *)
+
+       Printf.printf "REJECT"
+
+  with EndOfStream ->
+
+    (* Lexer failure. *)
+    
+    Printf.printf "OVERSHOOT"
+
+  end;
+  print_newline()
+
+(* --------------------------------------------------------------------------- *)
+
+(* If [--interpret] is set, interpret the sentences found on the standard
+   input channel, then stop, without generating a parser. *)
+
+open Lexing
+
+let () =
+  if Settings.interpret then begin
+
+    (* Read a series of sentences from the standard input channel. *)
+
+    (* For more comfortable interaction, we interpret each sentence
+       as soon as it is read. *)
+
+    let lexbuf =
+      from_channel stdin
+    in
+    lexbuf.lex_curr_p <- { lexbuf.lex_curr_p with pos_fname = "(stdin)" };
+
+    let read () =
+      try
+       SentenceParser.sentence SentenceLexer.lex lexbuf
+      with Parsing.Parse_error ->
+       Error.error (Positions.lexbuf lexbuf) "Ill-formed input sentence."
+    in
+
+    let rec loop () =
+      match read() with
+      | None ->
+         exit 0
+      | Some sentence ->
+         interpret sentence;
+         loop()
+    in
+    loop()
+
+  end
diff --git a/bundles/menhirLib/menhir-20120123/src/interpret.mli b/bundles/menhirLib/menhir-20120123/src/interpret.mli
new file mode 100644 (file)
index 0000000..a16647a
--- /dev/null
@@ -0,0 +1,17 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* This module is in charge of handling the [--interpret] option,
+   if it is present. It offers no functionality. *)
+
diff --git a/bundles/menhirLib/menhir-20120123/src/invariant.ml b/bundles/menhirLib/menhir-20120123/src/invariant.ml
new file mode 100644 (file)
index 0000000..105b24a
--- /dev/null
@@ -0,0 +1,903 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* This module discovers information about the shape of the stack
+   in each of the automaton's states.
+
+   It would probably be possible to predict this information, instead
+   of discovering it, but it would then be less obvious that it is
+   correct. In this approach, it is more obvious that the discovered
+   invariant is correct. The drawback is that it is not necessarily
+   clear why it is strong enough to guarantee that the generated code
+   is well-typed. *)
+
+open Grammar
+
+(* ------------------------------------------------------------------------ *)
+(* Discover what is known of the structure of the stack in every
+   automaton node. *)
+
+(* A concrete stack is a list of pairs of a symbol and a state. *)
+
+(* An abstract stack is (a finite representation of) a possibly
+   infinite set of concrete stacks. *)
+
+(* The type [tail] has two values. [TailEmpty] represents a singleton
+   set that contains (only) the empty stack. [TailUnknown] represents
+   the full set of all stacks. *)
+
+type tail =
+  | TailEmpty
+  | TailUnknown
+
+(* An abstract cell is a pair of a symbol and a set of states. An
+   abstract word is a list of abstract cells. An abstract stack
+   is a pair of an abstract word, which represents a known suffix
+   of the stack, and a tail, which provides information about the
+   remainder of the stack. *)
+
+type cell =
+    Symbol.t * Lr1.NodeSet.t
+
+type word =
+    cell list
+
+type stack =
+    word * tail
+
+(* ------------------------------------------------------------------------ *)
+(* Equality of abstract stacks. *)
+
+let eq_tail tail1 tail2 =
+  match tail1, tail2 with
+  | TailEmpty, TailEmpty
+  | TailUnknown, TailUnknown ->
+      true
+  | _, _ ->
+      false
+
+let eq_cell (symbol1, states1) (symbol2, states2) =
+  Symbol.equal symbol1 symbol2 &&
+  Lr1.NodeSet.equal states1 states2
+
+let rec eq_word w1 w2 =
+  match w1, w2 with
+  | [], [] ->
+      true
+  | cell1 :: w1, cell2 :: w2 ->
+      eq_cell cell1 cell2 &&
+      eq_word w1 w2
+  | _, _ ->
+      false
+
+let eq_stack (w1, tail1) (w2, tail2) =
+  eq_tail tail1 tail2 &&
+  eq_word w1 w2
+
+(* ------------------------------------------------------------------------ *)
+(* Extending an abstract stack with a new cell. *)
+
+let extend_stack cell stack =
+  let (w, tail) = stack in
+  cell :: w, tail
+
+(* ------------------------------------------------------------------------ *)
+(* Computing the join of two abstract stacks. *)
+
+(* The join of [stack1] and [stack2] is their least upper bound, that
+   is, the best abstract description of the union of the two sets of
+   concrete stacks denoted by [stack1] and [stack2]. *)
+
+let rec join_tail (tail1 : tail) (tail2 : tail) : tail =
+  match tail1, tail2 with
+  | TailEmpty, TailEmpty ->
+      TailEmpty
+  | TailUnknown, _
+  | _, TailUnknown ->
+      TailUnknown
+
+let rec join_word (w1 : word) (w2 : word) : word * tail =
+  match w1, w2 with
+  | [], [] ->
+      (* Both stacks are empty. There is agreement. *)
+      [], TailEmpty
+  | [], _ :: _
+  | _ :: _, [] ->
+      (* One stack is empty, but the other isn't. The greatest
+        common suffix is empty, and there is disagreement. *)
+      [], TailUnknown
+  | (symbol1, states1) :: w1, (symbol2, states2) :: w2 ->
+      if Symbol.equal symbol1 symbol2 then
+       (* The stacks agree on their top cell. It is therefore part
+          of the greatest common suffix. *)
+        let w, tail = join_word w1 w2 in
+       (symbol1, Lr1.NodeSet.union states1 states2) :: w, tail
+      else
+        (* The stacks disagree on their top cell. Their greatest common
+          suffix is therefore empty. *)
+       [], TailUnknown
+
+let rec join_stack (stk1 : stack) (stk2 : stack) : stack =
+  let w1, tail1 = stk1
+  and w2, tail2 = stk2 in
+  let w, tail = join_word w1 w2 in
+  w, join_tail tail (join_tail tail1 tail2)
+
+(* ------------------------------------------------------------------------ *)
+(* Truncating an abstract stack at a certain depth. *)
+
+let truncate depth (w, tail) =
+  assert (List.length w >= depth);
+  Misc.truncate depth w, TailUnknown
+
+(* ------------------------------------------------------------------------ *)
+(* This abstract set denotes a singleton set of the empty stack. *)
+
+let empty : stack =
+  [], TailEmpty
+
+(* 2011/04/28: although this seems difficult to believe, the code that was
+   used until now to compute the invariant was completely broken. A single
+   pass over the automaton was used, so the abstract stacks that were computed
+   did not represent a least fixed point, but (for most of our sample
+   grammars) were strictly below the least fixed point. (That is, they produce
+   descriptions of the stack that were unsound / too strong.)  For some
+   reason, Menhir was apparently still able to produce correct code. (Some
+   type annotations in the code were probably incorrect, but apparently this
+   did not matter because the code is full of magic anyway.)
+
+   I am now fixing this problem (I hope!) by explicitly requesting the
+   computation of a least fixed point. *)
+
+(* ------------------------------------------------------------------------ *)
+(* The abstract stacks that we have presented above represent non-empty sets
+   of concrete stacks. In order to perform the fixed point computation, we
+   also need a bottom element, which represents an empty set of concrete
+   stacks. This element is used during the fixed point computation, but does
+   not appear in the least fixed point, provided every state of the automaton
+   is reachable. (A state is reachable if only if the least fixed point
+   associates it with a non-empty set of stacks.) *)
+
+type value =
+  | VEmptySet
+  | VNonEmptySet of stack
+
+let eq_value v1 v2 =
+  match v1, v2 with
+  | VEmptySet, VEmptySet ->
+      true
+  | VNonEmptySet stack1, VNonEmptySet stack2 ->
+      eq_stack stack1 stack2
+  | _, _ ->
+      false
+
+let join_value v1 v2 =
+  match v1, v2 with
+  | VEmptySet, v
+  | v, VEmptySet ->
+      v
+  | VNonEmptySet stack1, VNonEmptySet stack2 ->
+      VNonEmptySet (join_stack stack1 stack2)
+
+let extend_value cell v =
+  match v with
+  | VEmptySet ->
+      VEmptySet
+  | VNonEmptySet stack ->
+      VNonEmptySet (extend_stack cell stack)
+
+(* ------------------------------------------------------------------------ *)
+(* Instantiate the least fixed point computation machinery with states and
+   values. *)
+
+module F =
+  Fix.Make
+    (struct
+
+      type key =
+         Lr1.NodeMap.key
+
+      type 'data t =
+         'data Lr1.NodeMap.t ref
+
+      let create () =
+       ref Lr1.NodeMap.empty
+
+      let clear t =
+       t := Lr1.NodeMap.empty
+
+      let add k d t =
+       t := Lr1.NodeMap.add k d !t
+
+      let find k t =
+       Lr1.NodeMap.find k !t
+
+      let iter f t =
+       Lr1.NodeMap.iter f !t
+
+    end)
+    (struct
+      type property = value
+      let bottom = VEmptySet
+      let equal = eq_value
+      let is_maximal _ = false
+    end)
+
+(* ------------------------------------------------------------------------ *)
+(* Define the fixed point. *)
+
+let lfp : Lr1.node -> value =
+
+  F.lfp (fun node (get : Lr1.node -> value) ->
+
+    (* We use the fact that a state has incoming transitions if and only if
+       it is not a start state. This allows to us to simplify the following
+       code slightly. *)
+
+    match Lr1.incoming_symbol node with
+
+    | None ->
+       assert (Lr1.predecessors node = []);
+
+       (* If [node] is a start state, then the stack at [node] may be (in
+          fact, must be) the empty stack. *)
+
+       VNonEmptySet empty
+
+    | Some symbol ->
+
+       (* If [node] is not a start state, then include the contribution of
+          every incoming transition. We compute a join over all predecessors.
+          The contribution of one predecessor is the abstract value found at
+          this predecessor, extended with a new cell for this transition. *)
+
+       List.fold_left (fun v predecessor ->
+         join_value
+           v
+           (extend_value (symbol, Lr1.NodeSet.singleton predecessor) (get predecessor))
+       ) VEmptySet (Lr1.predecessors node)
+
+  )
+
+(* If every state is reachable, then the least fixed point must be non-bottom
+   everywhere, so we may view it as a function that produces a [stack], a
+   description of a non-empty set of stacks. *)
+
+let lfp (node : Lr1.node) : stack =
+  match lfp node with
+  | VEmptySet ->
+      (* apparently this node is unreachable *)
+      assert false
+  | VNonEmptySet stack ->
+      stack
+
+let stack =
+  lfp
+
+(* ------------------------------------------------------------------------ *)
+(* We now discover what can be said of the structure of the stack when
+   production [prod] is about to be reduced. At the same time, we
+   count how many states can reduce each production and warn about
+   productions that are never reduced. *)
+
+type info =
+  (* Production is never reduced. *)
+  | Zero
+  (* Production can be reduced at certain nodes with a certain stack structure. *)
+  | More of Lr1.NodeSet.t * stack
+
+type prodinfo =
+    info ProductionMap.t
+
+let find prod prodinfo =
+  try
+    ProductionMap.lookup prod prodinfo
+  with Not_found ->
+    Zero
+
+let prodinfo : prodinfo =
+  Lr1.fold (fun prodinfo node ->
+    TerminalMap.fold (fun _ prods prodinfo ->
+      let prod = Misc.single prods in
+      ProductionMap.add prod (
+       match find prod prodinfo with
+       | Zero ->
+           More (
+             Lr1.NodeSet.singleton node,
+             truncate (Production.length prod) (stack node)
+             (* the use of [truncate] guarantees that we do not accidentally
+                get more information than we would like; not sure whether/why
+                this is necessary *)
+            )
+       | More (nodes, stk') ->
+           More (
+             Lr1.NodeSet.add node nodes,
+             join_stack (stack node) stk'
+            )
+      ) prodinfo
+    ) (Lr1.reductions node) prodinfo
+  ) ProductionMap.empty
+
+let () =
+  let count = ref 0 in
+  Production.iter (fun prod ->
+    match find prod prodinfo, Production.classify prod with
+    | Zero, Some nt ->
+       incr count;
+       Error.grammar_warning
+         (Nonterminal.positions nt)
+         (Printf.sprintf "symbol %s is never accepted." (Nonterminal.print false nt))
+    | Zero, None ->
+       incr count;
+       Error.grammar_warning
+         (Production.positions prod)
+         (Printf.sprintf "production %sis never reduced." (Production.print prod))
+    | More (_, (w, _)), _ ->
+       assert (List.length w = Production.length prod)
+  );
+  if !count > 0 then
+    Error.grammar_warning []
+      (Printf.sprintf "in total, %d productions are never reduced." !count)
+
+let prodstack prod =
+  match find prod prodinfo with
+  | Zero ->
+      assert false
+  | More (_, stk) ->
+      stk
+
+(* ------------------------------------------------------------------------ *)
+(* We now determine which states must be represented, that is,
+   explicitly pushed onto the stack. For simplicity, a state is either
+   always represented or never represented. More fine-grained
+   strategies, where a single state is sometimes pushed onto the stack
+   and sometimes not pushed, depending on which outgoing transition is
+   being taken, are conceivable, but quite tricky, and probably not
+   worth the trouble.
+
+   (1) If two states are liable to appear within a single stack cell,
+   then one is represented if and only if the other is
+   represented. This ensures that the structure of stacks is known
+   everywhere and that we can propose types for stacks.
+
+   (2) If a state [s] has an outgoing transition along nonterminal
+   symbol [nt], and if the [goto] table for symbol [nt] has more than
+   one target, then state [s] is represented.
+
+   (3) If a stack cell contains more than one state and if at least
+   one of these states is able to handle the [error] token, then these
+   states are represented.
+
+   (4) If the semantic action associated with a production mentions
+   the [$syntaxerror] keyword, then the state that is being reduced to
+   (that is, the state that initiated the recognition of this
+   production) is represented. (Indeed, it will be passed as an
+   argument to [errorcase].) *)
+
+(* Data. *)
+
+let rep : bool UnionFind.point array =
+  Array.init Lr1.n (fun _ -> UnionFind.fresh false)
+
+(* Getter. *)
+
+let represented state =
+  rep.(Lr1.number state)
+
+(* Setters. *)
+
+let represent state =
+  UnionFind.change (represented state) true
+
+let represents states =
+  represent (Lr1.NodeSet.choose states)
+
+(* Enforce condition (1) above. *)
+
+let share (w, _) =
+  List.iter (fun (_, states) ->
+    let dummy = UnionFind.fresh false in
+    Lr1.NodeSet.iter (fun state ->
+      UnionFind.eunion dummy (represented state)
+    ) states
+  ) w
+
+let () =
+  Lr1.iter (fun node ->
+    share (lfp node)
+  );
+  Production.iter (fun prod ->
+    match find prod prodinfo with
+    | Zero ->
+       ()
+    | More (_, stk) ->
+       share stk
+  )
+
+(* Enforce condition (2) above. *)
+
+let () =
+  Nonterminal.iter (fun nt ->
+    let count = 
+      Lr1.targets (fun count _ _ ->
+       count + 1
+      ) 0 (Symbol.N nt)
+    in
+    if count > 1 then
+      Lr1.targets (fun () sources _ ->
+       List.iter represent sources
+      ) () (Symbol.N nt)
+  )
+
+(* Enforce condition (3) above. *)
+
+let handler state =
+  try
+    let _ = SymbolMap.find (Symbol.T Terminal.error) (Lr1.transitions state) in
+    true
+  with Not_found ->
+    try
+      let _ = TerminalMap.lookup Terminal.error (Lr1.reductions state) in
+      true
+    with Not_found ->
+      false
+
+let handlers states =
+  Lr1.NodeSet.exists handler states
+
+let () =
+  Lr1.iter (fun node ->
+    let (w, _) = lfp node in
+    List.iter (fun (_, states) ->
+      if Lr1.NodeSet.cardinal states >= 2 && handlers states then
+       represents states
+    ) w
+  )
+
+(* Enforce condition (4) above. *)
+
+let () =
+  Production.iterx (fun prod ->
+    if Action.has_syntaxerror (Production.action prod) then
+      match find prod prodinfo with
+      | Zero ->
+         ()
+      | More (sites, (w, _)) ->
+         let length = Production.length prod in
+         if length = 0 then
+           Lr1.NodeSet.iter represent sites
+         else
+           let (_, states) = List.nth w (length - 1) in
+           represents states
+  )
+
+(* Define accessors. *)
+
+let represented state =
+  UnionFind.find (represented state)
+
+let representeds states =
+  if Lr1.NodeSet.is_empty states then
+    assert false
+  else
+    represented (Lr1.NodeSet.choose states)
+
+let representedc (_, states) =
+  representeds states
+
+let handlerc (_, states) =
+  handlers states
+
+let fold f accu w =
+  List.fold_right (fun (symbol, states) accu ->
+    f accu (representeds states) symbol states
+  ) w accu
+
+let fold_top f accu w =
+  match w with
+  | [] ->
+      accu
+  | (symbol, states) :: _ ->
+      f (representeds states) symbol
+
+let () =
+  Error.logC 1 (fun f ->
+    let count =
+      Lr1.fold (fun count node ->
+        if represented node then count + 1 else count
+      ) 0
+    in
+    Printf.fprintf f "%d out of %d states are represented.\n" count Lr1.n
+  )
+
+(* ------------------------------------------------------------------------ *)
+(* Explain how the stack should be deconstructed when an error is
+   found.
+
+   We sometimes have a choice as too how many stack cells should be
+   popped. Indeed, several cells in the known suffix of the stack may
+   physically hold a state. If neither of these states handles errors,
+   then we could jump to either. (Indeed, if we jump to one that's
+   nearer, it will in turn pop further stack cells and jump to one
+   that's farther.) In the interests of code size, we should pop as
+   few stack cells as possible. So, we jump to the topmost represented
+   state in the known suffix. *)
+
+type state =
+  | Represented
+  | UnRepresented of Lr1.node
+
+type instruction =
+  | Die
+  | DownTo of word * state
+
+let rewind node : instruction =
+  let w, tail = stack node in
+
+  let rec rewind w =
+    match w, tail with
+    | [], TailEmpty ->
+       Die
+    | [], TailUnknown ->
+
+       (* I believe that every stack description either is definite
+          (that is, ends with [TailEmpty]) or contains at least one
+          represented state. This property, if true, ensures that
+          this assertion cannot fail. *)
+
+        (* TEMPORARY prove this property. If the property is not true in
+           general, one could make it true by making more states
+           represented. *)
+
+       assert false
+
+    | cell :: w, _ ->
+
+       if representedc cell then
+
+         (* Here is a represented state. We will pop this
+            cell and no more. *)
+
+         DownTo ([ cell ], Represented)
+
+       else if handlerc cell then
+
+         (* Here is an unrepresented state that can handle
+            errors. The cell must hold a singleton set of states, so
+            we know which state to jump to, even though it isn't
+            represented. *)
+
+         let (_, states) = cell in
+         assert (Lr1.NodeSet.cardinal states = 1);
+         let state = Lr1.NodeSet.choose states in
+         DownTo ([ cell ], UnRepresented state)
+
+       else
+
+         (* Here is an unrepresented state that does not handle
+            errors. Pop this cell and look further. *)
+
+         match rewind w with
+         | Die ->
+             Die
+         | DownTo (w, st) ->
+             DownTo (cell :: w, st)
+
+  in
+  rewind w
+
+(* ------------------------------------------------------------------------ *)
+(* Accessors for information about the stack. *)
+
+let stack node : word =
+  let (w, _) = stack node in
+  w
+
+let prodstack prod : word =
+  let (w, _) = prodstack prod in
+  w
+
+let gotostack : Nonterminal.t -> word =
+  Nonterminal.tabulate (fun nt ->
+    let sources =
+      Lr1.targets (fun accu sources _ ->
+       List.fold_right Lr1.NodeSet.add sources accu
+      ) Lr1.NodeSet.empty (Symbol.N nt)
+    in
+    [ Symbol.N nt, sources ]
+  )
+
+(* ------------------------------------------------------------------------ *)
+(* We now determine which positions must be kept track of. For
+   simplicity, we do this on a per symbol basis. That is, for each
+   symbol, either we never keep track of position information, or we
+   always do. In fact, we do distinguish start and end positions.
+   This leads to computing two sets of symbols -- those that keep
+   track of their start position and those that keep track of their
+   end position.
+
+   A symbol on the right-hand side of a production must keep track of
+   its (start or end) position if that position is explicitly
+   requested by a semantic action.
+
+   Furthermore, if the left-hand symbol of a production must keep
+   track of its start (resp. end) position, then the first
+   (resp. last) symbol of its right-hand side (if there is one) must
+   do so as well. That is, unless the right-hand side is empty. *)
+
+open Keyword
+
+let startp =
+  ref SymbolSet.empty
+
+let endp =
+  ref SymbolSet.empty
+
+let rec require where symbol =
+  let wherep =
+    match where with
+    | WhereStart ->
+       startp
+    | WhereEnd ->
+       endp
+  in
+  if not (SymbolSet.mem symbol !wherep) then begin
+    wherep := SymbolSet.add symbol !wherep;
+    match symbol with
+    | Symbol.T _ ->
+       ()
+    | Symbol.N nt ->
+       Production.iternt nt (require_aux where)
+  end
+
+and require_aux where prod =
+  let nt, rhs = Production.def prod in
+  let length = Array.length rhs in
+  if length > 0 then
+    match where with
+    | WhereStart ->
+       require where rhs.(0)
+    | WhereEnd ->
+       require where rhs.(length - 1)
+
+let () =
+  Production.iterx (fun prod ->
+    let rhs = Production.rhs prod
+    and ids = Production.identifiers prod
+    and action = Production.action prod in
+
+    KeywordSet.iter (function
+      | Dollar _
+      | PreviousError
+      | SyntaxError ->
+         ()
+      | Position (Left, where, _) ->
+         require_aux where prod
+      | Position (RightDollar i, where, _) ->
+         require where rhs.(i - 1)
+      | Position (RightNamed id, where, _) ->
+         Array.iteri (fun i id' ->
+           if id = id' then
+             require where rhs.(i)
+         ) ids
+    ) (Action.keywords action)
+  )
+
+let startp =
+  !startp
+
+let endp =
+  !endp
+
+let () =
+  Error.logC 1 (fun f ->
+    Printf.fprintf f
+      "%d out of %d symbols keep track of their start position.\n\
+       %d out of %d symbols keep track of their end position.\n"
+        (SymbolSet.cardinal startp) (Terminal.n + Nonterminal.n)
+        (SymbolSet.cardinal endp) (Terminal.n + Nonterminal.n))
+
+let startp symbol =
+  SymbolSet.mem symbol startp
+
+let endp symbol =
+  SymbolSet.mem symbol endp
+
+(* ------------------------------------------------------------------------ *)
+(* Information about which productions are reduced and where. *)
+
+let ever_reduced prod =
+   match find prod prodinfo with
+   | Zero ->
+       false
+   | More _ ->
+       true
+
+let fold_reduced f prod accu =
+  match find prod prodinfo with
+  | Zero ->
+      accu
+  | More (nodes, _) ->
+      Lr1.NodeSet.fold f nodes accu
+
+(* ------------------------------------------------------------------------- *)
+(* Miscellaneous. *)
+
+let universal symbol =
+  Lr1.fold (fun universal s ->
+    universal && (if represented s then SymbolMap.mem symbol (Lr1.transitions s) else true)
+  ) true
+
+(* ------------------------------------------------------------------------ *)
+(* Discover which states potentially can do error recovery.
+
+   They are the states whose incoming symbol is [error]. At these
+   states, [env.shifted] is zero, that is, no tokens have been
+   successfully shifted since the last error token was shifted.
+
+   We do not include in this definition the states where [env.shifted]
+   *may be* zero. That would involve adding in all states reachable
+   from the above states via reductions. However, error recovery will
+   never be performed in these states. Indeed, imagine we shift an
+   error token and enter a state that can do error recovery, according
+   to the above definition. If, at this point, we consult the
+   lookahead token [tok] and perform a reduction, then the new state
+   that we reach is, by construction, able to act upon [tok], so no
+   error recovery will be performed at that state, even though
+   [env.shifted] is still zero. However, we must not perform default
+   reductions at states that can do error recovery, otherwise we break
+   this reasoning.
+
+   If the option [--error-recovery] was not provided on the command
+   line, then no states will perform error recovery. This makes things
+   simpler (and saves some code) in the common case where people are
+   not interested in error recovery. This also disables the warning
+   about states that can do error recovery but do not accept the EOF
+   token. *)
+
+let recoverers =
+  if Settings.recovery then
+    Lr1.fold (fun recoverers node ->
+      match Lr1.incoming_symbol node with
+      | Some (Symbol.T tok)
+       when Terminal.equal tok Terminal.error ->
+         Lr1.NodeSet.add node recoverers
+      | _ ->
+         recoverers
+    ) Lr1.NodeSet.empty
+  else
+    Lr1.NodeSet.empty
+
+let recoverer node =
+  Lr1.NodeSet.mem node recoverers
+
+(* ------------------------------------------------------------------------ *)
+(* Discover which states can peek at an error. These are the states
+   where [env.shifted] may be -1, that is, where an error token may be
+   on the stream. These are all states that are targets of a reduce
+   action on [error]. *)
+
+let errorpeekers =
+  Lr1.fold (fun errorpeekers node ->
+    try
+      let prods = TerminalMap.lookup Terminal.error (Lr1.reductions node) in
+      let prod = Misc.single prods in
+      let nt = Production.nt prod in
+      Lr1.targets (fun errorpeekers _ target ->
+       Lr1.NodeSet.add target errorpeekers
+      ) errorpeekers (Symbol.N nt)
+    with Not_found ->
+      errorpeekers
+  ) Lr1.NodeSet.empty
+
+let errorpeeker node =
+  Lr1.NodeSet.mem node errorpeekers
+
+(* ------------------------------------------------------------------------ *)
+(* Here is how we check whether state [s] should have a default
+   reduction.
+
+   We check whether [s] has no outgoing shift transitions and only has
+   one possible reduction action. In that case, we produce a default
+   reduction action, that is, we perform reduction without consulting
+   the lookahead token. This saves code, but can alter the parser's
+   behavior in the presence of errors.
+
+   A state that can perform error recovery (that is, a state whose
+   incoming symbol is [error]) never performs a default
+   reduction. This is explained above. Actually, we allow one
+   exception: if the state has a single (reduction) action on "#", as
+   explained in the next paragraph, then we perform this default
+   reduction and do not allow error recovery to take place. Error
+   recovery would not make much sense, since we believe we are at the
+   end of file.
+
+   The check for default actions subsumes the check for the case where
+   [s] admits a reduce action with lookahead symbol "#". In that case,
+   it must be the only possible action -- see
+   [Lr1.default_conflict_resolution]. That is, we have reached a point
+   where we have recognized a well-formed input and are now expecting
+   an end-of-stream. In that case, performing reduction without
+   looking at the next token is the right thing to do, since there
+   should in fact be none. The state that we reduce to will also have
+   the same property, and so on, so we will in fact end up rewinding
+   the entire stack and accepting the input when the stack becomes
+   empty.
+
+   (New as of 2012/01/23.) A state where a shift/reduce conflict was
+   solved in favor of neither (due to a use of the %nonassoc
+   directive) must not perform a default reduction. Indeed, this would
+   effectively mean that the failure that was requested by the user is
+   forgotten and replaced with a reduction. This surprising behavior
+   is present in ocamlyacc and was present in earlier versions of
+   Menhir. See e.g. http://caml.inria.fr/mantis/view.php?id=5462
+
+   There is a chance that we might run into trouble if the ideas
+   described in the above two paragraphs collide, that is, if we
+   forbid a default reduction (due to a shift/reduce conflict solved
+   by %nonassoc) in a node where we would like to have default
+   reduction on "#". This situation seems unlikely to arise, so I will
+   not do anything about it for the moment. (Furthermore, someone who
+   uses precedence declarations is looking for trouble anyway.)
+
+*)
+
+let (has_default_reduction : Lr1.node -> (Production.index * TerminalSet.t) option), hdrcount =
+  Misc.tabulateo Lr1.number Lr1.fold Lr1.n (fun s ->
+
+    if Lr1.forbid_default_reduction s then
+      None
+    else
+
+      match ProductionMap.is_singleton (Lr1.invert (Lr1.reductions s)) with
+      | Some (_, toks)  as reduction
+         when SymbolMap.purelynonterminal (Lr1.transitions s) ->
+
+       if TerminalSet.mem Terminal.sharp toks then
+           (* Perform default reduction on "#". *)
+           reduction
+         else if recoverer s then
+           (* Do not perform default reduction. Allow error recovery. *)
+           None
+         else
+           (* Perform default reduction. *)
+           reduction
+
+      | Some _
+      | None ->
+         None
+
+  )
+
+let () =
+  Error.logC 1 (fun f ->
+    Printf.fprintf f
+       "%d out of %d states have a default reduction.\n"
+       hdrcount Lr1.n)
+
+(* ------------------------------------------------------------------------ *)
+
+let () =
+  Time.tick "Constructing the invariant"
+
+(* ------------------------------------------------------------------------ *)
+
+(* If any fatal error was signaled up to this point, stop now. This may include
+   errors signaled in the modules [lr1] and [invariant] by calling the function
+   [Error.grammar_warning]. *)
+
+let () =
+  if Error.errors() then
+    exit 1
+
diff --git a/bundles/menhirLib/menhir-20120123/src/invariant.mli b/bundles/menhirLib/menhir-20120123/src/invariant.mli
new file mode 100644 (file)
index 0000000..34a983c
--- /dev/null
@@ -0,0 +1,144 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* This module discovers and publishes information about the
+   automaton.
+
+   It determines the shape of the stack when a state is about to be
+   entered, when a production is about to be reduced, and when a goto
+   transition is about to be taken.
+
+   It also determines which states should be represented (that is,
+   need to physically exist on the stack at runtime) and which symbols
+   need to keep track of (start or end) positions.
+
+   It also determines which automaton states could potentially perform
+   error recovery, and which states could have to deal with an [error]
+   token. *)
+
+open Grammar
+
+(* ------------------------------------------------------------------------- *)
+(* A representation of stack shapes. *)
+
+(* A word is a representation of a stack or stack suffix. *)
+
+type word
+
+(* [fold] folds over a word. At each cell, [f] is applied to the
+   accumulator, to a Boolean flag that tells whether the cell holds a
+   state, to the set of possible states of the cell, and to the symbol 
+   associated with the cell. The stack is visited from bottom to top. *)
+
+val fold: ('a -> bool -> Symbol.t -> Lr1.NodeSet.t -> 'a) -> 'a -> word -> 'a
+
+(* [fold_top f accu s] is analogous to [fold], but only folds over the
+   top stack cell, if there is one, so that [f] is either not invoked
+   at all or invoked just once. *)
+
+val fold_top: (bool -> Symbol.t -> 'a) -> 'a -> word -> 'a
+
+(* ------------------------------------------------------------------------- *)
+(* Information about the stack. *)
+
+(* [stack s] is the structure of the stack at state [s]. *)
+
+val stack: Lr1.node -> word
+
+(* [prodstack prod] is the structure of the stack when production
+   [prod] is about to be reduced. This function should not be called
+   if production [prod] is never reduced. *)
+
+val prodstack: Production.index -> word
+
+(* [gotostack nt] is the structure of the stack when a shift
+   transition over nonterminal [nt] is about to be taken. It
+   consists of just one cell. *)
+
+val gotostack: Nonterminal.t -> word
+
+(* [rewind s] explains how to rewind the stack when dealing with an
+   error in state [s]. It produces an instruction to either die
+   (because no state on the stack can handle errors) or pop a suffix
+   of the stack. In the latter case, one reaches a state that is
+   either represented (its identity is physically stored in the
+   bottommost cell that is popped) or unrepresented (its identity is
+   statically known). *)
+
+type instruction =
+  | Die
+  | DownTo of word * state
+
+and state =
+  | Represented
+  | UnRepresented of Lr1.node
+
+val rewind: Lr1.node -> instruction
+
+(* ------------------------------------------------------------------------- *)
+(* Information about which states and positions need to physically
+   exist on the stack. *)
+
+(* [represented s] tells whether state [s] must have an explicit
+   representation, that is, whether it is pushed onto the stack. *)
+
+val represented: Lr1.node -> bool
+
+(* [startp symbol] and [endp symbol] tell whether start or end
+   positions must be recorded for symbol [symbol]. *)
+
+val startp: Symbol.t -> bool
+val endp: Symbol.t -> bool
+
+(* ------------------------------------------------------------------------- *)
+(* Information about error handling. *)
+
+(* [recoverer s] tells whether state [s] can potentially do error
+   recovery. *)
+
+val recoverer: Lr1.node -> bool
+
+(* [errorpeeker s] tells whether state [s] can potentially peek at an
+   error. This is the case if, in state [s], [env.shifted] may be -1,
+   that is, if an error token may be on the stream. *)
+
+val errorpeeker: Lr1.node -> bool
+
+(* ------------------------------------------------------------------------- *)
+(* Information about which productions are reduced and where. *)
+
+(* [ever_reduced prod] tells whether production [prod] is ever reduced. *)
+
+val ever_reduced: Production.index -> bool
+
+(* [fold_reduced prod] folds over all states that can reduce
+   production [prod]. *)
+
+val fold_reduced: (Lr1.node -> 'a -> 'a) -> Production.index -> 'a -> 'a
+
+(* ------------------------------------------------------------------------- *)
+(* Information about default reductions. *)
+
+(* [has_default_reduction s] tells whether state [s] has a default reduction,
+   and, if so, upon which set of tokens. *)
+val has_default_reduction : Lr1.node -> (Production.index * TerminalSet.t) option
+
+(* ------------------------------------------------------------------------- *)
+(* Miscellaneous. *)
+
+(* [universal symbol] tells whether every represented state has an
+   outgoing transition along [symbol]. *)
+
+val universal: Symbol.t -> bool
+
diff --git a/bundles/menhirLib/menhir-20120123/src/item.ml b/bundles/menhirLib/menhir-20120123/src/item.ml
new file mode 100644 (file)
index 0000000..ee0cc8b
--- /dev/null
@@ -0,0 +1,396 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+open Grammar
+
+(* ------------------------------------------------------------------------ *)
+(* Items. *)
+
+(* An LR(0) item encodes a pair of integers, namely the index of the
+   production and the index of the bullet in the production's
+   right-hand side. *)
+
+(* Both integers are packed into a single integer, using 7 bits for
+   the bullet position and the rest (usually 24 bits) for the
+   production index. These widths could be adjusted. *)
+
+type t = int
+
+let import (prod, pos) =
+  assert (pos < 128);
+  (Production.p2i prod) lsl 7 + pos
+
+let export t =
+  (Production.i2p (t lsr 7), t mod 128)
+
+(* Comparison. *)
+
+let equal (item1 : t) (item2: t) =
+  item1 = item2
+
+(* Position. *)
+
+let positions (item : t) =
+  let prod, _ = export item in
+  Production.positions prod
+
+(* [def item] looks up the production associated with this item in the
+   grammar and returns [prod, nt, rhs, pos, length], where [prod] is
+   the production's index, [nt] and [rhs] represent the production,
+   [pos] is the position of the bullet in the item, and [length] is
+   the length of the production's right-hand side. *)
+
+let def t =
+  let prod, pos = export t in
+  let nt, rhs = Production.def prod in
+  let length = Array.length rhs in
+  assert ((pos >= 0) && (pos <= length));
+  prod, nt, rhs, pos, length
+
+let nt t =
+  let _, nt, _, _, _ = def t in
+  nt
+
+let startnt t =
+  let _, _, rhs, pos, length = def t in
+  assert (pos = 0 && length = 1);
+  match rhs.(0) with
+  | Symbol.N nt ->
+      nt
+  | Symbol.T _ ->
+      assert false
+
+(* Printing. *)
+
+let print item =
+  let _, nt, rhs, pos, length = def item in
+  Printf.sprintf "%s -> %s" (Nonterminal.print false nt) (Symbol.printaod 0 pos rhs)
+
+(* Classifying items. *)
+
+type kind =
+  | Shift of Symbol.t * t
+  | Reduce of Production.index
+
+let classify item =
+  let prod, _, rhs, pos, length = def item in
+  if pos = length then
+    Reduce prod
+  else
+    Shift (rhs.(pos), import (prod, pos + 1))
+
+(* Sets of items and maps over items. Hashing these data structures is
+   specifically allowed, so balanced trees (for instance) would not be
+   applicable here. *)
+
+module Map = Patricia.Big
+module Set = Map.Domain
+
+(* This functor performs precomputation that helps efficiently compute
+   the closure of an LR(0) or LR(1) state. The precomputation requires
+   time linear in the size of the grammar. The nature of the lookahead
+   sets remains abstract. *)
+
+(* The precomputation consists in building the LR(0) nondeterministic
+   automaton. This is a graph whose nodes are items and whose edges
+   are epsilon transitions. (We do not care about shift transitions
+   here.) Lookahead information can be attached to nodes and is
+   propagated through the graph during closure computations. *)
+
+module Closure (L : Lookahead.S) = struct
+
+  type state = L.t Map.t
+
+  type node = {
+
+      (* Nodes are sequentially numbered so as to allow applying
+        Tarjan's algorithm (below). *)
+
+      num: int;
+
+      (* Each node is associated with an item. *)
+
+      item: t;
+
+      (* All of the epsilon transitions that leave a node have the
+        same behavior with respect to lookahead information. *)
+
+      (* The lookahead set transmitted along an epsilon transition is
+        either a constant, or the union of a constant and the lookahead
+        set at the source node. The former case corresponds to a source
+        item whose trailer is not nullable, the latter to a source item
+        whose trailer is nullable. *)
+
+      epsilon_constant: L.t;
+      epsilon_transmits: bool;
+
+      (* Each node carries pointers to its successors through
+        epsilon transitions. This field is never modified
+        once initialization is over. *)
+
+      mutable epsilon_transitions: node list;
+
+      (* The following fields are transient, that is, only used
+        temporarily during graph traversals. Marks are used to
+        recognize which nodes have been traversed already. Lists
+        of predecessors are used to record which edges have been
+        traversed. Lookahead information is attached with each
+        node. *)
+
+      mutable mark: Mark.t;
+      mutable predecessors: node list;
+      mutable lookahead: L.t;
+    }
+
+  (* Allocate one graph node per item and build a mapping of
+     items to nodes. *)
+
+  let count =
+    ref 0
+
+  let mapping : node array array =
+    Array.create Production.n [||]
+
+  let item2node item =
+    let prod, pos = export item in
+    mapping.(Production.p2i prod).(pos)
+
+  let () =
+    Production.iter (fun prod ->
+      let nt, rhs = Production.def prod in
+      let length = Array.length rhs in
+      mapping.(Production.p2i prod) <- Array.init (length+1) (fun pos ->
+
+       let item = import (prod, pos) in
+       let num = !count in
+       count := num + 1;
+
+       (* The lookahead set transmitted through an epsilon
+          transition is the FIRST set of the remainder of
+          the source item, plus, if that is nullable, the
+          lookahead set of the source item. *)
+
+       let constant, transmits =
+         if pos < length then
+           let nullable, first = Analysis.nullable_first_rhs rhs (pos + 1) in
+           L.constant first, nullable
+         else
+           (* No epsilon transitions leave this item. *)
+           L.empty, false
+       in
+         
+       {
+         num = num;
+         item = item;
+         epsilon_constant = constant;
+         epsilon_transmits = transmits;
+         epsilon_transitions = []; (* temporary placeholder *)
+         mark = Mark.none;
+         predecessors = [];
+         lookahead = L.empty;
+       }
+
+      )
+    )
+  
+  (* At each node, compute transitions. *)
+
+  let () =
+    Production.iter (fun prod ->
+      let nt, rhs = Production.def prod in
+      let length = Array.length rhs in
+      Array.iteri (fun pos node ->
+
+       node.epsilon_transitions <-
+         if pos < length then
+           match rhs.(pos) with
+           | Symbol.N nt ->
+               Production.foldnt nt [] (fun prod nodes ->
+                 (item2node (import (prod, 0))) :: nodes
+               )
+           | Symbol.T _ ->
+               []
+         else
+           []
+
+      ) mapping.(Production.p2i prod)
+    )
+
+  (* Detect and reject cycles of transitions that transmit a lookahead
+     set.
+
+     We need to ensure that there are no such cycles in order to be
+     able to traverse these transitions in topological order.
+
+     Each such cycle corresponds to a set of productions of the form
+     A1 -> A2, A2 -> A3, ..., An -> A1 (modulo nullable
+     trailers). Such cycles are unlikely to occur in realistic
+     grammars, so our current approach is to reject the grammar if
+     such a cycle exists. Actually, according to DeRemer and Pennello
+     (1982), such a cycle is exactly an includes cycle, and implies
+     that the grammar is not LR(k) for any k, unless A1, ..., An are
+     in fact uninhabited. In other words, this is a pathological
+     case. *)
+
+  (* Yes, indeed, this is called a cycle in Aho & Ullman's book,
+     and a loop in Grune & Jacobs' book. It is not difficult to
+     see that (provided all symbols are inhabited) the grammar
+     is infinitely ambiguous if and only if there is a loop. *)
+
+  module P = struct
+
+    type foo = node
+    type node = foo
+
+    let n =
+      !count
+
+    let index node =
+      node.num
+
+    let iter f =
+      Array.iter (fun nodes ->
+       Array.iter f nodes
+      ) mapping
+
+    let successors f node =
+      if node.epsilon_transmits then
+       List.iter f node.epsilon_transitions
+
+  end
+
+  module T = Tarjan.Run (P)
+
+  let cycle scc =
+    let items = List.map (fun node -> node.item) scc in
+    let positions = List.flatten (List.map positions items) in
+    let names = String.concat "\n" (List.map print items) in
+    Error.error
+      positions
+      (Printf.sprintf "the grammar is ambiguous.\n\
+                       The following items participate in an epsilon-cycle:\n\
+                       %s" names)
+
+  let () =
+     P.iter (fun node ->
+       let scc = T.scc node in
+       match scc with
+       | [] ->
+          ()
+       | [ node ] ->
+
+          (* This is a strongly connected component of one node. Check
+             whether it carries a self-loop. Forbidding self-loops is not
+             strictly required by the code that follows, but is consistent
+             with the fact that we forbid cycles of length greater than 1. *)
+
+          P.successors (fun successor ->
+            if successor.num = node.num then
+              cycle scc
+           ) node
+
+       | _ ->
+
+           (* This is a strongly connected component of at least two
+              elements. *)
+
+          cycle scc
+     )
+
+  (* Closure computation. *)
+
+  let closure (items : state) : state =
+
+    (* Explore the graph forwards, starting from these items. Marks
+       are used to tell which nodes have been visited. Build a list of
+       all visited nodes; this is in fact the list of all items in the
+       closure.
+
+       At initial nodes and when reaching a node through a transition,
+       record a lookahead set.
+
+       When we reach a node through a transition that transmits the
+       lookahead set found at its source, record its source, so as to
+       allow re-traversing this transition backwards (below). *)
+
+    let this = Mark.fresh() in
+    let nodes = ref [] in
+
+    let rec visit father transmits toks node =
+      if Mark.same node.mark this then begin
+       (* Node has been visited already. *)
+       node.lookahead <- L.union toks node.lookahead;
+       if transmits then
+         node.predecessors <- father :: node.predecessors
+      end
+      else begin
+       (* Node is new. *)
+       node.predecessors <- if transmits then [ father ] else [];
+       node.lookahead <- toks;
+       follow node
+      end
+
+    and follow node =
+      node.mark <- this;
+      nodes := node :: !nodes;
+      List.iter
+       (visit node node.epsilon_transmits node.epsilon_constant)
+       node.epsilon_transitions
+
+    in
+
+    Map.iter (fun item toks ->
+      let node = item2node item in
+      visit node (* dummy! *) false toks node
+    ) items;
+
+    let nodes =
+      !nodes in
+
+    (* Explore the graph of transmitting transitions backwards. By
+       hypothesis, it is acyclic, so this is a topological
+       walk. Lookahead sets are inherited through transitions. *)
+
+    let this = Mark.fresh() in
+
+    let rec walk node =
+      if not (Mark.same node.mark this) then begin
+       (* Node is new. *)
+       node.mark <- this;
+       (* Explore all predecessors and merge their lookahead
+          sets into the current node's own lookahead set. *)
+       List.iter (fun predecessor ->
+         walk predecessor;
+         node.lookahead <- L.union predecessor.lookahead node.lookahead
+        ) node.predecessors
+      end
+    in
+
+    List.iter walk nodes;
+
+    (* Done. Produce a mapping of items to lookahead sets.
+       Clear all transient fields so as to reduce pressure
+       on the GC -- this does not make much difference. *)
+
+    List.fold_left (fun closure node ->
+      node.predecessors <- [];
+      let closure = Map.add node.item node.lookahead closure in
+      node.lookahead <- L.empty;
+      closure
+    ) Map.empty nodes
+
+  (* End of closure computation *)
+
+end
+
diff --git a/bundles/menhirLib/menhir-20120123/src/item.mli b/bundles/menhirLib/menhir-20120123/src/item.mli
new file mode 100644 (file)
index 0000000..222bad3
--- /dev/null
@@ -0,0 +1,79 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+open Grammar
+
+(* An LR(0) item encodes a pair of integers, namely the index of the
+   production and the index of the bullet in the production's
+   right-hand side. *)
+
+type t
+val import: Production.index * int -> t
+val export: t -> Production.index * int
+
+(* Comparison. *)
+
+val equal: t -> t -> bool
+
+(* [def item] looks up the production associated with this item in the
+   grammar and returns [prod, nt, rhs, pos, length], where [prod] is
+   the production's index, [nt] and [rhs] represent the production,
+   [pos] is the position of the bullet in the item, and [length] is
+   the length of the production's right-hand side. *)
+
+val def: t -> Production.index * Nonterminal.t * Symbol.t array * int * int
+
+(* If [item] is a start item, [startnt item] returns the start
+   nonterminal that corresponds to [item]. *)
+
+val startnt: t -> Nonterminal.t
+
+(* Printing. *)
+
+val print: t -> string
+
+(* Classifying items as shift or reduce items. A shift item is one
+   where the bullet can still advance. A reduce item is one where the
+   bullet has reached the end of the right-hand side. *)
+
+type kind =
+  | Shift of Symbol.t * t
+  | Reduce of Production.index
+
+val classify: t -> kind
+
+(* Sets of items and maps over items. Hashing these data structures is
+   specifically allowed. *)
+
+module Set : GSet.S with type element = t
+module Map : GMap.S with type key = t
+                     and type Domain.t = Set.t
+
+(* This functor performs precomputation that helps efficiently compute
+   the closure of an LR(0) or LR(1) state. The precomputation requires
+   time linear in the size of the grammar. The nature of the lookahead
+   sets remains abstract. *)
+
+module Closure (L : Lookahead.S) : sig
+
+  (* A state maps items to lookahead information. *)
+
+  type state = L.t Map.t
+
+  (* This takes the closure of a state through all epsilon transitions. *)
+
+  val closure: state -> state
+
+end
+
diff --git a/bundles/menhirLib/menhir-20120123/src/keyword.ml b/bundles/menhirLib/menhir-20120123/src/keyword.ml
new file mode 100644 (file)
index 0000000..6aa3056
--- /dev/null
@@ -0,0 +1,96 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* This module provides some type and function definitions
+   that help deal with the keywords that we recognize within
+   semantic actions. *)
+
+(* ------------------------------------------------------------------------- *)
+(* Types. *)
+
+(* The user can request position information either at type
+   [int] (a simple offset) or at type [Lexing.position]. *)
+
+type flavor =
+  | FlavorOffset
+  | FlavorPosition
+
+(* The user can request position information about the
+   start or end of a symbol. *)
+
+type where =
+  | WhereStart
+  | WhereEnd
+
+(* The user can request position information about a production's
+   left-hand side or about one of the symbols in its right-hand
+   side, which he can refer to by position or by name. *)
+
+type subject =
+  | Left
+  | RightDollar of int
+  | RightNamed of string
+
+(* Keywords inside semantic actions. They allow access to semantic
+   values or to position information. *)
+
+type keyword =
+  | Dollar of int
+  | Position of subject * where * flavor
+  | PreviousError
+  | SyntaxError
+
+(* ------------------------------------------------------------------------- *)
+(* These auxiliary functions help map a [Position] keyword to the
+   name of the variable that the keyword is replaced with. *)
+
+let where = function
+  | WhereStart ->
+      "start"
+  | WhereEnd ->
+      "end"
+
+let subject = function
+  | Left ->
+      ""
+  | RightDollar i ->
+      Printf.sprintf "__%d_" i
+  | RightNamed id ->
+      Printf.sprintf "_%s_" id
+
+let flavor = function
+  | FlavorPosition ->
+      "pos"
+  | FlavorOffset ->
+      "ofs"
+
+let posvar s w f =
+  Printf.sprintf "_%s%s%s" (where w) (flavor f) (subject s)
+
+(* ------------------------------------------------------------------------- *)
+(* Sets of keywords. *)
+
+module KeywordSet = 
+  struct 
+    include Set.Make (struct
+                       type t = keyword
+                       let compare = compare
+                     end)
+
+    (* This converts a list of keywords with positions into a set of keywords. *)
+    let from_list keywords =
+      List.fold_right add keywords empty
+
+  end
+
diff --git a/bundles/menhirLib/menhir-20120123/src/keyword.mli b/bundles/menhirLib/menhir-20120123/src/keyword.mli
new file mode 100644 (file)
index 0000000..26955f7
--- /dev/null
@@ -0,0 +1,82 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* This module provides some type and function definitions
+   that help deal with the keywords that we recognize within
+   semantic actions. *)
+
+(* The user can request position information either at type
+   [int] (a simple offset) or at type [Lexing.position]. *)
+
+type flavor =
+  | FlavorOffset
+  | FlavorPosition
+
+(* The user can request position information about the
+   start or end of a symbol. *)
+
+type where =
+  | WhereStart
+  | WhereEnd
+
+(* The user can request position information about a production's
+   left-hand side or about one of the symbols in its right-hand
+   side, which he can refer to by position or by name. *)
+
+type subject =
+  | Left
+  | RightDollar of int
+  | RightNamed of string
+
+(* Keywords inside semantic actions. They allow access to semantic
+   values or to position information. *)
+
+type keyword =
+  | Dollar of int
+  | Position of subject * where * flavor
+  | PreviousError
+  | SyntaxError
+
+(* This maps a [Position] keyword to the name of the variable that the
+   keyword is replaced with. *)
+
+val posvar: subject -> where -> flavor -> string
+
+(* Sets of keywords. *)
+module KeywordSet : 
+  sig 
+    include Set.S
+
+    (* This converts a list of keywords with positions into a set of keywords. *)
+    val from_list: elt list -> t
+
+  end with type elt = keyword
+
+(* (\* TEMPORARY These functions are replaced by the ones found  *)
+(*    in [Action]. *\) *)
+(* (\* These iterate over a list of keywords with positions, disregarding *)
+(*    the positions, and making sure that duplicate elements are not *)
+(*    presented. *\) *)
+
+(* val iter: (keyword -> unit) -> (keyword * 'a * 'b) list -> unit *)
+(* val fold: (keyword -> 'c -> 'c) -> (keyword * 'a * 'b) list -> 'c -> 'c *)
+
+(* (\* These tell whether a list of keywords with positions contains *)
+(*    a certain keyword. *\) *)
+  
+(* val has_previouserror: (keyword * 'a * 'b) list -> bool *)
+(* val has_syntaxerror: (keyword * 'a * 'b) list -> bool *)
+(* val has_leftstart: (keyword * 'a * 'b) list -> bool *)
+(* val has_leftend: (keyword * 'a * 'b) list -> bool *)
+(* val has_dollar: int -> (keyword * 'a * 'b) list -> bool *)
diff --git a/bundles/menhirLib/menhir-20120123/src/lexdep.mll b/bundles/menhirLib/menhir-20120123/src/lexdep.mll
new file mode 100644 (file)
index 0000000..b336ccd
--- /dev/null
@@ -0,0 +1,61 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* This code analyzes the output of [ocamldep] and returns the list
+   of [.cmi] files that the [.cmo] file depends on. *)
+
+{
+
+  open Lexing
+
+  let fail lexbuf =
+    Error.error []
+      (Printf.sprintf
+        "failed to make sense of ocamldep's output (character %d)."
+        lexbuf.lex_curr_p.pos_cnum)
+
+}
+
+let newline = ('\n' | '\r' | "\r\n")
+
+let whitespace = ( ' ' | '\t' | ('\\' newline) )
+
+let entrychar = [^ '\n' '\r' '\t' ' ' '\\' ':' ]
+
+let entry = ((entrychar+ as basename) ".cm" ('i' | 'o' | 'x') as filename)
+
+(* [main] recognizes a sequence of lines, where a line consists of an
+   entry, followed by a colon, followed by a list of entries. *)
+
+rule main = parse
+| eof
+    { [] }
+| entry ":"
+    { let bfs = collect [] lexbuf in
+      ((basename, filename), bfs) :: main lexbuf }
+| _
+    { fail lexbuf }
+
+(* [collect] recognizes a list of entries, separated with spaces and
+   ending in a newline. *)
+
+and collect bfs = parse
+| whitespace+ entry
+    { collect ((basename, filename) :: bfs) lexbuf }
+| whitespace* newline
+    { bfs }
+| _
+| eof
+    { fail lexbuf }
+
diff --git a/bundles/menhirLib/menhir-20120123/src/lexer.mll b/bundles/menhirLib/menhir-20120123/src/lexer.mll
new file mode 100644 (file)
index 0000000..a4a37c8
--- /dev/null
@@ -0,0 +1,500 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+{
+
+  open Lexing
+  open Parser
+  open Positions
+
+  (* This wrapper saves the current lexeme start, invokes its argument,
+     and restores it. This allows transmitting better positions to the
+     parser. *)
+
+  let savestart lexbuf f =
+    let startp = lexbuf.lex_start_p in
+    let token = f lexbuf in
+    lexbuf.lex_start_p <- startp;
+    token
+  
+  (* Updates the line counter, which is used in some error messages. *)
+
+  let update_loc lexbuf =
+    let pos = lexbuf.lex_curr_p in
+    lexbuf.lex_curr_p <- { pos with
+      pos_lnum = pos.pos_lnum + 1;
+      pos_bol = pos.pos_cnum;
+    }
+
+  (* Extracts a chunk out of the source file. *)    
+
+  let chunk ofs1 ofs2 =
+    let contents = Error.get_file_contents() in
+    let len = ofs2 - ofs1 in
+    String.sub contents ofs1 len
+
+  (* Extracts a chunk out of the source file, delimited by
+     one position and extending to the end of the file. *)
+
+  let echunk ofs1 =
+    let contents = Error.get_file_contents() in
+    let len = String.length contents - ofs1 in
+    String.sub contents ofs1 len
+
+  (* Overwrites an old character with a new one at a specified
+     offset in a string. *)
+
+  let overwrite content offset c1 c2 =
+    assert (content.[offset] = c1);
+    content.[offset] <- c2
+
+  (* Creates a stretch. *)
+
+  let mk_stretch parenthesize pos1 pos2 pkeywords = 
+    let ofs1 = pos1.pos_cnum
+    and ofs2 = pos2.pos_cnum in
+    let raw_content = chunk ofs1 ofs2 in
+    let content = String.copy raw_content in
+    (* Turn our keywords into valid Objective Caml identifiers
+       by replacing '$', '(', and ')' with '_'. Bloody. *)
+    List.iter (function { value = keyword; position = pos } ->
+      let pos = start_of_position pos in
+      let ofs = pos.pos_cnum - ofs1 in
+      overwrite content ofs '$' '_';
+      match keyword with
+      | Keyword.Dollar _
+      | Keyword.Position (Keyword.Left, _, _)
+      | Keyword.PreviousError ->
+         ()
+      | Keyword.SyntaxError ->
+         (* $syntaxerror is replaced with
+            (raise _eRR) *)
+          let source = "(raise _eRR)" in
+          String.blit source 0 content ofs (String.length source)
+      | Keyword.Position (subject, where, _) ->
+         let ofslpar =
+           match where with
+           | Keyword.WhereStart ->
+               ofs + 9
+           | Keyword.WhereEnd ->
+               ofs + 7
+         in
+         overwrite content ofslpar '(' '_';
+         match subject with
+         | Keyword.Left ->
+             assert false
+         | Keyword.RightDollar i ->
+             overwrite content (ofslpar + 1) '$' '_';
+             overwrite content (ofslpar + 2 + String.length (string_of_int i)) ')' '_'
+         | Keyword.RightNamed id ->
+             overwrite content (ofslpar + 1 + String.length id) ')' '_'
+    ) pkeywords;
+    (* Add whitespace so that the column numbers match those of the source file.
+       If requested, add parentheses so that the semantic action can be inserted
+       into other code without ambiguity. *)
+    let content =
+      if parenthesize then
+         (String.make (pos1.pos_cnum - pos1.pos_bol - 1) ' ') ^ "(" ^ content ^ ")"
+      else
+       (String.make (pos1.pos_cnum - pos1.pos_bol) ' ') ^ content
+    in
+    {
+      Stretch.stretch_filename = Error.get_filename();
+      Stretch.stretch_linenum = pos1.pos_lnum;
+      Stretch.stretch_linecount = pos2.pos_lnum - pos1.pos_lnum;
+      Stretch.stretch_content = content;
+      Stretch.stretch_raw_content = raw_content;
+      Stretch.stretch_keywords = pkeywords
+    } 
+
+  (* Translates the family of position-related keywords to abstract
+     syntax. *)
+
+  let mk_keyword lexbuf w f n id =
+    let where =
+      match w with
+      | Some _ ->
+         Keyword.WhereStart
+      | None ->
+         Keyword.WhereEnd
+    and flavor =
+      match f with
+      | Some _ ->
+         Keyword.FlavorPosition
+      | None ->
+         Keyword.FlavorOffset
+    and subject =
+      match n, id with
+      | Some n, None ->
+         Keyword.RightDollar (int_of_string n)
+      | None, Some id ->
+         Keyword.RightNamed id
+      | None, None ->
+         Keyword.Left
+      | Some _, Some _ ->
+          assert false
+    in
+    let keyword = Keyword.Position (subject, where, flavor) in
+    with_cpos lexbuf keyword
+
+  (* Objective Caml's reserved words. *)
+
+  let reserved =
+    let table = Hashtbl.create 149 in
+    List.iter (fun word -> Hashtbl.add table word ()) [
+      "and";
+      "as";
+      "assert";
+      "begin";
+      "class";
+      "constraint";
+      "do";
+      "done";
+      "downto";
+      "else";
+      "end";
+      "exception";
+      "external";
+      "false";
+      "for";
+      "fun";
+      "function";
+      "functor";
+      "if";
+      "in";
+      "include";
+      "inherit";
+      "initializer";
+      "lazy";
+      "let";
+      "match";
+      "method";
+      "module";
+      "mutable";
+      "new";
+      "object";
+      "of";
+      "open";
+      "or";
+      "parser";
+      "private";
+      "rec";
+      "sig";
+      "struct";
+      "then";
+      "to";
+      "true";
+      "try";
+      "type";
+      "val";
+      "virtual";
+      "when";
+      "while";
+      "with";
+      "mod";
+      "land";
+      "lor";
+      "lxor";
+      "lsl";
+      "lsr";
+      "asr";
+    ];
+    table
+
+  (* A short-hand. *)
+
+  let error1 pos msg =
+    Error.error (Positions.one pos) msg
+
+}
+
+let newline = ('\010' | '\013' | "\013\010")
+
+let whitespace = [ ' ' '\t' ';' ]
+
+let lowercase = ['a'-'z' '\223'-'\246' '\248'-'\255' '_']
+
+let uppercase = ['A'-'Z' '\192'-'\214' '\216'-'\222']
+
+let identchar = ['A'-'Z' 'a'-'z' '_' '\192'-'\214' '\216'-'\246' '\248'-'\255' '0'-'9'] (* '\'' forbidden *)
+
+let poskeyword = 
+  '$'
+  (("start" as w) | "end")
+  (("pos" as f) | "ofs")
+  ( '(' ( '$' (['0'-'9']+ as n) | ((lowercase identchar*) as id)) ')')?
+
+let previouserror =
+  "$previouserror"
+
+let syntaxerror =
+  "$syntaxerror"
+
+rule main = parse
+| "%token"
+    { TOKEN }
+| "%type"
+    { TYPE }
+| "%left"
+    { LEFT }
+| "%right"
+    { RIGHT }
+| "%nonassoc"
+    { NONASSOC }
+| "%start"
+    { START }
+| "%prec"
+    { PREC }
+| "%public"
+    { PUBLIC }
+| "%parameter"
+    { PARAMETER }
+| "%inline"
+    { INLINE }
+| "%%"
+    { let ofs = lexeme_end lexbuf in
+      PERCENTPERCENT (lazy (echunk ofs)) }
+| ":"
+    { COLON }
+| ","
+    { COMMA }
+| "="
+    { EQUAL }
+| "("
+    { LPAREN }
+| ")"
+    { RPAREN }
+| "|"
+    { BAR }
+| "?"
+    { QUESTION }
+| "*"
+    { STAR }
+| "+"
+    { PLUS }
+| (lowercase identchar *) as id
+    { if Hashtbl.mem reserved id then
+       Error.errorp
+         (Positions.with_poss (lexeme_start_p lexbuf) (lexeme_end_p lexbuf) ())
+         "this is an Objective Caml reserved word."
+      else
+       LID (with_pos (cpos lexbuf) id)
+    }
+| (uppercase identchar *) as id
+    { UID (with_pos (cpos lexbuf) id) }
+| "//" [^ '\010' '\013']* newline (* skip C++ style comment *)
+| newline
+    { update_loc lexbuf; main lexbuf }
+| whitespace+
+    { main lexbuf }
+| "/*"
+    { comment (lexeme_start_p lexbuf) lexbuf; main lexbuf }
+| "(*"
+    { ocamlcomment (lexeme_start_p lexbuf) lexbuf; main lexbuf }
+| "<"
+    { savestart lexbuf (ocamltype (lexeme_end_p lexbuf)) }
+| "%{"
+    { savestart lexbuf (fun lexbuf ->
+        let openingpos = lexeme_end_p lexbuf in
+        let closingpos, _ = action true openingpos [] lexbuf in
+       (* TEMPORARY if keyword list nonempty, issue an error *)
+        HEADER (mk_stretch false openingpos closingpos [])
+      ) }
+| "{"
+    { savestart lexbuf (fun lexbuf ->
+        let openingpos = lexeme_end_p lexbuf in
+        let closingpos, pkeywords = action false openingpos [] lexbuf in
+       let stretch = mk_stretch true openingpos closingpos pkeywords in
+        ACTION (Action.from_stretch stretch)
+      ) }
+(* TEMPORARY comprendre si la différence entre header et action est bien
+             justifiée et si certains choix comme le parenthésage et le
+             traitement des keywords ne pourraient pas Ãªtre effectués
+             plus loin. *)
+| eof
+    { EOF }
+| _
+    { error1 (lexeme_start_p lexbuf) "unexpected character(s)." }
+
+(* Skip C style comments. *)
+
+and comment openingpos = parse
+| newline
+    { update_loc lexbuf; comment openingpos lexbuf }
+| "*/"
+    { () }
+| eof
+    { error1 openingpos "unterminated comment." }
+| _
+    { comment openingpos lexbuf }
+
+(* Collect an O'Caml type delimited by angle brackets. Angle brackets can
+   appear as part of O'Caml function types. They might also appear as part
+   of O'Caml variant types, but we ignore that possibility for the moment. *)
+
+and ocamltype openingpos = parse
+| "->"
+    { ocamltype openingpos lexbuf }
+| '>'
+    { OCAMLTYPE (Stretch.Declared (mk_stretch true openingpos (lexeme_start_p lexbuf) [])) }
+| "(*"
+    { ocamlcomment (lexeme_start_p lexbuf) lexbuf; ocamltype openingpos lexbuf }
+| newline
+    { update_loc lexbuf; ocamltype openingpos lexbuf }
+| eof
+    { error1 openingpos "unterminated Objective Caml type." }
+| _
+    { ocamltype openingpos lexbuf }
+
+(* Collect O'Caml code delimited by curly brackets. Any occurrences of
+   the special ``$i'' identifiers are recorded in the accumulating
+   parameter [pkeywords]. Nested curly brackets must be properly
+   counted. Nested parentheses are also kept track of, so as to better
+   report errors when they are not balanced. *)
+
+and action percent openingpos pkeywords = parse
+| '{'
+    { let _, pkeywords = action false (lexeme_end_p lexbuf) pkeywords lexbuf in
+      action percent openingpos pkeywords lexbuf }
+| ("}" | "%}") as delimiter
+    { match percent, delimiter with
+      | true, "%}"
+      | false, "}" ->
+         (* This is the delimiter we were instructed to look for. *)
+         lexeme_start_p lexbuf, pkeywords
+      | _, _ ->
+         (* This is not it. *)
+         error1 openingpos "unbalanced opening brace."
+    }
+| '('
+    { let _, pkeywords = parentheses (lexeme_end_p lexbuf) pkeywords lexbuf in
+      action percent openingpos pkeywords lexbuf }
+| '$' (['0'-'9']+ as n)
+    { let pkeyword = with_cpos lexbuf (Keyword.Dollar (int_of_string n)) in
+      action percent openingpos (pkeyword :: pkeywords) lexbuf }
+| poskeyword
+    { let pkeyword = mk_keyword lexbuf w f n id in
+      action percent openingpos (pkeyword :: pkeywords) lexbuf }
+| previouserror
+    { let pkeyword = with_cpos lexbuf Keyword.PreviousError in
+      action percent openingpos (pkeyword :: pkeywords) lexbuf }
+| syntaxerror
+    { let pkeyword = with_cpos lexbuf Keyword.SyntaxError in
+      action percent openingpos (pkeyword :: pkeywords) lexbuf }
+| '"'
+    { string (lexeme_start_p lexbuf) lexbuf;
+      action percent openingpos pkeywords lexbuf }
+| "'"
+    { char lexbuf;
+      action percent openingpos pkeywords lexbuf }
+| "(*"
+    { ocamlcomment (lexeme_start_p lexbuf) lexbuf;
+      action percent openingpos pkeywords lexbuf }
+| newline
+    { update_loc lexbuf;
+      action percent openingpos pkeywords lexbuf }
+| ')'
+| eof
+    { error1 openingpos "unbalanced opening brace." }
+| _
+    { action percent openingpos pkeywords lexbuf }
+
+and parentheses openingpos pkeywords = parse
+| '('
+    { let _, pkeywords = parentheses (lexeme_end_p lexbuf) pkeywords lexbuf in
+      parentheses openingpos pkeywords lexbuf }
+| ')'
+    { lexeme_start_p lexbuf, pkeywords }
+| '{'
+    { let _, pkeywords = action false (lexeme_end_p lexbuf) pkeywords lexbuf in
+      parentheses openingpos pkeywords lexbuf }
+| '$' (['0'-'9']+ as n)
+    { let pkeyword = with_cpos lexbuf (Keyword.Dollar (int_of_string n)) in
+      parentheses openingpos (pkeyword :: pkeywords) lexbuf }
+| poskeyword
+    { let pkeyword = mk_keyword lexbuf w f n id in
+      parentheses openingpos (pkeyword :: pkeywords) lexbuf }
+| previouserror
+    { let pkeyword = with_cpos lexbuf Keyword.PreviousError in
+      parentheses openingpos (pkeyword :: pkeywords) lexbuf }
+| syntaxerror
+    { let pkeyword = with_cpos lexbuf Keyword.SyntaxError in
+      parentheses openingpos (pkeyword :: pkeywords) lexbuf }
+| '"'
+    { string (lexeme_start_p lexbuf) lexbuf; parentheses openingpos pkeywords lexbuf }
+| "'"
+    { char lexbuf; parentheses openingpos pkeywords lexbuf }
+| "(*"
+    { ocamlcomment (lexeme_start_p lexbuf) lexbuf; parentheses openingpos pkeywords lexbuf }
+| newline
+    { update_loc lexbuf; parentheses openingpos pkeywords lexbuf }
+| '}'
+| eof
+    { error1 openingpos "unbalanced opening parenthesis." }
+| _
+    { parentheses openingpos pkeywords lexbuf }
+
+(* Skip O'Caml comments. Comments can be nested and can contain
+   strings or characters, which must be correctly analyzed. (A string
+   could contain begin-of-comment or end-of-comment sequences, which
+   must be ignored; a character could contain a begin-of-string
+   sequence.) *)
+
+and ocamlcomment openingpos = parse
+| "*)"
+    { () }
+| "(*"
+    { ocamlcomment (lexeme_start_p lexbuf) lexbuf; ocamlcomment openingpos lexbuf }
+| '"'
+    { string (lexeme_start_p lexbuf) lexbuf; ocamlcomment openingpos lexbuf }
+| "'"
+    { char lexbuf; ocamlcomment openingpos lexbuf }
+| newline
+    { update_loc lexbuf; ocamlcomment openingpos lexbuf }
+| eof
+    { error1 openingpos "unterminated Objective Caml comment." }
+| _
+    { ocamlcomment openingpos lexbuf }
+
+(* Skip O'Caml strings. *)
+
+and string openingpos = parse
+| '"' 
+   { () }
+| '\\' newline
+| newline
+   { update_loc lexbuf; string openingpos lexbuf }
+| '\\' _
+   (* Upon finding a backslash, skip the character that follows,
+      unless it is a newline. Pretty crude, but should work. *)
+   { string openingpos lexbuf }
+| eof 
+   { error1 openingpos "unterminated Objective Caml string." }
+| _
+   { string openingpos lexbuf }
+
+(* Skip O'Caml characters. A lone quote character is legal inside
+   a comment, so if we don't recognize the matching closing quote,
+   we simply abandon. *)
+
+and char = parse
+| '\\'? newline "'"
+   { update_loc lexbuf }
+| [^ '\\' '\''] "'"
+| '\\' _ "'"
+| '\\' ['0'-'9'] ['0'-'9'] ['0'-'9'] "'"
+| '\\' 'x' ['0'-'9' 'a'-'f' 'A'-'F'] ['0'-'9' 'a'-'f' 'A'-'F'] "'"
+| ""
+   { () } 
+
diff --git a/bundles/menhirLib/menhir-20120123/src/lexmli.mll b/bundles/menhirLib/menhir-20120123/src/lexmli.mll
new file mode 100644 (file)
index 0000000..e40e143
--- /dev/null
@@ -0,0 +1,68 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* This code analyzes the output of [ocamlc -i] and returns a list
+   of identifiers together with their types. Types are represented
+   by offsets in the source string. *)
+
+{
+
+  let fail () =
+    Error.error [] "failed to make sense of ocamlc's output."
+
+}
+
+let whitespace = [ ' ' '\t' '\n' '\r' ]
+
+let lowercase = ['a'-'z' '\223'-'\246' '\248'-'\255' '_']
+
+let identchar = ['A'-'Z' 'a'-'z' '_' '\192'-'\214' '\216'-'\246' '\248'-'\255' '0'-'9'] (* '\'' forbidden *)
+
+(* Read a list of bindings. We start immediately after a [val]
+   keyword, so we expect either an end marker, or an identifier,
+   followed by a colon, followed by a type, followed by another list
+   of bindings. In the latter case, we recognize the identifier and
+   the colon, record where the type begins, and pass control to
+   [type_then_bindings]. *)
+
+rule bindings env = parse
+| "menhir_end_marker : int"
+    { env }
+| whitespace* ((lowercase identchar*) as id) whitespace* ':' whitespace*
+    { type_then_bindings env id (Lexing.lexeme_end lexbuf) lexbuf }
+| _
+| eof
+    { fail() }
+
+(* Read a type followed by a list of bindings. *)
+
+and type_then_bindings env id openingofs = parse
+| whitespace+ "val" whitespace
+    { let closingofs = Lexing.lexeme_start lexbuf in
+      bindings ((id, openingofs, closingofs) :: env) lexbuf }
+| _
+    { type_then_bindings env id openingofs lexbuf }
+| eof
+    { fail() }
+
+(* Skip up to the first [val] keyword that follows the begin marker,
+   and start from there. *)
+
+and main = parse
+| _* "val menhir_begin_marker : int" whitespace+ "val" whitespace+
+    { bindings [] lexbuf }
+| _
+| eof
+    { fail() }
+
diff --git a/bundles/menhirLib/menhir-20120123/src/lineCount.mll b/bundles/menhirLib/menhir-20120123/src/lineCount.mll
new file mode 100644 (file)
index 0000000..c20388d
--- /dev/null
@@ -0,0 +1,29 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* This simple function counts the number of newline characters
+   in a string. *)
+
+let newline = ('\010' | '\013' | "\013\010")
+
+let ordinary = [^ '\010' '\013']+
+
+rule count n = parse
+| eof
+    { n }
+| newline
+    { count (n + 1) lexbuf }
+| ordinary
+    { count n lexbuf }
+
diff --git a/bundles/menhirLib/menhir-20120123/src/listMonad.ml b/bundles/menhirLib/menhir-20120123/src/listMonad.ml
new file mode 100644 (file)
index 0000000..e914c2d
--- /dev/null
@@ -0,0 +1,52 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+type 'a m = 'a list
+
+let return x = 
+  [ x ] 
+
+let bind l f = 
+  List.flatten (List.map f l)
+
+let ( >>= ) l f = 
+  bind l f
+
+(* 
+   1. (return x) >>= f == f x
+
+   bind [ x ] f 
+   = List.flatten (List.map f [ x ]) 
+   = f x 
+
+   2. m >>= return == m
+
+   bind l return 
+   = List.flatten (List.map (fun x -> [ x ]) (x1::x2::..::xn))
+   = List.flatten ([x1]::...::[xn]) 
+   = x1::...::xn
+   = l
+
+   3. (m >>= f) >>= g == m >>= (\x -> f x >>= g)
+   
+   bind (bind l f) g
+   = List.flatten (List.map g (List.flatten (List.map f (x1::...::xn))))
+   = List.flatten (List.map g (f x1 :: f x2 :: ... :: f xn))
+   = List.flatten (List.map g ([fx1_1; fx1_2 ... ] :: [fx2_1; ... ] :: ...))
+   = List.flatten ([ g fx1_1; g fx_1_2 ... ] :: [ g fx_2_1; ... ] ...)
+   = List.flatten (List.map (fun x -> List.flatten (List.map g (f x))) l)
+   = bind l (fun x -> bind (f x) g)
+
+*)
+
diff --git a/bundles/menhirLib/menhir-20120123/src/listMonad.mli b/bundles/menhirLib/menhir-20120123/src/listMonad.mli
new file mode 100644 (file)
index 0000000..10d567e
--- /dev/null
@@ -0,0 +1,28 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* $Id: listMonad.mli,v 1.2 2005/12/01 16:20:06 regisgia Exp $ *)
+
+(** Monad type which represents a list of results. *)
+type 'a m = 'a list
+
+(** [bind x f] applies [f] to a list of results, returning
+    a list of results. *)
+val bind: 'a m -> ('a -> 'b m) -> 'b m
+val ( >>= ) : 'a m -> ('a -> 'b m) -> 'b m
+
+(** [return x] is the left and right unit of [bind]. *)
+val return: 'a -> 'a m
+
+
diff --git a/bundles/menhirLib/menhir-20120123/src/lookahead.mli b/bundles/menhirLib/menhir-20120123/src/lookahead.mli
new file mode 100644 (file)
index 0000000..77ac869
--- /dev/null
@@ -0,0 +1,35 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* These are the operations required of lookahead sets during
+   a closure computation. This signature is exploited by the
+   functor [Item.Closure]. *)
+
+module type S = sig
+
+  (* The type of lookahead sets. *)
+  type t
+
+  (* The empty lookahead set. Redundant with the following, but
+     convenient. *)
+  val empty: t
+
+  (* A concrete, constant set of terminal symbols. *)
+  val constant: Grammar.TerminalSet.t -> t
+
+  (* [union s1 s2] returns the union of [s1] and [s2].  *)
+  val union: t -> t -> t
+
+end
+
diff --git a/bundles/menhirLib/menhir-20120123/src/lr0.ml b/bundles/menhirLib/menhir-20120123/src/lr0.ml
new file mode 100644 (file)
index 0000000..c3b53ce
--- /dev/null
@@ -0,0 +1,562 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+open Grammar
+
+module InfiniteArray =
+  MenhirLib.InfiniteArray
+
+(* ------------------------------------------------------------------------ *)
+(* Symbolic lookahead information. *)
+
+(* A symbolic lookahead set consists of an actual concrete set of
+   terminal symbols and of a number of set variables. Set variables as
+   encoded as integers. *)
+
+module SymbolicLookahead = struct
+
+  type t =
+    TerminalSet.t * CompressedBitSet.t
+
+  let constant toks =
+    (toks, CompressedBitSet.empty)
+
+  let empty =
+    constant TerminalSet.empty
+
+  let union (toks1, vars1) ((toks2, vars2) as s2) =
+    let toks = TerminalSet.union toks1 toks2
+    and vars = CompressedBitSet.union vars1 vars2 in
+    if toks2 == toks && vars2 == vars then
+      s2
+    else   
+      (toks, vars)
+
+  let variable (var : int) : t =
+    (TerminalSet.empty, CompressedBitSet.singleton var)
+
+  let project (toks, vars) =
+    assert (CompressedBitSet.is_empty vars);
+    toks
+
+end
+
+(* We will perform closure operations over symbolic lookahead sets.
+   This allows us to later represent LR(1) states as pairs of an
+   LR(0) node number and an array of concrete lookahead sets. *)
+
+module SymbolicClosure =
+  Item.Closure(SymbolicLookahead)
+
+(* Closure operations over concrete lookahead sets are also used (when
+   explaining conflicts). One could take another instance of the
+   functor. The approach below is somewhat less elegant and makes each
+   call to [closure] somewhat slower, but saves the cost of
+   instantiating the functor again -- which is linear in the size of
+   the grammar. *)
+
+type concretelr1state =
+    TerminalSet.t Item.Map.t
+
+let closure (state : concretelr1state) : concretelr1state =
+   Item.Map.map SymbolicLookahead.project
+     (SymbolicClosure.closure
+       (Item.Map.map SymbolicLookahead.constant state))
+
+(* ------------------------------------------------------------------------ *)
+(* Finding which non-epsilon transitions leave a set of items. This
+   code is parametric in the nature of lookahead sets. *)
+
+let transitions (state : 'a Item.Map.t) : 'a Item.Map.t SymbolMap.t =
+
+  Item.Map.fold (fun item toks transitions ->
+    match Item.classify item with
+    | Item.Shift (symbol, item') ->
+       let items : 'a Item.Map.t =
+         try
+           SymbolMap.find symbol transitions
+         with Not_found ->
+           Item.Map.empty
+       in
+       SymbolMap.add symbol (Item.Map.add item' toks items) transitions
+    | Item.Reduce _ ->
+       transitions
+  ) state SymbolMap.empty
+
+(* ------------------------------------------------------------------------ *)
+(* Determining the reduction opportunities at a (closed) state. They
+   are represented as a list of pairs of a lookahead set and a
+   production index. This code is again parametric in the nature of
+   lookahead sets. *)
+
+let reductions (state : 'a Item.Map.t) : ('a * Production.index) list =
+  Item.Map.fold (fun item toks accu ->
+    match Item.classify item with
+    | Item.Reduce prod ->
+       (toks, prod) :: accu
+    | Item.Shift _ ->
+       accu
+  ) state []
+
+(* ------------------------------------------------------------------------ *)
+(* Construction of the the LR(0) automaton. *)
+
+(* Nodes are numbered sequentially. *)
+
+type node =
+    int
+
+(* A symbolic transition is a pair of the target state number and an
+   array of symbolic lookahead sets. The variables in these sets are
+   numbered in [0,g) where g is the number of items in the source
+   LR(0) state. Items are numbered in the order of presentation by
+   [Item.Set.fold]. *)
+
+type symbolic_transition_target =
+    node * SymbolicLookahead.t array
+
+(* The automaton is represented by (growing) arrays of states (sets of
+   items), symbolic transition information, and symbolic reduction
+   information, indexed by node numbers. Conversely, a hash table maps
+   states (sets of items) to node numbers. *)
+
+let n =
+  ref 0
+
+let states : Item.Set.t InfiniteArray.t =
+  InfiniteArray.make Item.Set.empty
+
+let _transitions : symbolic_transition_target SymbolMap.t InfiniteArray.t =
+  InfiniteArray.make SymbolMap.empty
+
+let _reductions : (SymbolicLookahead.t * Production.index) list InfiniteArray.t =
+  InfiniteArray.make []
+
+let map : (Item.Set.t, node) Hashtbl.t =
+  Hashtbl.create 50021
+
+(* The automaton is built depth-first. *)
+
+let rec explore (state : Item.Set.t) : node =
+
+  (* Find out whether this state was already explored. *)
+
+  try
+    Hashtbl.find map state
+  with Not_found ->
+
+    (* If not, create a new node. *)
+
+    let k = !n in
+    n := k + 1;
+    InfiniteArray.set states k state;
+    Hashtbl.add map state k;
+
+    (* Build a symbolic version of the current state, where each item
+       is associated with a distinct lookahead set variable, numbered
+       consecutively. *)
+
+    let (_ : int), (symbolic_state : SymbolicClosure.state) =
+      Item.Set.fold (fun item (i, symbolic_state) ->
+       i+1, Item.Map.add item (SymbolicLookahead.variable i) symbolic_state
+      ) state (0, Item.Map.empty) in
+
+    (* Compute the symbolic closure. *)
+
+    let closure = SymbolicClosure.closure symbolic_state in
+
+    (* Compute symbolic information about reductions. *)
+
+    InfiniteArray.set _reductions k (reductions closure);
+
+    (* Compute symbolic information about the transitions, and, by
+       dropping the symbolic lookahead information, explore the
+       transitions to further LR(0) states. *)
+
+    InfiniteArray.set _transitions k (SymbolMap.map (fun symbolic_state ->
+      let (k : node) = explore (Item.Map.domain symbolic_state) in
+      let lookahead : SymbolicLookahead.t array =
+       Array.create (Item.Map.cardinal symbolic_state) SymbolicLookahead.empty in
+      let (_ : int) = Item.Map.fold (fun _ s i ->
+       lookahead.(i) <- s;
+       i+1
+      ) symbolic_state 0 in
+      ((k, lookahead) : symbolic_transition_target)
+    ) (transitions closure));
+
+    k
+
+(* Creating a start state out of a start production. It contains a
+   single item, consisting of the start production, at position 0. *)
+
+let start prod : Item.Set.t =
+   Item.Set.singleton (Item.import (prod, 0))
+
+(* This starts the construction of the automaton and records the
+   entry nodes in an array. *)
+
+let entry : node ProductionMap.t =
+  ProductionMap.start (fun prod ->
+    explore (start prod)
+  )
+
+let () =
+  Hashtbl.clear map
+
+let n =
+  !n
+
+let () =
+  Error.logA 1 (fun f -> Printf.fprintf f "Built an LR(0) automaton with %d states.\n" n);
+  Time.tick "Construction of the LR(0) automaton"
+
+(* ------------------------------------------------------------------------ *)
+(* Accessors. *)
+
+let items node : Item.Set.t =
+  InfiniteArray.get states node
+
+(* ------------------------------------------------------------------------ *)
+(* Help for building the LR(1) automaton. *)
+
+(* An LR(1) state is represented as a pair of an LR(0) state number
+   and an array of concrete lookahead sets (whose length depends on
+   the LR(0) state). *)
+
+type lr1state =
+    node * TerminalSet.t array
+
+(* An encoded LR(1) state can be turned into a concrete representation,
+   that is, a mapping of items to concrete lookahead sets. *)
+
+let export (k, toksr) =
+  let (_ : int), items = Item.Set.fold (fun item (i, items) ->
+    i+1, Item.Map.add item toksr.(i) items
+  ) (InfiniteArray.get states k) (0, Item.Map.empty) in
+  items
+
+(* Displaying a concrete state. *)
+
+let print_concrete (state : concretelr1state) =
+  let buffer = Buffer.create 1024 in
+  Item.Map.iter (fun item toks ->
+    Printf.bprintf buffer "%s[ %s ]\n" (Item.print item) (TerminalSet.print toks)
+  ) state;
+  Buffer.contents buffer
+
+(* Displaying a state. By default, only the kernel is displayed, not
+   the closure. *)
+
+let print state =
+  print_concrete (export state)
+
+let print_closure state =
+  print_concrete (closure (export state))
+
+(* The core of an LR(1) state is the underlying LR(0) state. *)
+
+let core (k, _) =
+  k
+
+(* A sanity check. *)
+
+let well_formed (k, toksr) =
+  Array.length toksr = Item.Set.cardinal (InfiniteArray.get states k)
+
+(* An LR(1) start state is the combination of an LR(0) start state
+   (which consists of a single item) with a singleton lookahead set
+   that consists of the end-of-file pseudo-token. *)
+
+let start k =
+  let state = (k, [| TerminalSet.singleton Terminal.sharp |]) in
+  assert (well_formed state);
+  state
+
+(* Interpreting a symbolic lookahead set with respect to a source
+   state. The variables in the symbolic lookahead set (which are
+   integers) are interpreted as indices into the state's array of
+   concrete lookahead sets. The result is a concrete lookahead set. *)
+
+let interpret
+    ((_, toksr) as state : lr1state)
+    ((toks, vars) : SymbolicLookahead.t)
+    : TerminalSet.t =
+
+  assert (well_formed state);
+  CompressedBitSet.fold (fun var toks ->
+    assert (var >= 0 && var < Array.length toksr);
+    TerminalSet.union toksr.(var) toks
+  ) vars toks
+
+(* Out of an LR(1) state, one produces information about reductions
+   and transitions. This is done in an efficient way by interpreting
+   the precomputed symbolic information with respect to that state. *)
+
+let reductions
+    ((k, _) as state : lr1state)
+    : (TerminalSet.t * Production.index) list =
+
+  List.map (fun (s, prod) ->
+    interpret state s, prod
+  ) (InfiniteArray.get _reductions k)
+
+let transitions
+    ((k, _) as state : lr1state)
+    : lr1state SymbolMap.t =
+
+  SymbolMap.map (fun ((k, sr) : symbolic_transition_target) ->
+    ((k, Array.map (interpret state) sr) : lr1state)
+  ) (InfiniteArray.get _transitions k)
+
+let outgoing_symbols
+    (k : node)
+    : Symbol.t list =
+
+  SymbolMap.domain (InfiniteArray.get _transitions k)
+
+let transition
+    symbol
+    ((k, _) as state : lr1state)
+    : lr1state =
+
+  let ((k, sr) : symbolic_transition_target) =
+    try
+      SymbolMap.find symbol (InfiniteArray.get _transitions k)
+    with Not_found ->
+      assert false (* no transition along this symbol *)
+  in
+  (k, Array.map (interpret state) sr)
+
+(* Equality of states. *)
+
+let equal ((k1, toksr1) as state1) ((k2, toksr2) as state2) =
+  assert (k1 = k2 && well_formed state1 && well_formed state2);
+  let rec loop i =
+    if i = 0 then
+      true
+    else
+      let i = i - 1 in
+      (TerminalSet.equal toksr1.(i) toksr2.(i)) && (loop i)
+  in
+  loop (Array.length toksr1)
+
+(* Subsumption between states. *)
+
+let subsume ((k1, toksr1) as state1) ((k2, toksr2) as state2) =
+  assert (k1 = k2 && well_formed state1 && well_formed state2);
+  let rec loop i =
+    if i = 0 then
+      true
+    else
+      let i = i - 1 in
+      (TerminalSet.subset toksr1.(i) toksr2.(i)) && (loop i)
+  in
+  loop (Array.length toksr1)
+
+(* This function determines whether two (core-equivalent) states are
+   compatible, according to a criterion that is close to Pager's weak
+   compatibility criterion.
+
+   Pager's criterion guarantees that if a merged state has a potential
+   conflict at [(i, j)] -- that is, some token [t] appears within the
+   lookahead sets of both item [i] and item [j] -- then there exists a
+   state in the canonical automaton that also has a potential conflict
+   at [(i, j)] -- that is, some token [u] appears within the lookahead
+   sets of both item [i] and item [j]. Note that [t] and [u] can be
+   distinct.
+
+   Pager has shown that his weak compatibility criterion is stable,
+   that is, preserved by transitions and closure. This means that, if
+   two states can be merged, then so can their successors. This is
+   important, because merging two states means committing to merging
+   their successors, even though we have not even built these
+   successors yet.
+
+   The criterion used here is a slightly more restrictive version of
+   Pager's criterion, which guarantees equality of the tokens [t] and
+   [u]. This is done essentially by applying Pager's original
+   criterion on a token-wise basis. Pager's original criterion states
+   that two states can be merged if the new state has no conflict or
+   one of the original states has a conflict. Our more restrictive
+   criterion states that two states can be merged if, for every token
+   [t], the new state has no conflict at [t] or one of the original
+   states has a conflict at [t].
+
+   This modified criterion is also stable. My experiments show that it
+   is almost as effective in practice: out of more than a hundred
+   real-world sample grammars, only one automaton was affected, and
+   only one extra state appeared as a result of using the modified
+   criterion. Its advantage is to potentially make conflict
+   explanations easier: if there appears to be a conflict at [t], then
+   some conflict at [t] can be explained. This was not true when using
+   Pager's original criterion. *)
+
+let compatible (k1, toksr1) (k2, toksr2) =
+  assert (k1 = k2);
+  let n = Array.length toksr1 in
+  (* Two states are compatible if and only if they are compatible
+     at every pair (i, j), where i and j are distinct. *)
+  let rec loopi i =
+    if i = n then
+      true
+    else
+      let toksr1i = toksr1.(i)
+      and toksr2i = toksr2.(i) in
+      let rec loopj j =
+       if j = i then
+         true
+       else
+         let toksr1j = toksr1.(j)
+         and toksr2j = toksr2.(j) in
+
+         (* The two states are compatible at (i, j) if every conflict
+            token in the merged state already was a conflict token in
+            one of the two original states. This could be written as
+            follows:
+
+            TerminalSet.subset
+             (TerminalSet.inter (TerminalSet.union toksr1i toksr2i) (TerminalSet.union toksr1j toksr2j))
+             (TerminalSet.union (TerminalSet.inter toksr1i toksr1j) (TerminalSet.inter toksr2i toksr2j))
+
+            but is easily seen (on paper) to be equivalent to:
+
+          *)
+
+            TerminalSet.subset
+              (TerminalSet.inter toksr2i toksr1j)
+              (TerminalSet.union toksr1i toksr2j)
+         &&
+            TerminalSet.subset
+              (TerminalSet.inter toksr1i toksr2j)
+              (TerminalSet.union toksr2i toksr1j)
+         &&
+            loopj (j+1)
+      in
+      loopj 0 && loopi (i+1)
+  in
+  loopi 0
+
+(* This function determines whether two (core-equivalent) states can
+   be merged without creating an end-of-stream conflict, now or in the
+   future.
+
+   The rule is, if an item appears in one state with the singleton "#"
+   as its lookahead set, then its lookahead set in the other state
+   must contain "#".
+
+   So, either the second lookahead set is also the singleton "#", and
+   no end-of-stream conflict exists, or it is larger, and the second
+   state already contains an end-of-stream conflict.
+
+   Put another way, we do not want to merge two lookahead sets when one
+   contains "#" alone and the other does not contain "#".
+
+   I invented this rule to complement Pager's criterion. I believe,
+   but I am not 100% sure, that it does indeed prevent end-of-stream
+   conflicts and that it is stable.
+
+   Thanks to Sébastien Hinderer for reporting the bug caused by the
+   absence of this extra criterion. *)
+
+let eos_compatible  (k1, toksr1) (k2, toksr2) =
+  assert (k1 = k2);
+  let n = Array.length toksr1 in
+  let rec loop i =
+    if i = n then
+      true
+    else
+      let toks1 = toksr1.(i)
+      and toks2 = toksr2.(i) in
+      begin
+       if TerminalSet.mem Terminal.sharp toks1 && TerminalSet.cardinal toks1 = 1 then
+         (* "#" is alone in one set: it must be a member of the other set. *)
+         TerminalSet.mem Terminal.sharp toks2
+       else if TerminalSet.mem Terminal.sharp toks2 && TerminalSet.cardinal toks2 = 1 then
+         (* Symmetric condition. *)
+         TerminalSet.mem Terminal.sharp toks1
+       else
+         true
+      end
+      && loop (i+1)
+  in
+  loop 0
+
+(* This function determines whether two (core-equivalent) states can
+   be merged without creating spurious reductions on the [error]
+   token.
+
+   The rule is, we merge two states only if they agree on which
+   reductions are permitted on the [error] token.
+
+   Without this restriction, we might end up in a situation where we
+   decide to introduce an [error] token into the input stream and
+   perform a reduction, whereas a canonical LR(1) automaton,
+   confronted with the same input string, would fail normally -- that
+   is, it would introduce an [error] token into the input stream, but
+   it would not be able to perform a reduction right away: the current
+   state would be discarded.
+
+   In the interest of more accurate (or sane, or predictable) error
+   handling, I decided to introduce this restriction as of 20110124.
+   This will cause an increase in the size of automata for grammars
+   that use the [error] token. It might actually make the [error]
+   token somewhat easier to use.
+
+   Note that two sets can be in the subsumption relation and still
+   be error-incompatible. Error-compatibility requires equality of
+   the lookahead sets, restricted to [error].
+
+   Thanks to Didier Rémy for reporting a bug caused by the absence
+   of this extra criterion. *)
+
+let error_compatible  (k1, toksr1) (k2, toksr2) =
+  assert (k1 = k2);
+  let n = Array.length toksr1 in
+  let rec loop i =
+    if i = n then
+      true
+    else
+      let toks1 = toksr1.(i)
+      and toks2 = toksr2.(i) in
+      begin
+       if TerminalSet.mem Terminal.error toks1 then
+         (* [error] is a member of one set: it must be a member of the other set. *)
+         TerminalSet.mem Terminal.error toks2
+       else if TerminalSet.mem Terminal.error toks2 then
+         (* Symmetric condition. *)
+         TerminalSet.mem Terminal.error toks1
+       else
+         true
+      end
+      && loop (i+1)
+  in
+  loop 0
+
+(* Union of two states. The two states must have the same core. The
+   new state is obtained by pointwise union of the lookahead sets. *)
+
+let union (k1, toksr1) (k2, toksr2) =
+  assert (k1 = k2);
+  k1, Array.init (Array.length toksr1) (fun i ->
+    TerminalSet.union toksr1.(i) toksr2.(i)
+  )
+
+(* Restriction of a state to a set of tokens of interest. Every
+   lookahead set is intersected with that set. *)
+
+let restrict toks (k, toksr) =
+  k, Array.map (fun toksri ->
+    TerminalSet.inter toksri toks
+  ) toksr
+
diff --git a/bundles/menhirLib/menhir-20120123/src/lr0.mli b/bundles/menhirLib/menhir-20120123/src/lr0.mli
new file mode 100644 (file)
index 0000000..a2499b5
--- /dev/null
@@ -0,0 +1,127 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+open Grammar
+
+(* This module builds the LR(0) automaton associated with the grammar,
+   then provides access to it. It also provides facilities for
+   efficiently performing LR(1) constructions. *)
+
+(* ------------------------------------------------------------------------ *)
+(* The LR(0) automaton. *)
+
+(* The nodes of the LR(0) automaton are numbered. *)
+
+type node =
+    int
+
+(* This is the number of nodes in the LR(0) automaton. *)
+
+val n: int
+
+(* These are the automaton's entry states, indexed by the start productions. *)
+
+val entry: node ProductionMap.t
+
+(* A node can be converted to the underlying LR(0) set of items. This set is
+   not closed. *)
+
+val items: node -> Item.Set.t
+
+(* ------------------------------------------------------------------------ *)
+(* Help for building the LR(1) automaton. *)
+
+(* An LR(1) state is internally represented as a pair of an LR(0)
+   state number and an array of concrete lookahead sets (whose length
+   depends on the LR(0) state). *)
+
+type lr1state
+
+(* An encoded LR(1) state can be turned into a concrete representation,
+   that is, a mapping of items to concrete lookahead sets. *)
+
+type concretelr1state =
+    TerminalSet.t Item.Map.t
+
+val export: lr1state -> concretelr1state
+
+(* One can take the closure of a concrete LR(1) state. *)
+
+val closure: concretelr1state -> concretelr1state
+
+(* The core of an LR(1) state is the underlying LR(0) state. *)
+
+val core: lr1state -> node
+
+(* One can create an LR(1) start state out of an LR(0) start
+   node. *)
+val start: node -> lr1state
+
+(* Information about the transitions and reductions at a state. *)
+
+val transitions: lr1state -> lr1state SymbolMap.t
+val outgoing_symbols: node -> Symbol.t list
+val transition: Symbol.t -> lr1state -> lr1state
+
+val reductions: lr1state -> (TerminalSet.t * Production.index) list
+
+(* Equality of states. The two states must have the same core. Then,
+   they are equal if and only if their lookahead sets are pointwise
+   equal. *)
+
+val equal: lr1state -> lr1state -> bool
+
+(* Subsumption between states. The two states must have the same
+   core. Then, one subsumes the other if and only if their lookahead
+   sets are (pointwise) in the subset relation. *)
+
+val subsume: lr1state -> lr1state -> bool
+
+(* A slightly modified version of Pager's weak compatibility
+   criterion. The two states must have the same core. *)
+
+val compatible: lr1state -> lr1state -> bool
+
+(* This function determines whether two (core-equivalent) states can
+   be merged without creating an end-of-stream conflict. *)
+
+val eos_compatible: lr1state -> lr1state -> bool
+
+(* This function determines whether two (core-equivalent) states can
+   be merged without creating spurious reductions on the [error]
+   token. *)
+
+val error_compatible: lr1state -> lr1state -> bool
+
+(* Union of two states. The two states must have the same core. The
+   new state is obtained by pointwise union of the lookahead sets. *)
+
+val union: lr1state -> lr1state -> lr1state
+
+(* Restriction of a state to a set of tokens of interest. Every
+   lookahead set is intersected with that set. *)
+
+val restrict: TerminalSet.t -> lr1state -> lr1state
+
+(* Displaying a concrete state. *)
+
+val print_concrete: concretelr1state -> string
+
+(* Displaying a state. By default, only the kernel is displayed, not
+   the closure. *)
+
+val print: lr1state -> string
+val print_closure: lr1state -> string
+
diff --git a/bundles/menhirLib/menhir-20120123/src/lr1.ml b/bundles/menhirLib/menhir-20120123/src/lr1.ml
new file mode 100644 (file)
index 0000000..b872197
--- /dev/null
@@ -0,0 +1,1044 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+open Grammar
+
+(* This module constructs an LR(1) automaton by following Pager's method, that
+   is, by merging states on the fly when they are weakly compatible. *)
+
+(* ------------------------------------------------------------------------ *)
+(* Nodes. *)
+
+type node = {
+
+    (* A node number, assigned during construction. *)
+
+    raw_number: int;
+
+    (* A node number, assigned after conflict resolution has taken
+       place and after inacessible nodes have been removed. This
+       yields sequential numbers, from the client's point of view. *)
+
+    mutable number: int;
+
+    (* Each node is associated with a state. This state can change
+       during construction as nodes are merged. *)
+
+    mutable state: Lr0.lr1state;
+
+    (* Each node carries information about its outgoing transitions
+       and about its reductions. *)
+
+    mutable transitions: node SymbolMap.t;
+    mutable reductions: Production.index list TerminalMap.t;
+
+    (* Tokens for which there are several possible behaviors are
+       conflict tokens. *)
+
+    mutable conflict_tokens: TerminalSet.t;
+
+    (* Transitions are also stored in reverse, so as to allow reverse
+       traversals of the automaton. *)
+
+    mutable predecessors: node list;
+
+    (* If a node has any incoming transitions, then they all carry
+       the same symbol. This is it. *)
+
+    mutable incoming_symbol: Symbol.t option;
+
+    (* Transient marks are used during construction and traversal. *)
+
+    mutable mark: Mark.t;
+
+    (* (New as of 2012/01/23.) This flag records whether a shift/reduce
+       conflict in this node was solved in favor of neither (%nonassoc).
+       This is later used to forbid a default reduction at this node. *)
+
+    mutable forbid_default_reduction: bool;
+
+  }
+
+module Node = struct
+  type t = node
+  let compare node1 node2 =
+    node1.number - node2.number
+end
+
+module NodeSet =
+  Set.Make (Node)
+
+module NodeMap =
+  Map.Make (Node)
+
+(* ------------------------------------------------------------------------ *)
+
+(* Output debugging information if [--follow-construction] is enabled. *)
+
+let follow_transition (again : bool) (source : node) (symbol : Symbol.t) (state : Lr0.lr1state) =
+  if Settings.follow then
+    Printf.fprintf stderr
+      "%s transition out of state r%d along symbol %s.\nProposed target state:\n%s"
+      (if again then "Re-examining" else "Examining")
+      source.raw_number
+      (Symbol.print symbol)
+      (Lr0.print_closure state)
+
+let follow_state (msg : string) (node : node) (print : bool) =
+  if Settings.follow then
+    Printf.fprintf stderr
+      "%s: r%d.\n%s\n"
+      msg
+      node.raw_number
+      (if print then Lr0.print_closure node.state else "")
+
+(* ------------------------------------------------------------------------ *)
+
+(* The following two mutually recursive functions are invoked when the state
+   associated with an existing node grows. The node's descendants are examined
+   and grown into a fixpoint is reached.
+
+   This work is performed in an eager manner: we do not attempt to build any
+   new transitions until all existing nodes have been suitably grown. Indeed,
+   building new transitions requires making merging decisions, and such
+   decisions cannot be made on a sound basis unless all existing nodes have
+   been suitably grown. Otherwise, one could run into a dead end where two
+   successive, incompatible merging decisions are made, because the
+   consequences of the first decision (growing descendant nodes) were not made
+   explicit before the second decision was taken. This was a bug in versions
+   of Menhir ante 20070520.
+
+   Although I wrote this code independently, I later found out that it seems
+   quite similar to the code in Karl Schimpf's Ph.D. thesis (1981), page 35.
+
+   It is necessary that all existing transitions be explicit before the [grow]
+   functions are called. In other words, if it has been decided that there will
+   be a transition from [node1] to [node2], then [node1.transitions] must be
+   updated before [grow] is invoked. *)
+
+(* [grow node state] grows the existing node [node], if necessary, so that its
+   associated state subsumes [state]. If this represents an actual (strict)
+   growth, then [node]'s descendants are grown as well. *)
+
+let rec grow node state =
+  if Lr0.subsume state node.state then
+    follow_state "Target state is unaffected" node false
+   else begin
+
+     (* In versions of Menhir prior to June 2008, I wrote this:
+
+         If I know what I am doing, then the new state that is being
+         merged into the existing state should be compatible, in
+         Pager's sense, with the existing node. In other words,
+         compatibility should be preserved through transitions.
+
+        and the code contained this assertion:
+
+         assert (Lr0.compatible state node.state);
+         assert (Lr0.eos_compatible state node.state);
+
+       However, this was wrong. See, for instance, the sample grammars
+       cocci.mly and boris-mini.mly. The problem is particularly clearly
+       apparent in boris-mini.mly, where it only involves inclusion of
+       states -- the definition of Pager's weak compatibility does not
+       enter the picture. Here is, roughly, what is going on.
+
+       Assume we have built some state A, which, along some symbol S,
+       has a transition to itself. This means, in fact, that computing
+       the successor of A along S yields a *subset* of A, that is,
+       succ(A, S) <= A.
+
+       Then, we wish to build a new state A', which turns out to be a
+       superset of A, so we decide to grow A. (The fact that A is a
+       subset of A' implies that A and A' are Pager-compatible.) As
+       per the code below, we immediately update the state A in place,
+       to become A'. Then, we inspect the transition along symbol S.
+       We find that the state succ(A', S) must be merged into A'.
+
+       In this situation, the assertions above require succ(A', S)
+       to be compatible with A'. However, this is not necessarily
+       the case. By monotonicity of succ, we do have succ(A, S) <=
+       succ(A', S). But nothing says that succ(A', S) are related
+       with respect to inclusion, or even Pager-compatible. The
+       grammar in boris-mini.mly shows that they are not.
+
+     *)
+
+    (* Grow [node]. *)
+
+    node.state <- Lr0.union state node.state;
+    follow_state "Growing existing state" node true;
+
+    (* Grow [node]'s successors. *)
+
+    grow_successors node
+
+  end
+
+(* [grow_successors node] grows [node]'s successors. *)
+
+(* Note that, if there is a cycle in the graph, [grow_successors] can be
+   invoked several times at a single node [node], with [node.state] taking on
+   a new value every time. In such a case, this code should be correct,
+   although probably not very efficient. *)
+
+and grow_successors node =
+  SymbolMap.iter (fun symbol (successor_node : node) ->
+    let successor_state = Lr0.transition symbol node.state in
+    follow_transition true node symbol successor_state;
+    grow successor_node successor_state
+  ) node.transitions
+
+(* ------------------------------------------------------------------------ *)
+
+(* Data structures maintained during the construction of the automaton. *)
+
+(* A queue of pending nodes, whose outgoing transitions have not yet
+   been built. *)
+
+let queue : node Queue.t =
+  Queue.create()
+
+(* A mapping of LR(0) node numbers to lists of nodes. This allows us to
+   efficiently find all existing nodes that are core-compatible with a
+   newly found state. *)
+
+let map : node list array =
+  Array.create Lr0.n []
+
+(* A counter that allows assigning raw numbers to nodes. *)
+
+let num =
+  ref 0
+
+(* ------------------------------------------------------------------------ *)
+
+(* [create state] creates a new node that stands for the state [state].
+   It is expected that [state] does not subsume, and is not subsumed by,
+   any existing state. *)
+
+let create (state : Lr0.lr1state) : node =
+
+  (* Allocate a new node. *)
+
+  let node = {
+    state = state;
+    transitions = SymbolMap.empty;
+    reductions = TerminalMap.empty;
+    conflict_tokens = TerminalSet.empty;
+    raw_number = Misc.postincrement num;
+    number = 0; (* temporary placeholder *)
+    mark = Mark.none;
+    predecessors = [];
+    incoming_symbol = None;
+    forbid_default_reduction = false;
+  } in
+
+  (* Update the mapping of LR(0) cores to lists of nodes. *)
+
+  let k = Lr0.core state in
+  assert (k < Lr0.n);
+  map.(k) <- node :: map.(k);
+
+  (* Enqueue this node for further examination. *)
+
+  Queue.add node queue;
+
+  (* Debugging output. *)
+
+  follow_state "Creating a new state" node false;
+
+  (* Return the freshly created node. *)
+
+  node
+
+(* ------------------------------------------------------------------------ *)
+
+(* Materializing a transition turns its target state into a (fresh or
+   existing). There are three scenarios: the proposed new state can be
+   subsumed by an existing state, compatible with an existing state, or
+   neither. *)
+
+exception Subsumed of node
+
+exception Compatible of node
+
+let materialize (source : node) (symbol : Symbol.t) (target : Lr0.lr1state) : unit =
+  try
+
+    (* Debugging output. *)
+
+    follow_transition false source symbol target;
+
+    (* Find all existing core-compatible states. *)
+
+    let k = Lr0.core target in
+    assert (k < Lr0.n);
+    let similar = map.(k) in
+
+    (* Check whether one of these states subsumes the candidate new state. If
+       so, there is no need to create a new node: just reuse the existing
+       one. *)
+
+    (* 20110124: require error compatibility in addition to subsumption. *)
+
+    List.iter (fun node ->
+      if Lr0.subsume target node.state &&
+         Lr0.error_compatible target node.state then
+       raise (Subsumed node)
+    ) similar;
+
+    (* Check whether one of the existing states is compatible, in Pager's
+       sense, with the new state. If so, there is no need to create a new
+       state: just merge the new state into the existing one. *)
+
+    (* 20110124: require error compatibility in addition to the existing
+       compatibility criteria. *)
+
+    if Settings.pager then
+      List.iter (fun node ->
+       if Lr0.compatible target node.state &&
+          Lr0.eos_compatible target node.state &&
+          Lr0.error_compatible target node.state then
+         raise (Compatible node)
+      ) similar;
+
+    (* Both of the above checks have failed. Create a new node. Two states
+       that are in the subsumption relation are also compatible. This implies
+       that the newly created node does not subsume any existing states. *)
+
+    source.transitions <- SymbolMap.add symbol (create target) source.transitions
+
+  with
+
+  | Subsumed node ->
+
+      (* Join an existing target node. *)
+
+      follow_state "Joining existing state" node false;
+      source.transitions <- SymbolMap.add symbol node source.transitions
+
+  | Compatible node ->
+
+      (* Join and grow an existing target node. It seems important that the
+        new transition is created before [grow_successors] is invoked, so
+        that all transition decisions made so far are explicit. *)
+
+      node.state <- Lr0.union target node.state;
+      follow_state "Joining and growing existing state (Pager says, fine)" node true;
+      source.transitions <- SymbolMap.add symbol node source.transitions;
+      grow_successors node
+
+(* ------------------------------------------------------------------------ *)
+
+(* The actual construction process. *)
+
+(* Populate the queue with the start nodes and store them in an array. *)
+
+let entry : node ProductionMap.t =
+  ProductionMap.map (fun (k : Lr0.node) ->
+    create (Lr0.start k)
+  ) Lr0.entry
+
+(* Pick a node in the queue, that is, a node whose transitions have not yet
+   been built. Build these transitions, and continue. *)
+
+(* Note that building a transition can cause existing nodes to grow, so
+   [node.state] is not necessarily invariant throughout the inner loop. *)
+
+let () =
+  Misc.qiter (fun node ->
+    List.iter (fun symbol ->
+      materialize node symbol (Lr0.transition symbol node.state)
+    ) (Lr0.outgoing_symbols (Lr0.core node.state))
+  ) queue
+
+(* Record how many nodes were constructed. *)
+
+let n =
+  !num
+
+let () =
+  Error.logA 1 (fun f -> Printf.fprintf f "Built an LR(1) automaton with %d states.\n" !num)
+
+(* ------------------------------------------------------------------------ *)
+(* We now perform one depth-first traversal of the automaton,
+   recording predecessor edges, numbering nodes, sorting nodes
+   according to their incoming symbol, building reduction tables, and
+   finding out which nodes have conflicts. *)
+
+(* A count of all nodes. *)
+
+let () =
+  num := 0
+
+(* A list of all nodes. *)
+
+let nodes : node list ref =
+  ref []
+
+(* A list of nodes with conflicts. *)
+
+let conflict_nodes : node list ref =
+  ref []
+
+(* Counts of nodes with shift/reduce and reduce/reduce conflicts. *)
+
+let shift_reduce =
+  ref 0
+
+let reduce_reduce =
+  ref 0
+
+(* Count of the shift/reduce conflicts that could be silently
+   resolved. *)
+
+let silently_solved =
+  ref 0
+
+(* A mapping of symbols to lists of nodes that admit this incoming
+   symbol. *)
+
+let incoming : node list SymbolMap.t ref =
+  ref SymbolMap.empty
+
+(* Go ahead. *)
+
+let () =
+
+  let marked = Mark.fresh() in
+
+  let rec visit node =
+    if not (Mark.same node.mark marked) then begin
+      node.mark <- marked;
+      nodes := node :: !nodes;
+
+      (* Number this node. *)
+
+      let number = !num in
+      num := number + 1;
+      node.number <- number;
+
+      (* Insertion of a new reduce action into the table of reductions. *)
+
+      let addl prod tok reductions =
+       let prods =
+         try
+           TerminalMap.lookup tok reductions
+         with Not_found ->
+           []
+       in
+       TerminalMap.add tok (prod :: prods) reductions
+      in
+
+      (* Build the reduction table. Here, we gather all potential
+         reductions, without attempting to solve shift/reduce
+         conflicts on the fly, because that would potentially hide
+         shift/reduce/reduce conflicts, which we want to be aware
+         of. *)
+
+      let reductions =
+       List.fold_left (fun reductions (toks, prod) ->
+         TerminalSet.fold (addl prod) toks reductions
+        ) TerminalMap.empty (Lr0.reductions node.state)
+      in
+
+      (* Detect conflicts. Attempt to solve shift/reduce conflicts
+        when unambiguously allowed by priorities. *)
+
+      let has_shift_reduce = ref false
+      and has_reduce_reduce = ref false in
+
+      node.reductions <-
+       TerminalMap.fold (fun tok prods reductions ->
+         if SymbolMap.mem (Symbol.T tok) node.transitions then begin
+
+           (* There is a transition in addition to the reduction(s). We
+              have (at least) a shift/reduce conflict. *)
+
+           assert (not (Terminal.equal tok Terminal.sharp));
+           match prods with
+           | [] ->
+               assert false
+           | [ prod ] ->
+               begin
+
+                 (* This is a single shift/reduce conflict. If priorities tell
+                    us how to solve it, we follow that and modify the automaton. *)
+
+                 match Precedence.shift_reduce tok prod with
+
+                 | Precedence.ChooseShift ->
+
+                     (* Suppress the reduce action. *)
+
+                     incr silently_solved;
+                     reductions
+
+                 | Precedence.ChooseReduce ->
+
+                     (* Record the reduce action and suppress the shift transition.
+                        The automaton is modified in place. This can have the subtle
+                        effect of making some nodes unreachable. Any conflicts in these
+                        nodes will then be ignored (as they should be). *)
+
+                     incr silently_solved;
+                     node.transitions <- SymbolMap.remove (Symbol.T tok) node.transitions;
+                     TerminalMap.add tok prods reductions
+
+                 | Precedence.ChooseNeither ->
+
+                     (* Suppress the reduce action and the shift transition. *)
+
+                     incr silently_solved;
+                     node.transitions <- SymbolMap.remove (Symbol.T tok) node.transitions;
+                     node.forbid_default_reduction <- true;
+                     reductions
+
+                 | Precedence.DontKnow ->
+
+                     (* Priorities don't allow concluding. Record the
+                        existence of a shift/reduce conflict. *)
+
+                     node.conflict_tokens <- Grammar.TerminalSet.add tok node.conflict_tokens;
+                     has_shift_reduce := true;
+                     TerminalMap.add tok prods reductions
+
+               end
+
+           | prod1 :: prod2 :: _ ->
+
+               (* This is a shift/reduce/reduce conflict. If the priorities
+                  are such that each individual shift/reduce conflict is solved
+                  in favor of shifting or in favor of neither, then solve the entire
+                  composite conflict in the same way. Otherwise, report the conflict. *)
+
+               let choices = List.map (Precedence.shift_reduce tok) prods in
+
+               if List.for_all (fun choice ->
+                 match choice with
+                 | Precedence.ChooseShift -> true
+                 | _ -> false
+                ) choices then begin
+
+                 (* Suppress the reduce action. *)
+
+                 silently_solved := !silently_solved + List.length prods;
+                 reductions
+
+               end
+               else if List.for_all (fun choice ->
+                 match choice with
+                 | Precedence.ChooseNeither -> true
+                 | _ -> false
+                ) choices then begin
+
+                 (* Suppress the reduce action and the shift transition. *)
+
+                 silently_solved := !silently_solved + List.length prods;
+                 node.transitions <- SymbolMap.remove (Symbol.T tok) node.transitions;
+                 reductions
+
+               end
+               else begin
+
+                 (* Record a shift/reduce/reduce conflict. Keep all reductions. *)
+
+                 node.conflict_tokens <- Grammar.TerminalSet.add tok node.conflict_tokens;
+                 has_shift_reduce := true;
+                 has_reduce_reduce := true;
+                 TerminalMap.add tok prods reductions
+
+               end
+
+         end
+         else
+           let () = 
+             match prods with
+             | []
+             | [ _ ] ->
+                 ()
+             | prod1 :: prod2 :: _ ->
+
+                 (* There is no transition in addition to the reduction(s). We
+                    have a pure reduce/reduce conflict. Do nothing about it at
+                    this point. *)
+
+                 node.conflict_tokens <- Grammar.TerminalSet.add tok node.conflict_tokens;
+                 has_reduce_reduce := true
+
+           in
+           TerminalMap.add tok prods reductions
+
+      ) reductions TerminalMap.empty;
+
+      (* Record statistics about conflicts. *)
+
+      if not (TerminalSet.is_empty node.conflict_tokens) then begin
+       conflict_nodes := node :: !conflict_nodes;
+       if !has_shift_reduce then
+         incr shift_reduce;
+       if !has_reduce_reduce then
+         incr reduce_reduce
+      end;
+
+      (* Continue the depth-first traversal. Record predecessors edges
+         as we go. No ancestor appears twice in a list of
+         predecessors, because two nodes cannot be related by two
+         edges that carry distinct symbols. *)
+
+      SymbolMap.iter (fun symbol son ->
+        begin
+         match son.incoming_symbol with
+         | None ->
+             son.incoming_symbol <- Some symbol;
+             let others =
+               try
+                 SymbolMap.find symbol !incoming
+               with Not_found ->
+                 []
+             in
+             incoming := SymbolMap.add symbol (son :: others) !incoming
+         | Some symbol' ->
+             assert (Symbol.equal symbol symbol')
+       end;
+       son.predecessors <- node :: son.predecessors;
+       visit son
+      ) node.transitions
+    end
+  in
+  
+  ProductionMap.iter (fun _ node -> visit node) entry
+
+let nodes =
+  List.rev !nodes (* list is now sorted by increasing node numbers *)
+
+let conflict_nodes =
+  !conflict_nodes
+
+let incoming =
+  !incoming
+
+let () =
+  if !silently_solved = 1 then
+    Error.logA 1 (fun f -> Printf.fprintf f "One shift/reduce conflict was silently solved.\n")
+  else if !silently_solved > 1 then
+    Error.logA 1 (fun f -> Printf.fprintf f "%d shift/reduce conflicts were silently solved.\n" !silently_solved);
+  if !num < n then
+    Error.logA 1 (fun f -> Printf.fprintf f "Only %d states remain after resolving shift/reduce conflicts.\n" !num)
+
+let () =
+  Grammar.diagnostics()
+
+let n =
+  !num
+
+let forbid_default_reduction node =
+  node.forbid_default_reduction
+
+(* ------------------------------------------------------------------------ *)
+(* Breadth-first iteration over all nodes. *)
+
+let bfs =
+  let module B = Breadth.Make (struct
+    type vertex = node
+    type label = Symbol.t
+    let set_mark node m = node.mark <- m
+    let get_mark node = node.mark
+    let entry f = ProductionMap.iter (fun _ node -> f node) entry
+    let successors f node = SymbolMap.iter f node.transitions
+  end) in
+  B.search
+
+(* ------------------------------------------------------------------------ *)
+(* Iteration over all nodes. *)
+
+let fold f accu =
+  List.fold_left f accu nodes
+
+let iter f =
+  fold (fun () node -> f node) ()
+
+let map f =
+  List.map f nodes
+
+let foldx f =
+  fold (fun accu node ->
+          match node.incoming_symbol with
+            | None -> accu
+            | Some _ -> f accu node)
+
+let iterx f =
+  iter (fun node -> 
+    match node.incoming_symbol with 
+      | None -> () 
+      | Some _ -> f node)
+(* -------------------------------------------------------------------------- *)
+(* Our output channel. *)
+
+let out =
+  lazy (open_out (Settings.base ^ ".automaton"))
+
+(* ------------------------------------------------------------------------ *)
+(* If requested, dump a verbose description of the automaton. *)
+
+let () =
+  Time.tick "Construction of the LR(1) automaton";
+  if Settings.dump then begin
+    fold (fun () node ->
+      let out = Lazy.force out in
+      Printf.fprintf out "State %d%s:\n%s"
+       node.number
+       (if Settings.follow then Printf.sprintf " (r%d)" node.raw_number else "")
+       (Lr0.print node.state);
+      SymbolMap.iter (fun symbol node ->
+       Printf.fprintf out "-- On %s shift to state %d\n"
+         (Symbol.print symbol) node.number
+      ) node.transitions;
+      TerminalMap.iter (fun tok prods ->
+       List.iter (fun prod ->
+         (* TEMPORARY factoriser les symboles qui conduisent a reduire une meme production *)
+         Printf.fprintf out "-- On %s " (Terminal.print tok);
+         match Production.classify prod with
+         | Some nt ->
+             Printf.fprintf out "accept %s\n" (Nonterminal.print false nt)
+         | None ->
+             Printf.fprintf out "reduce production %s\n" (Production.print prod)
+       ) prods
+      ) node.reductions;
+      if not (TerminalSet.is_empty node.conflict_tokens) then
+       Printf.fprintf out "** Conflict on %s\n" (TerminalSet.print node.conflict_tokens);
+      Printf.fprintf out "\n%!"
+    ) ();
+    Time.tick "Dumping the LR(1) automaton"
+  end
+
+(* ------------------------------------------------------------------------ *)
+(* [reverse_dfs goal] performs a reverse depth-first search through
+   the automaton, starting at node [goal], and marking the nodes
+   traversed. It returns a function that tells whether a node is
+   marked, that is, whether a path leads from that node to the goal
+   node. *)
+
+let reverse_dfs goal =
+
+  let mark = Mark.fresh() in
+
+  let marked node =
+    Mark.same node.mark mark
+  in
+
+  let rec visit node =
+     if not (marked node) then begin
+       node.mark <- mark;
+       List.iter visit node.predecessors
+     end
+  in
+
+  visit goal;
+  marked
+
+(* ------------------------------------------------------------------------ *)
+(* Iterating over all nodes that are targets of edges carrying a
+   certain symbol. The sources of the corresponding edges are also
+   provided. *)
+
+let targets f accu symbol =
+  let targets =
+    try
+      SymbolMap.find symbol incoming
+    with Not_found ->
+      (* There are no incoming transitions on the start symbols. *)
+      []
+  in
+  List.fold_left (fun accu target ->
+    f accu target.predecessors target
+  ) accu targets
+
+(* ------------------------------------------------------------------------ *)
+(* Converting a start node into the single item that it contains. *)
+
+let start2item node =
+  let state : Lr0.lr1state = node.state in
+  let core : Lr0.node = Lr0.core state in
+  let items : Item.Set.t = Lr0.items core in
+  assert (Item.Set.cardinal items = 1);
+  Item.Set.choose items
+
+(* ------------------------------------------------------------------------ *)
+(* Accessors. *)
+
+let number node =
+  node.number
+
+let state node =
+  node.state
+
+let transitions node =
+  node.transitions
+
+let reductions node =
+  node.reductions
+
+let conflicts f =
+  List.iter (fun node ->
+    f node.conflict_tokens node
+  ) conflict_nodes
+
+let incoming_symbol node =
+  node.incoming_symbol
+
+let predecessors node =
+  node.predecessors
+
+(* ------------------------------------------------------------------------ *)
+
+(* This inverts a mapping of tokens to productions into a mapping of
+   productions to sets of tokens. *)
+
+(* This is needed, in [CodeBackend], to avoid producing two (or more)
+   separate branches that call the same [reduce] function. Instead,
+   we generate just one branch, guarded by a [POr] pattern. *)
+
+let invert reductions : TerminalSet.t ProductionMap.t =
+  TerminalMap.fold (fun tok prods inverse ->
+    let prod = Misc.single prods in
+    let toks =
+      try
+       ProductionMap.lookup prod inverse
+      with Not_found ->
+       TerminalSet.empty
+    in
+    ProductionMap.add prod (TerminalSet.add tok toks) inverse
+  ) reductions ProductionMap.empty
+    
+(* ------------------------------------------------------------------------ *)
+(* Computing which terminal symbols a state is willing to act upon.
+
+   This function is currently unused, but could be used as part of an error
+   reporting system.
+
+   One must keep in mind that, due to the merging of states, a state might be
+   willing to perform a reduction on a certain token, yet the reduction can
+   take us to another state where this token causes an error. In other words,
+   the set of terminal symbols that is computed here is really an
+   over-approximation of the set of symbols that will not cause an error. And
+   there seems to be no way of performing an exact computation, as we would
+   need to know not only the current state, but the contents of the stack as
+   well. *)
+
+let acceptable_tokens (s : node) =
+
+  (* If this state is willing to act on the error token, ignore it -- we do
+     not wish to report that an error would be accepted in this state :-) *)
+
+  let transitions =
+    SymbolMap.remove (Symbol.T Terminal.error) (transitions s)
+  and reductions =
+    TerminalMap.remove Terminal.error (reductions s)
+  in
+
+  (* Accumulate the tokens carried by outgoing transitions. *)
+
+  let covered =
+    SymbolMap.fold (fun symbol _ covered ->
+      match symbol with
+      | Symbol.T tok ->
+         TerminalSet.add tok covered
+      | Symbol.N _ ->
+         covered
+    ) transitions TerminalSet.empty
+  in
+
+  (* Accumulate the tokens that permit reduction. *)
+
+  let covered =
+    ProductionMap.fold (fun _ toks covered ->
+      TerminalSet.union toks covered
+    ) (invert reductions) covered
+  in
+
+  (* That's it. *)
+
+  covered
+
+(* ------------------------------------------------------------------------ *)
+(* Report statistics. *)
+
+(* Produce the reports. *)
+
+let () =
+  if !shift_reduce = 1 then
+    Error.grammar_warning [] "one state has shift/reduce conflicts."
+  else if !shift_reduce > 1 then
+    Error.grammar_warning [] (Printf.sprintf "%d states have shift/reduce conflicts." !shift_reduce);
+  if !reduce_reduce = 1 then
+    Error.grammar_warning [] "one state has reduce/reduce conflicts."
+  else if !reduce_reduce > 1 then
+    Error.grammar_warning [] (Printf.sprintf "%d states have reduce/reduce conflicts." !reduce_reduce)
+
+(* There is a global check for errors at the end of [Invariant], so we do
+   not need to check & stop here. *)
+
+(* ------------------------------------------------------------------------ *)
+(* When requested by the code generator, apply default conflict
+   resolution to ensure that the automaton is deterministic. *)
+
+(* [best prod prods] chooses which production should be reduced
+   among the list [prod :: prods]. It fails if no best choice
+   exists. *)
+
+let rec best choice = function
+  | [] ->
+      choice
+  | prod :: prods ->
+      match Precedence.reduce_reduce choice prod with
+      | Some choice ->
+         best choice prods
+      | None ->
+         Error.signal
+           (Production.positions choice @ Production.positions prod)
+           (Printf.sprintf
+              "will not resolve reduce/reduce conflict between\n\
+                productions that originate in distinct source files:\n%s\n%s"
+                  (Production.print choice)
+                  (Production.print prod));
+         choice (* dummy *)
+
+(* Go ahead. *)
+
+let default_conflict_resolution () =
+
+  let shift_reduce =
+    ref 0
+  and reduce_reduce =
+    ref 0
+  in
+
+  List.iter (fun node ->
+
+    node.reductions <-
+      TerminalMap.fold (fun tok prods reductions ->
+       try
+         let (_ : node) =
+           SymbolMap.find (Symbol.T tok) node.transitions
+         in
+         (* There is a transition at this symbol, so this
+            is a (possibly multiway) shift/reduce conflict.
+            Resolve in favor of shifting by suppressing all
+            reductions. *)
+         shift_reduce := List.length prods + !shift_reduce;
+          reductions
+       with Not_found ->
+         (* There is no transition at this symbol. Check
+            whether we have multiple reductions. *)
+         match prods with
+         | [] ->
+             assert false
+         | [ _ ] ->
+             TerminalMap.add tok prods reductions
+         | prod :: ((_ :: _) as prods) ->
+             (* We have a reduce/reduce conflict. Resolve, if
+                possible, in favor of a single reduction.
+                This reduction must be preferrable to each
+                of the others. *)
+             reduce_reduce := List.length prods + !reduce_reduce;
+             TerminalMap.add tok [ best prod prods ] reductions
+
+      ) node.reductions TerminalMap.empty
+
+  ) conflict_nodes;
+
+  if !shift_reduce = 1 then
+    Error.warning [] "one shift/reduce conflict was arbitrarily resolved."
+  else if !shift_reduce > 1 then
+    Error.warning [] (Printf.sprintf "%d shift/reduce conflicts were arbitrarily resolved." !shift_reduce);
+  if !reduce_reduce = 1 then
+    Error.warning [] "one reduce/reduce conflict was arbitrarily resolved."
+  else if !reduce_reduce > 1 then
+    Error.warning [] (Printf.sprintf "%d reduce/reduce conflicts were arbitrarily resolved." !reduce_reduce);
+
+  (* Now, ensure that states that have a reduce action at the
+     pseudo-token "#" have no other action. *)
+
+  let ambiguities =
+    ref 0
+  in
+
+  fold (fun () node ->
+    
+    try
+      let prods, reductions = TerminalMap.lookup_and_remove Terminal.sharp node.reductions in
+      let prod = Misc.single prods in
+
+      (* This node has a reduce action at "#". Determine whether there
+        exist other actions. If there exist any other actions,
+        suppress this reduce action, and signal an ambiguity.
+
+        We signal an ambiguity even in the case where all actions at
+        this node call for reducing a single production. Indeed, in
+        that case, even though we know that this production must be
+        reduced, we do not know whether we should first discard the
+        current token (and call the lexer). *)
+
+      let has_ambiguity = ref false in
+      let toks = ref TerminalSet.empty in
+
+      TerminalMap.iter (fun tok prods ->
+       node.reductions <- reductions;
+       has_ambiguity := true;
+       toks := TerminalSet.add tok !toks
+      ) reductions;
+
+      SymbolMap.iter (fun symbol _ ->
+       match symbol with
+       | Symbol.N _ ->
+           ()
+       | Symbol.T tok ->
+           node.reductions <- reductions;
+           has_ambiguity := true;
+           toks := TerminalSet.add tok !toks
+      ) node.transitions;
+
+      if !has_ambiguity then begin
+       incr ambiguities;
+       if Settings.dump then begin
+         Printf.fprintf (Lazy.force out)
+           "State %d has an end-of-stream conflict. There is a tension between\n\
+            (1) %s\n\
+            without even requesting a lookahead token, and\n\
+            (2) checking whether the lookahead token is %s%s,\n\
+             which would require some other action.\n\n"
+            (number node)
+            (match Production.classify prod with
+           | Some nt ->
+               Printf.sprintf "accepting %s" (Nonterminal.print false nt)
+           | None ->
+               Printf.sprintf "reducing production %s" (Production.print prod))
+            (if TerminalSet.cardinal !toks > 1 then "one of " else "")
+            (TerminalSet.print !toks)
+       end
+      end
+
+    with Not_found ->
+      ()
+
+  ) ();
+
+  if !ambiguities = 1 then
+    Error.grammar_warning [] "one state has an end-of-stream conflict."
+  else if !ambiguities > 1 then
+    Error.grammar_warning [] (Printf.sprintf "%d states have an end-of-stream conflict." !ambiguities)
+
diff --git a/bundles/menhirLib/menhir-20120123/src/lr1.mli b/bundles/menhirLib/menhir-20120123/src/lr1.mli
new file mode 100644 (file)
index 0000000..c9806a5
--- /dev/null
@@ -0,0 +1,148 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+open Grammar
+
+(* This module constructs an LR(1) automaton by following Pager's
+   method, that is, by merging states on the fly when they are found
+   to be (weakly) compatible. *)
+
+(* Shift/reduce conflicts are silently resolved when (and only when)
+   that is allowed in a clean way by user-specified priorities. This
+   includes shift/reduce/reduce conflicts when (and only when) there
+   is agreement that the shift action should be preferred. Conflicts
+   that cannot be silently resolved in this phase will be reported,
+   explained, and arbitrarily resolved immediately before code
+   generation. *)
+
+(* ------------------------------------------------------------------------- *)
+(* Accessors. *)
+
+(* This is the type of the automaton's nodes. *)
+
+type node
+
+module Node : Set.OrderedType with type t = node
+
+module NodeSet : Set.S with type elt = node
+
+module NodeMap : Map.S with type key = node
+
+(* These are the automaton's entry states, indexed by the start productions. *)
+
+val entry: node ProductionMap.t
+
+(* Nodes are numbered sequentially from [0] to [n-1]. *)
+
+val n: int
+val number: node -> int
+
+(* This provides access to the LR(1) state that a node stands for. *)
+
+val state: node -> Lr0.lr1state
+
+(* This converts a start node into the single item that it contains. *)
+
+val start2item: node -> Item.t
+
+(* This maps a node to its incoming symbol, that is, the symbol
+   carried by all of the edges that enter this node. A node has zero
+   incoming edges (and, thus, no incoming symbol) if and only if it is
+   a start node. *)
+
+val incoming_symbol: node -> Symbol.t option
+
+(* This maps a node to its predecessors. *)
+
+val predecessors: node -> node list
+
+(* This provides access to a node's transitions and reductions. *)
+
+val transitions: node -> node SymbolMap.t
+val reductions: node -> Production.index list TerminalMap.t
+
+(* (New as of 2012/01/23.) This tells whether a shift/reduce conflict
+   in this node was solved in favor of neither (%nonassoc). This implies
+   that one must forbid a default reduction at this node. *)
+
+val forbid_default_reduction: node -> bool
+
+(* This inverts a mapping of tokens to productions into a mapping of
+   productions to sets of tokens. *)
+
+val invert : ProductionMap.key list TerminalMap.t -> TerminalSet.t ProductionMap.t
+
+(* Computing which terminal symbols a state is willing to act upon.
+
+   This function is currently unused, but could be used as part of an error
+   reporting system. *)
+
+val acceptable_tokens: node -> TerminalSet.t
+
+(* Iteration over all nodes. The order in which elements are examined,
+   and the order of [map]'s output list, correspond to the numeric
+   indices produced by [number] above. *)
+
+val fold: ('a -> node -> 'a) -> 'a -> 'a
+val iter: (node -> unit) -> unit
+val map: (node -> 'a) -> 'a list
+
+(* Iteration over non-start nodes *)
+val foldx: ('a -> node -> 'a) -> 'a -> 'a
+val iterx: (node -> unit) -> unit
+
+(* Breadth-first iteration over all edges. See [Breadth]. *)
+
+val bfs: (bool -> node -> Symbol.t -> node -> unit) -> unit
+
+(* Iteration over all edges that carry a certain symbol. Edges are
+   grouped in families, where all edges in a single family have the
+   same target node. [targets f accu symbol] invokes [f accu sources
+   target] once for every family, where [sources] are the sources of
+   the edges in the family and [target] is their common target. *)
+
+val targets: ('a -> node list -> node -> 'a) -> 'a -> Symbol.t -> 'a
+
+(* Iteration over all nodes with conflicts. [conflicts f] invokes [f
+   toks node] once for every node [node] with a conflict, where [toks]
+   are the tokens involved in the conflicts at that node. *)
+
+val conflicts: (TerminalSet.t -> node -> unit) -> unit
+
+(* [reverse_dfs goal] performs a reverse depth-first search through
+   the automaton, starting at node [goal], and marking the nodes
+   traversed. It returns a function that tells whether a node is
+   marked, that is, whether a path leads from that node to the goal
+   node. *)
+
+val reverse_dfs: node -> (node -> bool)
+
+(* ------------------------------------------------------------------------- *)
+(* Modifications of the automaton. *)
+
+(* This function performs default conflict resolution.
+
+   First, it resolves standard (shift/reduce and reduce/reduce)
+   conflicts (thus ensuring that the automaton is deterministic) by
+   removing some reduction actions.
+
+   Second, it resolves end-of-stream conflicts by ensuring that states
+   that have a reduce action at the pseudo-token "#" have no other
+   action.
+
+   It is called after conflicts have been explained and before code
+   generation takes place. The automaton is modified in place. *)
+
+val default_conflict_resolution: unit -> unit
+
diff --git a/bundles/menhirLib/menhir-20120123/src/lr1partial.ml b/bundles/menhirLib/menhir-20120123/src/lr1partial.ml
new file mode 100644 (file)
index 0000000..b8d0d67
--- /dev/null
@@ -0,0 +1,230 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+open Grammar
+
+module Run (X : sig
+
+  (* A restricted set of tokens of interest. *)
+
+  val tokens: TerminalSet.t
+
+  (* A state of the (merged) LR(1) automaton that we're trying to
+     simulate. *)
+
+  val goal: Lr1.node
+
+end) = struct
+
+  (* First, let's restrict our interest to the nodes of the merged
+     LR(1) automaton that can reach the goal node. Some experiments
+     show that this can involve one tenth to one half of all nodes.
+     This optimization seems minor, but is easy to implement. *)
+
+  let relevant =
+    Lr1.reverse_dfs X.goal
+
+  (* Second, all of the states that we shall consider are restricted
+     to the set of tokens of interest. This is an important idea: by
+     abstracting away some information, we make the construction much
+     faster. *)
+
+  let restrict =
+    Lr0.restrict X.tokens
+
+  (* Constructing the automaton. The automaton is represented as a
+     graph. States are never merged -- this is a canonical LR(1)
+     construction!
+
+     As we go, we record the correspondence between nodes in this
+     automaton and nodes in the merged LR(1) automaton. This allows
+     us to tell when we have reached the desired place.
+
+     This also allows us not to follow transitions that have already
+     been eliminated, in the merged automaton, via resolution of
+     shift/reduce conflicts. Whenever we follow a transition in the
+     canonical LR(1) automaton, we check that the corresponding
+     transition is legal in the merged LR(1) automaton.
+
+     The automaton is explored breadth-first and shortest paths from
+     every node to one of the start nodes are recorded. *)
+
+  type node = {
+      state: Lr0.lr1state;
+      ancestor: (Symbol.t * node) option;
+      shadow: Lr1.node;
+    }
+
+  (* A queue of pending nodes, whose successors should be explored. *)
+
+  let queue : node Queue.t =
+    Queue.create()
+
+  (* Mapping of LR(0) state numbers to lists of nodes. *)
+
+  let map : node list array =
+    Array.create Lr0.n []
+
+  (* Exploring a state. This creates a new node, if necessary, and
+     enqueues it for further exploration. *)
+
+  exception Goal of node * Terminal.t
+
+  let explore ancestor shadow (state : Lr0.lr1state) : unit =
+
+    (* Find all existing nodes that share the same LR(0) core. *)
+
+    let k = Lr0.core state in
+    assert (k < Lr0.n);
+    let similar = map.(k) in
+
+    (* Check whether one of these nodes coincides with the candidate
+       new node. If so, stop. This check requires comparing not only
+       the states of the partial, canonical automaton, but also their
+       shadows in the full, merged automaton. This is because a single
+       state of the canonical automaton may be reached along several
+       different paths, leading to distinct shadows in the merged
+       automaton, and we must explore all of these paths in order to
+       ensure that we eventually find a goal node. *)
+
+    if not (List.exists (fun node ->
+      Lr0.equal state node.state && shadow == node.shadow
+    ) similar) then begin
+
+      (* Otherwise, create a new node. *)
+
+      let node = {
+       state = state;
+       ancestor = ancestor;
+       shadow = shadow;
+      } in
+
+      map.(k) <- node :: similar;
+      Queue.add node queue;
+
+      (* Check whether this is a goal node. A node [N] is a goal node
+        if (i) [N] has a conflict involving one of the tokens of
+        interest and (ii) [N] corresponds to the goal node, that is,
+        the path that leads to [N] in the canonical LR(1) automaton
+        leads to the goal node in the merged LR(1) automaton. Note
+        that these conditions do not uniquely define [N]. *)
+
+      if shadow == X.goal then
+       let can_reduce =
+         ref TerminalSet.empty in
+       let reductions1 : Production.index list TerminalMap.t =
+         Lr1.reductions shadow in
+       List.iter (fun (toks, prod) ->
+         TerminalSet.iter (fun tok ->
+
+           (* We are looking at a [(tok, prod)] pair -- a reduction
+              in the canonical automaton state. *)
+
+           (* Check that this reduction, which exists in the canonical
+              automaton state, also exists in the merged automaton --
+              that is, it wasn't suppressed by conflict resolution. *)
+
+           if List.mem prod (TerminalMap.lookup tok reductions1) then 
+
+             try
+               let (_ : Lr1.node) =
+                 SymbolMap.find (Symbol.T tok) (Lr1.transitions shadow)
+               in
+               (* Shift/reduce conflict. *)
+               raise (Goal (node, tok))
+             with Not_found ->
+               let toks = !can_reduce in
+               (* We rely on the property that [TerminalSet.add tok toks]
+                  preserves physical equality when [tok] is a member of
+                  [toks]. *)
+               let toks' = TerminalSet.add tok toks in
+               if toks == toks' then
+                 (* Reduce/reduce conflict. *)
+                 raise (Goal (node, tok))
+               else
+                 (* No conflict so far. *)
+                 can_reduce := toks'
+
+         ) toks
+       ) (Lr0.reductions state)
+
+    end
+
+  (* Populate the queue with the start nodes. Until we find a goal
+     node, take a node out the queue, construct the nodes that
+     correspond to its successors, and enqueue them. *)
+
+  let goal, token =
+    try
+
+      ProductionMap.iter (fun (prod : Production.index) (k : Lr0.node) ->
+       let shadow = try
+           ProductionMap.find prod Lr1.entry
+         with Not_found ->
+           assert false
+       in
+       if relevant shadow then
+         explore None shadow (restrict (Lr0.start k))
+      ) Lr0.entry;
+
+      Misc.qiter (fun node ->
+       SymbolMap.iter (fun symbol state ->
+         try
+           let shadow =
+             SymbolMap.find symbol (Lr1.transitions node.shadow) in
+           if relevant shadow then
+             explore (Some (symbol, node)) shadow (restrict state)
+         with Not_found ->
+           (* No shadow. This can happen if a shift/reduce conflict
+               was resolved in favor in reduce. Ignore that transition. *)
+            ()
+       ) (Lr0.transitions node.state)
+      ) queue;
+
+      (* We didn't find a goal node. This shouldn't happen! If the
+        goal node in the merged LR(1) automaton has a conflict,
+        then there should exist a node with a conflict in the
+        canonical automaton as well. Otherwise, Pager's construction
+        is incorrect. *)
+      
+      begin
+       Printf.fprintf stderr "** Internal failure (Pager's theorem).\n";
+       Printf.fprintf stderr "** Tokens of interest: %s\n" (TerminalSet.print X.tokens);
+       Printf.fprintf stderr "** Goal state: %d\n" (Lr1.number X.goal);
+       Printf.fprintf stderr "** Please send your grammar to Menhir's developers.\n%!";
+       exit 1
+      end
+
+    with Goal (node, tok) ->
+      node, tok
+  
+  (* Query the goal node that was found about the shortest path from
+     it to one of the entry nodes. *)
+
+  let source, path =
+
+    let rec follow path node =
+      match node.ancestor with
+      | None ->
+         Lr1.start2item node.shadow, Array.of_list path
+      | Some (symbol, node) ->
+         follow (symbol :: path) node
+    in
+    follow [] goal
+
+  let goal =
+    Lr0.export goal.state
+
+end
+
diff --git a/bundles/menhirLib/menhir-20120123/src/lr1partial.mli b/bundles/menhirLib/menhir-20120123/src/lr1partial.mli
new file mode 100644 (file)
index 0000000..43a913b
--- /dev/null
@@ -0,0 +1,48 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+open Grammar
+
+module Run (X : sig
+
+  (* A restricted set of tokens of interest. *)
+
+  val tokens: TerminalSet.t
+
+  (* A state of the (merged) LR(1) automaton that we're trying to
+     simulate. *)
+
+  val goal: Lr1.node
+
+end) : sig
+
+  (* What we are after is a path, in the canonical LR(1) automaton,
+     that leads from some entry node to a node [N] such that (i)
+     [N] has a conflict involving one of the tokens of interest
+     and (ii) [N] corresponds to the goal node, that is, the path
+     that leads to [N] in the canonical LR(1) automaton leads to
+     the goal node in the merged LR(1) automaton. *)
+
+  val source: Item.t
+
+  val path: Symbol.t array
+
+  val goal: Lr0.concretelr1state
+
+  (* An (arbitrarily chosen) conflict token in the goal state. *)
+
+  val token: Terminal.t
+
+end
+
diff --git a/bundles/menhirLib/menhir-20120123/src/mark.ml b/bundles/menhirLib/menhir-20120123/src/mark.ml
new file mode 100644 (file)
index 0000000..8c022f1
--- /dev/null
@@ -0,0 +1,31 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(** This module implements a very simple notion of ``mark''. A mark is
+    really a reference cell (without content). Creating a new mark
+    requires allocating a new cell, and comparing marks requires
+    comparing pointers. *)
+
+type t =
+    unit ref
+
+let fresh =
+  ref
+
+let same =
+  (==)
+
+let none =
+  fresh()
+
diff --git a/bundles/menhirLib/menhir-20120123/src/mark.mli b/bundles/menhirLib/menhir-20120123/src/mark.mli
new file mode 100644 (file)
index 0000000..0310bb1
--- /dev/null
@@ -0,0 +1,31 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(** This module implements a very simple notion of ``mark''. *)
+
+(** The type of marks. *)
+type t
+
+(** [fresh()] generates a fresh mark, that is, a mark that is guaranteed
+    to be distinct from all existing marks. *)
+val fresh: unit -> t
+
+(** [same mark1 mark2] tells whether [mark1] and [mark2] are the same
+    mark, that is, were created by the same call to [fresh]. *)
+val same: t -> t -> bool
+
+(** [none] is a distinguished mark, created via an initial call to
+    [fresh()]. *)
+val none: t
+
diff --git a/bundles/menhirLib/menhir-20120123/src/misc.ml b/bundles/menhirLib/menhir-20120123/src/misc.ml
new file mode 100644 (file)
index 0000000..8b2e18a
--- /dev/null
@@ -0,0 +1,291 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+let ( $$ ) x f = f x
+
+let unSome = function
+   None -> assert false
+  | Some x -> x
+
+let o2s o f =
+  match o with
+  | None ->
+      ""
+  | Some x ->
+      f x
+
+let single = function
+  | [ x ] ->
+      x
+  | _ ->
+      assert false
+
+let rec mapd f = function
+  | [] ->
+      []
+  | x :: xs ->
+      let y1, y2 = f x in
+      y1 :: y2 :: mapd f xs
+
+let tabulateb n f =
+  let a = Array.init n f in
+  Array.get a,
+  Array.fold_left (fun count element ->
+    if element then count + 1 else count
+  ) 0 a
+
+let tabulateo number fold n f =
+  let a = Array.create n None in
+  let c = ref 0 in
+  let () = fold (fun () element ->
+    let image = f element in
+    a.(number element) <- image;
+    match image with
+    | Some _ ->
+       incr c
+    | None ->
+       ()
+  ) () in
+  let get element =
+    a.(number element)
+  in
+  get, !c
+
+let rec truncate k xs =
+  match k, xs with
+  | 0, _ ->
+      []
+  | _, [] ->
+      assert false
+  | _, x :: xs ->
+      x :: truncate (k-1) xs
+
+let truncate k xs =
+  if List.length xs <= k then xs else truncate k xs
+
+module IntSet = Set.Make (struct 
+                           type t = int
+                           let compare = ( - )
+                         end)
+
+let separated_list_to_string printer separator list = 
+
+  let rec loop x = function
+    | [] ->
+        printer x
+    | y :: xs ->
+        printer x 
+       ^ separator 
+       ^ loop y xs
+  in
+
+  match list with
+  | [] ->
+      ""
+  | x :: xs ->
+      loop x xs
+
+
+let index_map string_map = 
+  let n = StringMap.cardinal string_map in
+  let a = Array.create n None in
+  let conv, _ = StringMap.fold 
+    (fun k v (conv, idx) ->
+       a.(idx) <- Some (k, v);
+       StringMap.add k idx conv, idx + 1)
+    string_map (StringMap.empty, 0) 
+  in
+    ((fun n -> snd (unSome a.(n))),
+     (fun k -> StringMap.find k conv),
+     (fun n -> fst (unSome a.(n))))
+  
+let support_assoc l x =
+  try
+    List.assoc x l
+  with Not_found -> x
+
+let index (strings : string list) : int * string array * int StringMap.t =
+  let name = Array.of_list strings
+  and n, map = List.fold_left (fun (n, map) s ->
+    n+1, StringMap.add s n map
+  ) (0, StringMap.empty) strings in
+  n, name, map
+
+(* Turning an implicit list, stored using pointers through a hash
+   table, into an explicit list. The head of the implicit list is
+   not included in the explicit list. *)
+
+let materialize (table : ('a, 'a option) Hashtbl.t) (x : 'a) : 'a list =
+  let rec loop x =
+    match Hashtbl.find table x with
+    | None ->
+       []
+    | Some x ->
+       x :: loop x
+  in
+  loop x
+
+(* [iteri] implements a [for] loop over integers, from 0 to
+   [n-1]. *)
+
+let iteri n f =
+  for i = 0 to n - 1 do
+    f i
+  done
+
+(* [foldi] implements a [for] loop over integers, from 0 to [n-1],
+   with an accumulator. [foldij] implements a [for] loop over
+   integers, from [start] to [n-1], with an accumulator. *)
+
+let foldij start n f accu =
+  let rec loop i accu =
+    if i = n then
+      accu
+    else
+      loop (i+1) (f i accu)
+  in
+  loop start accu
+
+let foldi n f accu =
+  foldij 0 n f accu
+
+(* [mapi n f] produces the list [ f 0; ... f (n-1) ]. *)
+
+let mapi n f =
+  List.rev (
+    foldi n (fun i accu ->
+      f i :: accu
+    ) []
+  )
+
+(* [qfold f accu q] repeatedly takes an element [x] off the queue [q]
+   and applies [f] to the accumulator and to [x], until [q] becomes
+   empty. Of course, [f] can add elements to [q] as a side-effect.
+
+   We allocate an option to ensure that [qfold] is tail-recursive. *)
+
+let rec qfold f accu q =
+  match
+    try
+      Some (Queue.take q)
+    with Queue.Empty ->
+      None
+  with
+  | Some x ->
+      qfold f (f accu x) q
+  | None ->
+      accu
+
+(* [qiter f q] repeatedly takes an element [x] off the queue [q] and
+   applies [f] to [x], until [q] becomes empty. Of course, [f] can add
+   elements to [q] as a side-effect. *)
+
+let qiter f q =
+  try
+    while true do
+      f (Queue.take q)
+    done
+  with Queue.Empty ->
+    ()
+
+let rec smap f = function
+  | [] ->
+      []
+  | (x :: xs) as l ->
+      let x' = f x
+      and xs' = smap f xs in
+      if x == x' && xs == xs' then
+       l
+      else
+       x' :: xs'
+
+let rec smapa f accu = function
+  | [] ->
+      accu, []
+  | (x :: xs) as l ->
+      let accu, x' = f accu x in
+      let accu, xs' = smapa f accu xs in
+      accu,
+      if x == x' && xs == xs' then
+       l
+      else
+       x' :: xs'
+
+let normalize s =
+  let s = String.copy s in
+  let n = String.length s in
+  for i = 0 to n - 1 do
+    match s.[i] with
+    | '('
+    | ')'
+    | ',' ->
+       s.[i] <- '_'
+    | _ ->
+       ()
+  done;
+  s
+
+(* [postincrement r] increments [r] and returns its original value. *)
+
+let postincrement r =
+  let x = !r in
+  r := x + 1;
+  x
+
+(* [gcp] returns the greatest common prefix of two strings. *)
+
+let gcp s1 s2 =
+  let n1 = String.length s1
+  and n2 = String.length s2 in
+  let rec loop i =
+    if (i < n1) && (i < n2) && (s1.[i] = s2.[i]) then
+      loop (i+1)
+    else
+      String.sub s1 0 i
+  in
+  loop 0
+
+(* [gcps] returns the greatest common prefix of a nonempty list of strings. *)
+
+let rec gcps = function
+  | [] ->
+      assert false
+  | s :: ss ->
+      let rec loop accu = function
+       | [] ->
+           accu
+       | s :: ss ->
+           loop (gcp s accu) ss
+      in
+      loop s ss
+
+(* [array_forall p a] computes the conjunction of the predicate [p] over all
+   elements of the array [a]. *)
+
+exception ArrayForall
+
+let _ArrayForall =
+  ArrayForall
+
+let array_forall (p : 'a -> bool) (a : 'a array) : bool =
+  try
+    for i = 0 to Array.length a - 1 do
+      let x = Array.get a i in
+      if not (p x) then
+       raise _ArrayForall
+    done;
+    true
+  with ArrayForall ->
+    false
+
diff --git a/bundles/menhirLib/menhir-20120123/src/misc.mli b/bundles/menhirLib/menhir-20120123/src/misc.mli
new file mode 100644 (file)
index 0000000..99bbcc5
--- /dev/null
@@ -0,0 +1,155 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* TEMPORARY tidy up, comment, remove dead code *)
+
+(* Converting an option to a string, with [None] converted
+   to the empty string. *)
+
+val o2s: 'a option -> ('a -> string) -> string
+
+(* Projection out of a singleton list. *)
+
+val single: 'a list -> 'a
+
+(* A variant of [List.map] where [f] returns a pair of elements,
+   to be flattened into the new list. *)
+
+val mapd: ('a -> 'b * 'b) -> 'a list -> 'b list
+
+(* Tabulating a function using an internal array. [tabulateb n f]
+   returns a function that is extensionally equal to [f], but relies
+   on an internal array. Arguments to [f] are of type [int] and are
+   supposed to lie in the range [0..n). The result type of [f] is
+   assumed to be of type [bool]. [tabulateb] also returns the number
+   of points where [f] is [true]. *)
+
+val tabulateb: int -> (int -> bool) -> (int -> bool) * int
+
+(* [tabulateo number fold n f] returns a function that is
+   extensionally equal to [f], but relies on an internal
+   array. Arguments to [f] are of type ['a] and are mapped by [number]
+   into the range [0..n). [fold] allows folding over the domain of
+   [f]. The result type of [f] is an option type, and [tabulateo] also
+   returns the number of points where [f] is [Some _]. *)
+
+val tabulateo: ('a -> int) -> ((unit -> 'a -> unit) -> unit -> unit) -> int -> ('a -> 'b option) -> ('a -> 'b option) * int
+
+(* Truncature of a list. *)
+
+val truncate: int -> 'a list -> 'a list
+
+(* Reverse function application. *)
+
+val ( $$ ) : 'a -> ('a -> 'b) -> 'b
+
+(* Sets of strings and maps over strings. *)
+
+module IntSet    : Set.S with type elt = int
+
+(* [separated_list_to_string printer sep l] converts [l] into a string
+   representation built using [printer] on each element and [sep] as 
+   a separator. *)
+
+val separated_list_to_string: ('a -> string) -> string -> 'a list -> string
+
+(* [index_map f] returns a triple (indexed_f, domain_indexation, domain_array).
+   [indexed_f] is a mapping from [0..n-1] to the elements of the map [f] 
+   ([n] being the size of the image of [f]). 
+   [domain_indexation] is a mapping from the domain of the map [f] to indexes. 
+   [domain_array] is a mapping from the indexes to the domain of [f]. 
+   The indexation implements [f] ie:
+   - forall x in domain(m), indexed_f (domain_indexation x) = f (x).
+   - forall x in domain(m), domain_array (domain_indexation x) = x. *)
+
+val index_map 
+  : 'a StringMap.t -> (int -> 'a) * (string -> int) * (int -> string)
+
+(* [support_assoc l x] returns the second component of the first couple
+   in [l] whose first component is [x]. If it does not exist, it returns
+   [x]. *)
+
+val support_assoc : ('a * 'a) list -> 'a -> 'a
+
+(* [index] indexes a list of (distinct) strings, that is, assigns an
+   integer index to each string and builds mappings both ways between
+   strings and indices. *)
+
+val index: string list -> int * string array * int StringMap.t
+
+(* Turning an implicit list, stored using pointers through a hash
+   table, into an explicit list. The head of the implicit list is
+   not included in the explicit list. *)
+
+val materialize: ('a, 'a option) Hashtbl.t -> 'a -> 'a list
+
+(* [iteri] implements a [for] loop over integers, from 0 to
+   [n-1]. *)
+
+val iteri: int -> (int -> unit) -> unit
+
+(* [foldi] implements a [for] loop over integers, from 0 to [n-1],
+   with an accumulator. [foldij] implements a [for] loop over
+   integers, from [start] to [n-1], with an accumulator. *)
+
+val foldi: int -> (int -> 'a -> 'a) -> 'a -> 'a
+val foldij: int -> int -> (int -> 'a -> 'a) -> 'a -> 'a
+
+(* [mapi n f] produces the list [ f 0; ... f (n-1) ]. *)
+
+val mapi: int -> (int -> 'a) -> 'a list
+
+(* [qfold f accu q] repeatedly takes an element [x] off the queue [q]
+   and applies [f] to the accumulator and to [x], until [q] becomes
+   empty. Of course, [f] can add elements to [q] as a side-effect. *)
+
+val qfold: ('a -> 'b -> 'a) -> 'a -> 'b Queue.t -> 'a
+
+(* [qiter f q] repeatedly takes an element [x] off the queue [q] and
+   applies [f] to [x], until [q] becomes empty. Of course, [f] can add
+   elements to [q] as a side-effect. *)
+
+val qiter: ('b -> unit) -> 'b Queue.t -> unit
+
+(* [smap] has the same semantics as [List.map], but attempts to
+   physically return the input list when [f] is the identity. *)
+
+val smap: ('a -> 'a) -> 'a list -> 'a list
+
+(* [smapa] is a variant of [smap] that maintains an accumulator. *)
+
+val smapa: ('b -> 'a -> 'b * 'a) -> 'b -> 'a list -> 'b * 'a list
+
+(* [normalize s] returns a copy of [s] where parentheses and commas
+   are replaced with underscores. *)
+
+val normalize: string -> string
+
+(* [postincrement r] increments [r] and returns its original value. *)
+
+val postincrement: int ref -> int
+
+(* [gcp] returns the greatest common prefix of two strings. *)
+
+val gcp: string -> string -> string
+
+(* [gcps] returns the greatest common prefix of a nonempty list of strings. *)
+
+val gcps : string list -> string
+
+(* [array_forall p a] computes the conjunction of the predicate [p] over all
+   elements of the array [a]. *)
+
+val array_forall: ('a -> bool) -> 'a array -> bool
+
diff --git a/bundles/menhirLib/menhir-20120123/src/nonTerminalDefinitionInlining.ml b/bundles/menhirLib/menhir-20120123/src/nonTerminalDefinitionInlining.ml
new file mode 100644 (file)
index 0000000..2d26eac
--- /dev/null
@@ -0,0 +1,249 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* $Id: nonTerminalDefinitionInlining.ml,v 1.17 2006/06/26 09:41:33 regisgia Exp $ *)
+open UnparameterizedSyntax
+open ListMonad
+
+(* This exception will be raised when a branch does not need inlining. *)
+exception NoInlining
+
+(* Color are used to detect cycles. *)
+type 'a color = 
+  | BeingExpanded
+  | Expanded of 'a
+
+(* Inline a grammar. The resulting grammar does not contain any definitions
+   that can be inlined. *)
+let inline grammar = 
+
+  let names producers = 
+    List.fold_left (fun s -> function (_, Some x) -> StringSet.add x s | _ -> s) 
+      StringSet.empty producers 
+  in
+
+  (* This function returns a fresh name beginning with [prefix] and 
+     that is not in the set of names [names]. *)
+  let rec fresh ?(c=0) names prefix =
+    let name = prefix^string_of_int c in
+      if StringSet.mem name names then
+       fresh ~c:(c+1) names prefix
+      else 
+       name
+  in
+
+  let use_inline = ref false in
+
+  (* This table associates a color to each non terminal that can be expanded. *)
+  let expanded_non_terminals = 
+    Hashtbl.create 13 
+  in
+
+  let expanded_state k = 
+    Hashtbl.find expanded_non_terminals k 
+  in
+      
+  let mark_as_being_expanded k = 
+    Hashtbl.add expanded_non_terminals k BeingExpanded
+  in
+
+  let mark_as_expanded k r =
+    Hashtbl.replace expanded_non_terminals  k (Expanded r);
+    r
+  in
+
+  (* This function traverses the producers of the branch [b] and find
+     the first non terminal that can be inlined. If it finds one, it
+     inlines its branches into [b], that's why this function can return
+     several branches. If it does not find one non terminal to be 
+     inlined, it raises [NoInlining]. *)
+  let rec find_inline_producer b = 
+    let prefix, nt, p, psym, suffix = 
+      let rec chop_inline i (prefix, suffix) =
+       match suffix with
+         | [] -> 
+             raise NoInlining
+
+         | ((nt, id) as x) :: xs ->
+             try
+               let r = StringMap.find nt grammar.rules in
+               let id = match id with
+                 | None -> "_"^string_of_int i
+                 | Some id -> id
+               in
+                 if r.inline_flag then 
+                   (* We have to inline the rule [r] into [b] between
+                      [prefix] and [xs]. *)
+                   List.rev prefix, nt, r, id, xs
+                 else 
+                   chop_inline (i + 1) (x :: prefix, xs) 
+             with Not_found -> 
+               chop_inline (i + 1) (x :: prefix, xs) 
+      in
+       chop_inline 1 ([], b.producers)
+    in
+      prefix, expand_rule nt p, nt, psym, suffix
+
+  (* We have to rename producers' names of the inlined production 
+     if they clashes with the producers' names of the branch into 
+     which we do the inlining. *)
+  and rename_if_necessary b producers =
+
+    (* First we compute the set of names already in use. *)
+    let producers_names = names (b.producers @ producers) in
+
+    (* Compute a renaming and the new inlined producers' names. *)
+    let phi, producers' =
+      List.fold_left (fun (phi, producers) -> function (p, Some x) -> 
+               if StringSet.mem x producers_names then
+                 let x' = fresh producers_names x in
+                   ((x, x') :: phi, (p, Some x') :: producers)
+               else 
+                 (phi, (p, Some x) :: producers)
+               | p -> phi, p :: producers) ([], []) producers
+    in
+      phi, List.rev producers'
+       
+  (* Inline the non terminals that can be inlined in [b]. We use the 
+     ListMonad to combine the results. *)
+  and expand_branch (b : branch) : branch ListMonad.m =
+    try 
+      let prefix, p, nt, psym, suffix = find_inline_producer b in
+       use_inline := true;
+       if Action.use_dollar b.action then
+         Error.error [ b.branch_position ]
+           (Printf.sprintf 
+              "You cannot use %s and the $i syntax in this branch since the \
+               definition of %s has to be inlined."
+              nt nt)
+       else      
+         (* Inline a branch of [nt] at position [prefix] ... [suffix] in 
+            the branch [b]. *)
+         let inline_branch pb = 
+           (* Rename the producers of this branch is they conflict with 
+              the name of the host's producers. *)
+           let phi, inlined_producers = rename_if_necessary b pb.producers in
+
+           (* Define the renaming environment given the shape of the branch. *)
+           let renaming_env, prefix', suffix' = 
+             
+             let start_position, prefix' = 
+               match List.rev prefix with 
+
+                 (* If the prefix is empty, the start position is the rule 
+                    start position. *)
+                 | [] -> (Keyword.Left, Keyword.WhereStart), prefix
+                     
+                 (* If the last producer of prefix is unnamed, we cannot refer to 
+                    its position. We give it a name. *)
+                 | (p, None) :: ps -> 
+                     let x = fresh (names (inlined_producers @ prefix @ suffix)) (CodeBits.prefix "p") in
+                       (Keyword.RightNamed x, Keyword.WhereEnd), List.rev ((p, Some x) :: ps)
+
+                (* The last producer of prefix is named [x], 
+                   $startpos in the inlined rule will be changed to $endpos(x). *)
+                | (_, Some x) :: _ -> (Keyword.RightNamed x, Keyword.WhereEnd), prefix
+
+             in
+             (* Same thing for the suffix. *)
+             let end_position, suffix' = 
+               match suffix with 
+                 | [] -> (Keyword.Left, Keyword.WhereEnd), suffix
+                 | (p, None) :: ps -> 
+                     let x = fresh (names (inlined_producers @ prefix' @ suffix)) (CodeBits.prefix "p") in
+                       ((Keyword.RightNamed x, Keyword.WhereStart), (p, Some x) :: ps)
+                | (_, Some x) :: _ -> (Keyword.RightNamed x, Keyword.WhereStart), suffix
+             in
+               (psym, start_position, end_position), prefix', suffix' 
+           in
+           (* Rename the host semantic action. 
+              Each reference of the inlined non terminal [psym] must be taken into 
+              account. $startpos(psym) is changed to $startpos(x) where [x] is
+              the first producer of the inlined branch if it is not empty or
+              the preceding producer found in the prefix. *)
+           let outer_action, (used1, used2) = 
+             Action.rename_inlined_psym renaming_env [] b.action
+           in
+           let action', (used1', used2') = 
+             Action.rename renaming_env phi pb.action 
+           in
+           let prefix = if used1 || used1' then prefix' else prefix in
+           let suffix = if used2 || used2' then suffix' else suffix in
+
+             { b with
+                 producers = prefix @ inlined_producers @ suffix;
+                 action = Action.compose psym action' outer_action
+             }
+         in
+           List.map inline_branch p.branches >>= expand_branch 
+         
+    with NoInlining -> 
+      return b
+       
+  (* Expand a rule if necessary. *)
+  and expand_rule k r = 
+    try 
+      (match expanded_state k with
+        | BeingExpanded ->
+            Error.error
+              r.positions
+              (Printf.sprintf "there is a cycle in the definition of %s." k)
+        | Expanded r ->
+            r)
+    with Not_found ->
+      mark_as_being_expanded k;
+      mark_as_expanded k { r with branches = r.branches >>= expand_branch }
+  in
+
+    (* We check that the %inline rules do not use $i syntax since 
+       expansion of $i is impossible. *)
+  let _ = 
+    StringMap.iter 
+      (fun _ r -> 
+        if r.inline_flag 
+          && List.exists (fun b -> Action.use_dollar b.action) r.branches then
+            Error.error r.positions 
+              (Printf.sprintf 
+                 "You cannot use $i syntax in this branch since its \
+                   definition will be inlined."))
+      grammar.rules
+  in
+
+    (* If we are in Coq mode, %inline is forbidden. *)
+  let _ =
+    if Settings.coq then
+      StringMap.iter 
+        (fun _ r -> 
+          if r.inline_flag then
+             Error.error r.positions
+               (Printf.sprintf "%%inline is not supported by the coq back-end"))
+        grammar.rules
+  in
+
+    (* To expand a grammar, we expand all its rules and remove 
+       the %inline rules. *)
+  let expanded_rules = 
+    StringMap.mapi expand_rule grammar.rules
+  and useful_types = 
+      StringMap.filter 
+       (fun k _ -> try not (StringMap.find k grammar.rules).inline_flag
+        with Not_found -> true)
+       grammar.types
+  in
+
+    { grammar with 
+       rules = StringMap.filter (fun _ r -> not r.inline_flag) expanded_rules;
+       types = useful_types
+    }, !use_inline
+      
diff --git a/bundles/menhirLib/menhir-20120123/src/nonTerminalDefinitionInlining.mli b/bundles/menhirLib/menhir-20120123/src/nonTerminalDefinitionInlining.mli
new file mode 100644 (file)
index 0000000..e5f4cb3
--- /dev/null
@@ -0,0 +1,20 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* $Id: nonTerminalDefinitionInlining.mli,v 1.5 2005/12/01 16:20:06 regisgia Exp $ *)
+
+(** [inline g] traverses the rules of [g] and inlines the non terminal
+    definitions that are marked with [%inline]. It returns a pair of the transformed
+    grammar and a flag that tells whether any inlining was actually done. *)
+val inline: UnparameterizedSyntax.grammar -> UnparameterizedSyntax.grammar * bool
diff --git a/bundles/menhirLib/menhir-20120123/src/nonpositiveCycles.ml b/bundles/menhirLib/menhir-20120123/src/nonpositiveCycles.ml
new file mode 100644 (file)
index 0000000..efb4aec
--- /dev/null
@@ -0,0 +1,130 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* This module uses Floyd and Warshall's algorithm to detect whether a graph
+   with integer-weighted edges contains a simple cycle of negative weight. *)
+
+(* The algorithm runs in cubic time in the number of vertices. It may be
+   worthwhile to first use Tarjan's algorithm to obtain the graph's strongly
+   connected components, and use Floyd and Warshall's algorithm only on each
+   component. *)
+
+module Run (G : sig
+
+  type node
+
+  (* We assume each node has a unique index. Indices must range from
+     $0$ to $n-1$, where $n$ is the number of nodes in the graph. *)
+
+  val n: int
+  val index: node -> int
+
+  (* Iterating over a node's immediate successors. Edges are weighted. *)
+
+  val successors: (int -> node -> unit) -> node -> unit
+
+  (* Iterating over all nodes. *)
+
+  val iter: (node -> unit) -> unit
+
+end) = struct
+
+  open G
+
+  (* Integers with infinity. *)
+
+  type distance =
+    | Infinity
+    | Finite of int
+
+  let add d1 d2 =
+    match d1, d2 with
+    | Infinity, _
+    | _, Infinity ->
+       Infinity
+    | Finite i1, Finite i2 ->
+       Finite (i1 + i2)
+
+  let min d1 d2 =
+    match d1, d2 with
+    | Infinity, d
+    | d, Infinity ->
+       d
+    | Finite i1, Finite i2 ->
+       Finite (min i1 i2)
+
+  let le d1 d2 =
+    match d1, d2 with
+    | Infinity, Infinity ->
+       true
+    | Infinity, Finite _ ->
+       false
+    | Finite _, Infinity ->
+       true
+    | Finite i1, Finite i2 ->
+       i1 <= i2
+
+  (* Allocate and initialize a distance matrix. At allocation time, every entry
+     is initialized to infinity. Then, we iterate over all edges, and copy them
+     into the distance matrix. *)
+
+  (* Note that, by default, [d.(i).(i)] is not initialized to zero: it is 
+     initialized to infinity. This is because we are looking for paths of
+     non-zero length. In other words, we are computing a transitive closure,
+     not a reflexive, transitive closure. *)
+
+  let d =
+    Array.init n (fun i ->
+      Array.init n (fun j ->
+       Infinity
+      )
+    )
+
+  let () =
+    iter (fun source ->
+      successors (fun weight target ->
+       (* We use a min operation, so the graph may be a multi-graph, that is,
+          multiple edges between two nodes are permitted. *)
+       let i = index source
+       and j = index target in
+       d.(i).(j) <- min (Finite weight) d.(i).(j)
+      ) source
+    )
+
+  (* The algorithm. *)
+
+  (* Stefan Hougardy notes that, in the presence of negative cycles, distances
+     can grow exponentially fast (towards minus infinity), so there is a risk
+     of overflow. To avoid this, one must check for negative cycles during the
+     computation -- as opposed to waiting until the end. *)
+
+  exception Detection
+
+  let graph_has_nonpositive_simple_cycle : bool =
+    try
+      for k = 0 to n-1 do
+       for i = 0 to n-1 do
+         for j = 0 to n-1 do
+           d.(i).(j) <- min d.(i).(j) (add d.(i).(k) d.(k).(j));
+           if i = j && le d.(i).(j) (Finite 0) then
+             raise Detection
+         done
+       done
+      done;
+      false
+    with Detection ->
+      true
+
+end
+
diff --git a/bundles/menhirLib/menhir-20120123/src/nonpositiveCycles.mli b/bundles/menhirLib/menhir-20120123/src/nonpositiveCycles.mli
new file mode 100644 (file)
index 0000000..fe667e7
--- /dev/null
@@ -0,0 +1,46 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* This module uses Floyd and Warshall's algorithm to detect whether a graph
+   with integer-weighted edges contains a simple cycle of negative weight. *)
+
+(* The algorithm runs in cubic time in the number of vertices. It may be
+   worthwhile to first use Tarjan's algorithm to obtain the graph's strongly
+   connected components, and use Floyd and Warshall's algorithm only on each
+   component. *)
+
+module Run (G : sig
+
+  type node
+
+  (* We assume each node has a unique index. Indices must range from
+     $0$ to $n-1$, where $n$ is the number of nodes in the graph. *)
+
+  val n: int
+  val index: node -> int
+
+  (* Iterating over a node's immediate successors. Edges are weighted. *)
+
+  val successors: (int -> node -> unit) -> node -> unit
+
+  (* Iterating over all nodes. *)
+
+  val iter: (node -> unit) -> unit
+
+end) : sig
+
+  val graph_has_nonpositive_simple_cycle : bool
+
+end
+
diff --git a/bundles/menhirLib/menhir-20120123/src/option.ml b/bundles/menhirLib/menhir-20120123/src/option.ml
new file mode 100644 (file)
index 0000000..01378e4
--- /dev/null
@@ -0,0 +1,34 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+let map f = function
+  | None ->
+      None
+  | Some x ->
+      Some (f x)
+
+let iter f o =
+  match o with
+  | None ->
+      ()
+  | Some x ->
+      f x
+
+let fold f o accu =
+  match o with
+  | None ->
+      accu
+  | Some x ->
+      f x accu
+
diff --git a/bundles/menhirLib/menhir-20120123/src/option.mli b/bundles/menhirLib/menhir-20120123/src/option.mli
new file mode 100644 (file)
index 0000000..edd1bc3
--- /dev/null
@@ -0,0 +1,17 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+val map: ('a -> 'b) -> 'a option -> 'b option
+val iter: ('a -> unit) -> 'a option -> unit
+val fold: ('a -> 'b -> 'b) -> 'a option -> 'b -> 'b
diff --git a/bundles/menhirLib/menhir-20120123/src/packedIntArray.ml b/bundles/menhirLib/menhir-20120123/src/packedIntArray.ml
new file mode 100644 (file)
index 0000000..b31c744
--- /dev/null
@@ -0,0 +1,199 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the GNU Library General Public License, with the   *)
+(*  special exception on linking described in file LICENSE.               *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* A packed integer array is represented as a pair of an integer [k] and
+   a string [s]. The integer [k] is the number of bits per integer that we
+   use. The string [s] is just an array of bits, which is read in 8-bit
+   chunks. *)
+
+(* The ocaml programming language treats string literals and array literals
+   in slightly different ways: the former are statically allocated, while
+   the latter are dynamically allocated. (This is rather arbitrary.) In the
+   context of Menhir's table-based back-end, where compact, immutable
+   integer arrays are needed, ocaml strings are preferable to ocaml arrays. *)
+
+type t =
+  int * string
+
+(* The magnitude [k] of an integer [v] is the number of bits required
+   to represent [v]. It is rounded up to the nearest power of two, so
+   that [k] divides [Sys.word_size]. *)
+
+let magnitude (v : int) =
+  if v < 0 then
+    Sys.word_size
+  else
+    let rec check k max = (* [max] equals [2^k] *)
+      if (max <= 0) || (v < max) then
+       k
+         (* if [max] just overflew, then [v] requires a full ocaml
+            integer, and [k] is the number of bits in an ocaml integer
+            plus one, that is, [Sys.word_size]. *)
+      else
+       check (2 * k) (max * max)
+    in
+    check 1 2
+
+(* [pack a] turns an array of integers into a packed integer array. *)
+
+(* Because the sign bit is the most significant bit, the magnitude of
+   any negative number is the word size. In other words, [pack] does
+   not achieve any space savings as soon as [a] contains any negative
+   numbers, even if they are ``small''. *)
+
+let pack (a : int array) : t =
+
+  let m = Array.length a in
+  
+  (* Compute the maximum magnitude of the array elements. This tells
+     us how many bits per element we are going to use. *)
+
+  let k =
+    Array.fold_left (fun k v ->
+      max k (magnitude v)
+    ) 1 a
+  in
+
+  (* Because access to ocaml strings is performed on an 8-bit basis,
+     two cases arise. If [k] is less than 8, then we can pack multiple
+     array entries into a single character. If [k] is greater than 8,
+     then we must use multiple characters to represent a single array
+     entry. *)
+
+  if k <= 8 then begin
+
+    (* [w] is the number of array entries that we pack in a character. *)
+
+    assert (8 mod k = 0);
+    let w = 8 / k in
+
+    (* [n] is the length of the string that we allocate. *)
+
+    let n =
+      if m mod w = 0 then
+       m / w
+      else
+       m / w + 1
+    in
+
+    let s =
+      String.create n
+    in
+
+    (* Define a reader for the source array. The reader might run off
+       the end if [w] does not divide [m]. *)
+
+    let i = ref 0 in
+    let next () =
+      let ii = !i in
+      if ii = m then
+       0 (* ran off the end, pad with zeroes *)
+      else
+       let v = a.(ii) in
+       i := ii + 1;
+       v
+    in
+
+    (* Fill up the string. *)
+
+    for j = 0 to n - 1 do
+      let c = ref 0 in
+      for x = 1 to w do
+       c := (!c lsl k) lor next()
+      done;
+      s.[j] <- Char.chr !c
+    done;
+
+    (* Done. *)
+
+    k, s
+
+  end
+  else begin (* k > 8 *)
+
+    (* [w] is the number of characters that we use to encode an array entry. *)
+
+    assert (k mod 8 = 0);
+    let w = k / 8 in
+
+    (* [n] is the length of the string that we allocate. *)
+
+    let n =
+      m * w
+    in
+
+    let s =
+      String.create n
+    in
+
+    (* Fill up the string. *)
+
+    for i = 0 to m - 1 do
+      let v = ref a.(i) in
+      for x = 1 to w do
+       s.[(i + 1) * w - x] <- Char.chr (!v land 255);
+       v := !v lsr 8
+      done
+    done;
+
+    (* Done. *)
+
+    k, s
+
+  end
+
+(* Access to a string. *)
+
+let read (s : string) (i : int) : int =
+  Char.code (String.unsafe_get s i)
+
+(* [get1 t i] returns the integer stored in the packed array [t] at index [i].
+   It assumes (and does not check) that the array's bit width is [1]. The
+   parameter [t] is just a string. *)
+
+let get1 (s : string) (i : int) : int =
+  let c = read s (i lsr 3) in
+  let c = c lsr ((lnot i) land 0b111) in
+  let c = c land 0b1 in
+  c
+
+(* [get t i] returns the integer stored in the packed array [t] at index [i]. *)
+
+(* Together, [pack] and [get] satisfy the following property: if the index [i]
+   is within bounds, then [get (pack a) i] equals [a.(i)]. *)
+
+let get ((k, s) : t) (i : int) : int =
+  match k with
+  | 1 ->
+      get1 s i
+  | 2 ->
+      let c = read s (i lsr 2) in
+      let c = c lsr (2 * ((lnot i) land 0b11)) in
+      let c = c land 0b11 in
+      c
+  | 4 ->
+      let c = read s (i lsr 1) in
+      let c = c lsr (4 * ((lnot i) land 0b1)) in
+      let c = c land 0b1111 in
+      c
+  | 8 ->
+      read s i
+  | 16 ->
+      let j = 2 * i in
+      (read s j) lsl 8 + read s (j + 1)
+  | _ ->
+      assert (k = 32); (* 64 bits unlikely, not supported *)
+      let j = 4 * i in
+      (((read s j lsl 8) + read s (j + 1)) lsl 8 + read s (j + 2)) lsl 8 + read s (j + 3)
+
diff --git a/bundles/menhirLib/menhir-20120123/src/packedIntArray.mli b/bundles/menhirLib/menhir-20120123/src/packedIntArray.mli
new file mode 100644 (file)
index 0000000..5705193
--- /dev/null
@@ -0,0 +1,50 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the GNU Library General Public License, with the   *)
+(*  special exception on linking described in file LICENSE.               *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* A packed integer array is represented as a pair of an integer [k] and
+   a string [s]. The integer [k] is the number of bits per integer that we
+   use. The string [s] is just an array of bits, which is read in 8-bit
+   chunks. *)
+
+(* The ocaml programming language treats string literals and array literals
+   in slightly different ways: the former are statically allocated, while
+   the latter are dynamically allocated. (This is rather arbitrary.) In the
+   context of Menhir's table-based back-end, where compact, immutable
+   integer arrays are needed, ocaml strings are preferable to ocaml arrays. *)
+
+type t =
+  int * string
+
+(* [pack a] turns an array of integers into a packed integer array. *)
+
+(* Because the sign bit is the most significant bit, the magnitude of
+   any negative number is the word size. In other words, [pack] does
+   not achieve any space savings as soon as [a] contains any negative
+   numbers, even if they are ``small''. *)
+
+val pack: int array -> t
+
+(* [get t i] returns the integer stored in the packed array [t] at index [i]. *)
+
+(* Together, [pack] and [get] satisfy the following property: if the index [i]
+   is within bounds, then [get (pack a) i] equals [a.(i)]. *)
+
+val get: t -> int -> int
+
+(* [get1 t i] returns the integer stored in the packed array [t] at index [i].
+   It assumes (and does not check) that the array's bit width is [1]. The
+   parameter [t] is just a string. *)
+
+val get1: string -> int -> int
+
diff --git a/bundles/menhirLib/menhir-20120123/src/parameterizedGrammar.ml b/bundles/menhirLib/menhir-20120123/src/parameterizedGrammar.ml
new file mode 100644 (file)
index 0000000..02be1b5
--- /dev/null
@@ -0,0 +1,639 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+open Positions
+open Syntax
+open UnparameterizedSyntax
+open InternalSyntax
+open Misc
+
+(* Inference for non terminals. *)
+
+(* Unification variables convey [variable_info] to describe
+   the multi-equation they take part of. *)
+type variable_info = 
+    {
+      mutable structure : nt_type option;
+      mutable name      : string option;
+      mutable mark      : Mark.t
+    }
+
+(* [UnionFind] is used to improve the union and the equality test
+   between multi-equations. *)
+and variable = variable_info UnionFind.point
+
+(* Types are simple types. 
+   [star] denotes the type of ground symbol (non terminal or terminal).
+   [Arrow] describes the type of a parameterized non terminal. *)
+and nt_type = 
+    Arrow of variable list 
+
+let star =
+  Arrow []
+
+(* [var_name] is a name generator for unification variables. *)
+let var_name =
+  let name_counter = ref (-1) in
+  let next_name () = 
+    incr name_counter;
+    String.make 1 (char_of_int (97 + !name_counter mod 26))
+    ^ let d = !name_counter / 26 in if d = 0 then "" else string_of_int d
+  in
+    fun v -> 
+      let repr = UnionFind.find v in 
+       match repr.name with
+           None -> let name = next_name () in repr.name <- Some name; name
+         | Some x -> x
+
+(* [string_of_nt_type] is a simple pretty printer for types (they can be 
+   recursive). *)
+
+(* 2011/04/05: types can no longer be recursive, but I won't touch the printer -fpottier *)
+
+let string_of paren_fun ?paren ?colors t : string = 
+  let colors = 
+    match colors with 
+       None    -> (Mark.fresh (), Mark.fresh ()) 
+      | Some cs -> cs 
+  in
+  let s, p = paren_fun colors t in
+    if paren <> None && p = true then 
+      "("^ s ^")"
+    else s
+
+let rec paren_nt_type ((white, black) as colors) = function
+    
+    Arrow [] -> 
+      "*", false
+
+  | Arrow ins ->
+      let args = separated_list_to_string 
+       (string_of paren_var ~paren:true ~colors) ", " ins 
+      in
+      let args = 
+       if List.length ins > 1 then
+         "("^ args ^ ")"
+       else 
+         args
+      in
+       args^" -> *", true
+       
+and paren_var (white, black) x = 
+  let descr = UnionFind.find x in
+    if Mark.same descr.mark white then begin
+      descr.mark <- black;
+      var_name x, false
+    end 
+    else begin 
+      descr.mark <- white;
+      let s, p = match descr.structure with
+         None -> var_name x, false
+       | Some t -> paren_nt_type (white, black) t
+      in
+       if Mark.same descr.mark black then
+         (var_name x ^ " = " ^ s, true)
+       else 
+         (s, p)
+    end
+
+let string_of_nt_type ?paren ?colors t = 
+  string_of ?colors paren_nt_type t
+
+let string_of_var ?paren ?colors v = 
+  string_of ?colors paren_var v
+
+(* [print_env env] returns a string description of the typing environment. *)
+let print_env = 
+  List.iter (fun (k, (_, v)) -> 
+              Printf.eprintf "%s: %s\n" k (string_of_var v))
+
+(* [occurs_check x y] checks that [x] does not occur within [y]. *)
+
+let dfs action x =
+
+  let black = Mark.fresh () in
+
+  let rec visit_var x =
+    let descr = UnionFind.find x in 
+    if not (Mark.same descr.mark black) then begin
+      descr.mark <- black;
+      action x;
+      match descr.structure with
+      | None ->
+         ()
+      | Some t -> 
+         visit_term t
+    end
+
+  and visit_term (Arrow ins) =
+    List.iter visit_var ins
+
+  in
+  visit_var x
+
+exception OccursError of variable * variable
+
+let occurs_check x y =
+  dfs (fun z -> if UnionFind.equivalent x z then raise (OccursError (x, y))) y
+
+(* First order unification. *)
+
+(* 2011/04/05: perform an eager occurs check and prevent the construction
+   of any cycles. *)
+
+let fresh_flexible_variable () = 
+  UnionFind.fresh { structure = None; name = None; mark = Mark.none }
+
+let fresh_structured_variable t = 
+  UnionFind.fresh { structure = Some t; name = None; mark = Mark.none }
+
+let star_variable =
+  fresh_structured_variable star
+
+exception UnificationError of nt_type * nt_type
+exception BadArityError of int * int
+
+let rec unify_var toplevel x y =
+  if not (UnionFind.equivalent x y) then
+    let reprx, repry = UnionFind.find x, UnionFind.find y in
+      match reprx.structure, repry.structure with
+         None, Some t    -> occurs_check x y; UnionFind.union x y
+       | Some t, None    -> occurs_check y x; UnionFind.union y x
+       | None, None      -> UnionFind.union x y
+       | Some t, Some t' -> unify toplevel t t'; UnionFind.union x y
+           
+and unify toplevel t1 t2 = 
+  match t1, t2 with
+
+    | Arrow ins, Arrow ins' ->
+       let n1, n2 = List.length ins, List.length ins' in
+       if n1 <> n2 then
+         if n1 = 0 || n2 = 0 || not toplevel then
+           raise (UnificationError (t1, t2))
+         else
+           (* the flag [toplevel] is used only here and influences which
+              exception is raised; BadArityError is raised only at toplevel *)
+           raise (BadArityError (n1, n2));
+       List.iter2 (unify_var false) ins ins'
+
+let unify_var x y =
+  unify_var true x y
+
+(* Typing environment. *)
+type environment =
+    (string * (Positions.t list * variable)) list
+
+(* [lookup x env] returns the type related to [x] in the typing environment
+   [env]. 
+   By convention, identifiers that are not in [env] are terminals. They are
+   given the type [Star]. *)
+let lookup x (env: environment) = 
+  try 
+    snd (List.assoc x env)
+  with Not_found -> star_variable
+
+(* This function checks that the symbol [k] has the type [expected_type]. *)
+let check positions env k expected_type =
+  let inference_var = lookup k env in
+  let checking_var = fresh_structured_variable expected_type in
+    try
+      unify_var inference_var checking_var
+    with 
+       UnificationError (t1, t2) ->
+         Error.error
+           positions
+           (Printf.sprintf 
+              "How is this symbol parameterized?\n\
+             It is used at sorts %s and %s.\n\
+              The sort %s is not compatible with the sort %s."
+              (string_of_var inference_var) (string_of_var checking_var)
+              (string_of_nt_type t1) (string_of_nt_type t2))
+           
+      | BadArityError (n1, n2) ->
+         Error.error
+           positions
+           (Printf.sprintf
+              "does this symbol expect %d or %d arguments?" 
+              (min n1 n2) (max n1 n2))
+
+      | OccursError (x, y) ->
+         Error.error
+           positions
+           (Printf.sprintf 
+              "How is this symbol parameterized?\n\
+             It is used at sorts %s and %s.\n\
+              The sort %s cannot be unified with the sort %s."
+              (string_of_var inference_var) (string_of_var checking_var)
+              (string_of_var x) (string_of_var y))
+         
+
+
+(* An identifier can be used either in a total application or as a
+   higher-order non terminal (no partial application is allowed). *)
+let rec parameter_type env = function
+  | ParameterVar x ->
+      lookup x.value env
+
+  | ParameterApp (x, args) ->
+      assert (args <> []);
+      let expected_type =
+       (* [x] is applied, it must be to the exact number 
+          of arguments. *)
+       Arrow (List.map (parameter_type env) args) 
+      in
+       (* Check the well-formedness of the application. *)
+       check [x.position] env x.value expected_type;
+
+       (* Similarly, if it was a total application the result is 
+          [Star] otherwise it is the flexible variable. *)
+       star_variable
+
+let check_grammar p_grammar = 
+  (* [n] is the grammar size. *)
+  let n        = StringMap.cardinal p_grammar.p_rules in
+
+  (* The successors of the non terminal [N] are its producers. It 
+     induce a graph over the non terminals and its successor function
+     is implemented by [successors]. Non terminals are indexed using
+     [nt].
+  *) 
+  let nt, conv, iconv = index_map p_grammar.p_rules in
+  let parameters, name, branches, positions = 
+    (fun n -> (nt n).pr_parameters), (fun n -> (nt n).pr_nt),
+    (fun n -> (nt n).pr_branches), (fun n -> (nt n).pr_positions)
+  in
+    
+  (* The successors function is implemented as an array using the 
+     indexing previously created. *)
+  let successors = 
+    Array.init n (fun node -> 
+      (* We only are interested by parameterized non terminals. *)
+      if parameters node <> [] then
+       List.fold_left (fun succs { pr_producers = symbols } ->
+         List.fold_left (fun succs -> function (_, p) -> 
+           let symbol, _ = Parameters.unapp p in
+           try 
+             let symbol_node = conv symbol.value in
+               (* [symbol] is a parameterized non terminal, we add it 
+                  to the successors set. *)
+               if parameters symbol_node <> [] then
+                 IntSet.add symbol_node succs
+               else 
+                 succs
+           with Not_found -> 
+             (* [symbol] is a token, it is not interesting for type inference
+                purpose. *)
+             succs
+         ) succs symbols
+        ) IntSet.empty (branches node)
+      else
+       Misc.IntSet.empty
+    )
+  in
+
+  (* The successors function and the indexing induce the following graph 
+     module. *)
+  let module RulesGraph = 
+      struct
+
+       type node = int
+
+       let n = n
+
+       let index node = 
+         node
+
+       let successors f node = 
+         IntSet.iter f successors.(node)
+
+       let iter f = 
+         for i = 0 to n - 1 do 
+           f i
+         done
+
+      end
+  in
+  let module ConnectedComponents = Tarjan.Run (RulesGraph) in
+    (* We check that:
+       - all the parameterized definitions of a particular component
+       have the same number of parameters.
+       - every parameterized non terminal definition always uses
+       parameterized definitions of the same component with its
+       formal parameters.
+    
+       Components are marked during the traversal:
+       -1 means unvisited
+       n with n > 0 is the number of parameters of the clique.
+    *)
+  let unseen = -1 in
+  let marked_components = Array.create n unseen in
+    
+  let flexible_arrow args =
+    let ty = Arrow (List.map (fun _ -> fresh_flexible_variable ()) args) in
+      fresh_structured_variable ty 
+  in
+
+  (* [nt_type i] is the type of the i-th non terminal. *)
+  let nt_type i =
+    match parameters i with
+      | [] -> 
+         star_variable
+           
+      | x -> 
+         flexible_arrow x
+  in
+
+  (* [actual_parameters_as_formal] is the well-formedness checker for 
+     parameterized non terminal application. *)
+  let actual_parameters_as_formal actual_parameters formal_parameters = 
+    List.for_all2 (fun y -> (function ParameterVar x -> x.value = y 
+                             | _ -> false)) 
+      formal_parameters actual_parameters
+  in
+
+  (* The environment is initialized. *)
+  let env : environment = StringMap.fold  
+    (fun k r acu -> 
+       (k, (r.pr_positions, nt_type (conv k))) 
+       :: acu)
+    p_grammar.p_rules []
+  in
+
+    (* We traverse the graph checking each parameterized non terminal
+       definition is well-formed. *)
+    RulesGraph.iter 
+      (fun i ->
+        let params    = parameters i 
+        and iname     = name i 
+        and repr      = ConnectedComponents.representative i 
+        and positions = positions i
+        in
+
+        (* The environment is augmented with the parameters whose types are
+           unknown. *)
+        let env' = List.map 
+          (fun k -> (k, (positions, fresh_flexible_variable ()))) params
+        in
+        let env = env' @ env in
+          
+        (* The type of the parameterized non terminal is constrained to be
+           [expected_ty]. *)
+        let check_type () = 
+          check positions env iname (Arrow (List.map (fun (_, (_, t)) -> t) env'))
+        in
+
+        (* We check the number of parameters. *)
+        let check_parameters () = 
+          let parameters_len = List.length params in
+            (* The component is visited for the first time. *)
+            if marked_components.(repr) = unseen then
+              marked_components.(repr) <- parameters_len
+            else (* Otherwise, we check that the arity is homogeneous 
+                    in the component. *) 
+              if marked_components.(repr) <> parameters_len then 
+                Error.error positions
+                  (Printf.sprintf 
+                     "Mutually recursive definitions must have the same parameters.\n\
+                       This is not the case for %s and %s."
+                        (name repr) iname)
+        in
+
+       (* In each production rule, the parameterized non terminal
+          of the same component must be instantiated with the same
+          formal arguments. *)
+        let check_producers () =
+          List.iter 
+            (fun { pr_producers = symbols } -> List.iter 
+               (function (_, p) ->
+                  let symbol, actuals = Parameters.unapp p in
+                  (* We take the use of each symbol into account. *)
+                    check [ symbol.position ] env symbol.value 
+                      (if actuals = [] then star else 
+                         Arrow (List.map (parameter_type env) actuals));
+                  (* If it is in the same component, check in addition that
+                     the arguments are the formal arguments. *)
+                  try 
+                    let idx = conv symbol.value in 
+                      if ConnectedComponents.representative idx = repr then
+                        if not (actual_parameters_as_formal actuals params)
+                        then
+                          Error.error [ symbol.position ]
+                            (Printf.sprintf
+                               "Mutually recursive definitions must have the same \
+                                 parameters.\n\
+                                This is not the case for %s."
+                                (let name1, name2 = (name idx), (name i) in
+                                   if name1 <> name2 then name1 ^ " and "^ name2
+                                   else name1))
+                  with _ -> ())
+                   symbols) (branches i)
+        in
+          check_type ();
+          check_parameters ();
+          check_producers ())
+
+      
+let rec subst_parameter subst = function
+  | ParameterVar x ->
+      (try 
+       List.assoc x.value subst 
+      with Not_found ->
+       ParameterVar x)
+
+  | ParameterApp (x, ps) -> 
+      (try 
+       match List.assoc x.value subst with
+         | ParameterVar y ->
+             ParameterApp (y, List.map (subst_parameter subst) ps)
+
+         | ParameterApp _ ->
+             (* Type-checking ensures that we cannot do partial
+                application. Consequently, if an higher-order non terminal
+                is an actual argument, it cannot be the result of a 
+                partial application. *)
+             assert false
+
+      with Not_found -> 
+         ParameterApp (x, List.map (subst_parameter subst) ps))
+
+let subst_parameters subst = 
+  List.map (subst_parameter subst)
+
+let names_of_p_grammar p_grammar = 
+  StringMap.fold (fun tok _ acu -> StringSet.add tok acu) 
+    p_grammar.p_tokens StringSet.empty 
+    $$ (StringMap.fold (fun nt _ acu -> StringSet.add nt acu)
+         p_grammar.p_rules)
+
+let expand p_grammar = 
+  (* Check that it is safe to expand this parameterized grammar. *)
+  check_grammar p_grammar;
+
+  (* Set up a mechanism that ensures that names are unique -- and, in
+     fact, ensures the stronger condition that normalized names are
+     unique. *)
+
+  let names =
+    ref (StringSet.empty) 
+  in
+  let ensure_fresh name =
+    let normalized_name = Misc.normalize name in
+    if StringSet.mem normalized_name !names then
+      Error.error []
+       (Printf.sprintf "internal name clash over %s" normalized_name);
+    names := StringSet.add normalized_name !names;
+    name
+  in 
+  let expanded_rules = 
+    Hashtbl.create 13 
+  in
+  let module InstanceTable = 
+    Hashtbl.Make (Parameters)
+  in
+  let rule_names = 
+    InstanceTable.create 13 
+  in
+
+  (* [mangle p] chooses a name for the new nonterminal symbol that corresponds
+     to the parameter [p]. *)
+
+  let rec mangle = function 
+    | ParameterVar x
+    | ParameterApp (x, []) ->
+       Positions.value x
+    | ParameterApp (x, ps) ->
+
+       (* We include parentheses and commas in the names that we
+          assign to expanded nonterminals, because that is more
+          readable and acceptable in many situations. We replace them
+          with underscores in situations where these characters are
+          not valid. *)
+
+       Printf.sprintf "%s(%s)"
+         (Positions.value x)
+         (separated_list_to_string mangle "," ps)
+
+  in
+  let name_of symbol parameters = 
+    let param = ParameterApp (symbol, parameters) in
+    try 
+      InstanceTable.find rule_names param
+    with Not_found ->
+      let name = ensure_fresh (mangle param) in
+      InstanceTable.add rule_names param name;
+      name
+  in
+  (* Given the substitution [subst] from parameters to non terminal, we
+     instantiate the parameterized branch. *)
+  let rec expand_branch subst pbranch = 
+    let new_producers = List.map 
+      (function (ido, p) ->
+        let sym, actual_parameters = 
+          Parameters.unapp p in
+        let sym, actual_parameters =         
+          try 
+            match List.assoc sym.value subst with
+              | ParameterVar x ->
+                  x, subst_parameters subst actual_parameters
+
+              | ParameterApp (x, ps) ->
+                  assert (actual_parameters = []);
+                  x, ps
+                      
+          with Not_found -> 
+            sym, subst_parameters subst actual_parameters
+        in
+          (* Instantiate the definition of the producer. *)
+          (expand_branches subst sym actual_parameters, Option.map Positions.value ido))
+      pbranch.pr_producers
+    in
+      {
+        branch_position          = pbranch.pr_branch_position;
+       producers                = new_producers;
+       action                   = pbranch.pr_action;
+       branch_shift_precedence  = pbranch.pr_branch_shift_precedence;
+       branch_reduce_precedence = pbranch.pr_branch_reduce_precedence;
+      }
+
+  (* Instantiate the branches of sym for a particular set of actual
+     parameters. *)
+  and expand_branches subst sym actual_parameters =
+    let nsym = name_of sym actual_parameters in
+      try
+       if not (Hashtbl.mem expanded_rules nsym) then begin
+         let prule = StringMap.find (Positions.value sym) p_grammar.p_rules in
+         let subst = 
+           (* Type checking ensures that parameterized non terminal 
+              instantiations are well defined. *)
+           assert (List.length prule.pr_parameters 
+                   = List.length actual_parameters);
+           List.combine prule.pr_parameters actual_parameters @ subst in
+           Hashtbl.add expanded_rules nsym 
+             { branches = []; positions = []; inline_flag = false };
+         let rules = List.map (expand_branch subst) prule.pr_branches in
+           Hashtbl.replace expanded_rules nsym
+             { 
+               branches    = rules; 
+               positions   = prule.pr_positions; 
+               inline_flag = prule.pr_inline_flag;
+             }
+       end;
+       nsym
+      (* If [sym] is a terminal, then it is not in [p_grammar.p_rules]. 
+        Expansion is not needed. *)
+      with Not_found -> Positions.value sym 
+  in
+  let rec types_from_list = function
+    | [] -> StringMap.empty
+    | (nt, ty)::q ->
+        let accu = types_from_list q in
+        let mangled = mangle nt in
+        if StringMap.mem mangled accu then
+          Error.error [Positions.position (Parameters.with_pos nt)]
+            (Printf.sprintf
+               "There are multiple %%type definitions for nonterminal %s."
+               mangled);
+        StringMap.add mangled (Positions.value ty) accu
+  in
+
+  let start_symbols = StringMap.domain (p_grammar.p_start_symbols) in
+  {
+    preludes      = p_grammar.p_preludes;
+    postludes    = p_grammar.p_postludes;
+    parameters    = p_grammar.p_parameters;
+    start_symbols = start_symbols;
+    types         = types_from_list p_grammar.p_types;
+    tokens       = p_grammar.p_tokens;
+    rules        = 
+      let closed_rules = StringMap.fold 
+       (fun k prule rules -> 
+          (* If [k] is a start symbol then it cannot be parameterized. *)
+          if prule.pr_parameters <> [] && StringSet.mem k start_symbols then
+            Error.error []
+              (Printf.sprintf "The start symbol `%s' cannot be parameterized."
+                 k);
+
+          (* Entry points are the closed non terminals. *)
+          if prule.pr_parameters = [] then 
+            StringMap.add k { 
+              branches    = List.map (expand_branch []) prule.pr_branches;
+              positions   = prule.pr_positions;
+              inline_flag = prule.pr_inline_flag;
+            } rules
+          else rules)
+       p_grammar.p_rules
+       StringMap.empty
+      in
+       Hashtbl.fold StringMap.add expanded_rules closed_rules 
+  }
diff --git a/bundles/menhirLib/menhir-20120123/src/parameterizedGrammar.mli b/bundles/menhirLib/menhir-20120123/src/parameterizedGrammar.mli
new file mode 100644 (file)
index 0000000..5e835a2
--- /dev/null
@@ -0,0 +1,31 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* $Id: parameterizedGrammar.mli,v 1.6 2005/12/01 16:20:06 regisgia Exp $ *)
+
+(* This turns a grammar where nonterminal symbols can be parameterized
+   into a grammar where nonterminal symbols are not parameterized. The
+   transformation is a textual expansion process, whose termination is
+   guaranteed by a simple type system.
+
+   Expansion creates new nonterminal symbols whose names contain
+   parentheses and commas. These names can be printed directly in
+   informational messages (error messages, conflict reports,
+   descriptions of the automaton, etc.). However, they must be
+   sanitized via [Misc.normalize] when printed in a context where a
+   valid identifier is expected. *)
+
+val expand : InternalSyntax.grammar -> UnparameterizedSyntax.grammar
+
+
diff --git a/bundles/menhirLib/menhir-20120123/src/parameters.ml b/bundles/menhirLib/menhir-20120123/src/parameters.ml
new file mode 100644 (file)
index 0000000..bebb71a
--- /dev/null
@@ -0,0 +1,83 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* $Id: parameters.ml,v 1.12 2005/12/02 16:16:22 regisgia Exp $ *)
+
+(* TEMPORARY clean up and write an .mli file *)
+
+open Syntax
+open Misc
+open Positions
+
+let app p ps =
+  match ps with
+  | [] ->
+      ParameterVar p
+  | _ ->
+      ParameterApp (p, ps)
+
+let oapp1 o p =
+  match o with
+  | None ->
+      p
+  | Some var ->
+      ParameterApp (var, [ p ])
+
+let unapp = function
+  | ParameterVar x ->
+      (x, [])
+
+  | ParameterApp (p, ps) ->
+      (p, ps)
+
+let rec map f = function
+  | ParameterVar x ->
+      ParameterVar (f x)
+
+  | ParameterApp (p, ps) ->
+      ParameterApp (f p, List.map (map f) ps)
+
+
+let rec fold f init = function
+  | ParameterVar x ->
+      f init x
+
+  | ParameterApp (p, ps) ->
+      f (List.fold_left (fold f) init ps) p
+       
+let identifiers m p = 
+  fold (fun acu x -> StringMap.add x.value x.position acu) m p
+
+type t = parameter
+
+let rec equal x y = 
+  match x, y with
+    | ParameterVar x, ParameterVar y when x.value = y.value ->
+       true
+    | ParameterApp (p1, p2), ParameterApp (p1', p2') ->
+       p1.value = p1'.value && List.for_all2 equal p2 p2'
+    | _ -> false
+
+let hash = function
+  | ParameterVar x
+  | ParameterApp (x, _) ->
+      Hashtbl.hash (Positions.value x)
+
+let position = function
+  | ParameterVar x 
+  | ParameterApp (x, _) ->
+      Positions.position x
+
+let with_pos p =
+  Positions.with_pos (position p) p
diff --git a/bundles/menhirLib/menhir-20120123/src/parser.mly b/bundles/menhirLib/menhir-20120123/src/parser.mly
new file mode 100644 (file)
index 0000000..6e64df4
--- /dev/null
@@ -0,0 +1,344 @@
+/**************************************************************************/
+/*                                                                        */
+/*  Menhir                                                                */
+/*                                                                        */
+/*  François Pottier, INRIA Rocquencourt                                  */
+/*  Yann Régis-Gianas, PPS, Université Paris Diderot                      */
+/*                                                                        */
+/*  Copyright 2005-2008 Institut National de Recherche en Informatique    */
+/*  et en Automatique. All rights reserved. This file is distributed      */
+/*  under the terms of the Q Public License version 1.0, with the change  */
+/*  described in file LICENSE.                                            */
+/*                                                                        */
+/**************************************************************************/
+
+/* This is the crude version of the parser. It is meant to be processed
+   by ocamlyacc. Its existence is necessary for bootstrapping. It is kept
+   in sync with [fancy-parser]. The two parsers accept the same language,
+   but [fancy-parser] performs more refined error recovery. */
+
+%{
+
+open Keyword
+open ConcreteSyntax
+open Syntax
+open Positions
+
+%}
+
+%token TOKEN TYPE LEFT RIGHT NONASSOC START PREC PUBLIC COLON BAR EOF EQUAL 
+%token INLINE LPAREN RPAREN COMMA QUESTION STAR PLUS PARAMETER
+%token <string Positions.located> LID UID 
+%token <Stretch.t> HEADER
+%token <Stretch.ocamltype> OCAMLTYPE
+%token <string Lazy.t> PERCENTPERCENT
+%token <Syntax.action> ACTION
+%start grammar
+%type <ConcreteSyntax.grammar> grammar
+
+/* These declarations solve a shift-reduce conflict in favor of
+   shifting: when the declaration of a non-terminal symbol begins with
+   a leading bar, it is understood as an (insignificant) leading
+   optional bar, *not* as an empty right-hand side followed by a bar.
+   This ambiguity arises due to the existence of a new notation for
+   letting several productions share a single semantic action. */
+
+%nonassoc no_optional_bar
+%nonassoc BAR
+
+%%
+
+/* ------------------------------------------------------------------------- */
+/* A grammar consists of declarations and rules, followed by an optional
+   trailer, which we do not parse. */
+
+grammar:
+  declarations PERCENTPERCENT rules trailer
+    { 
+      { 
+       pg_filename          = ""; (* filled in by the caller *)
+       pg_declarations      = List.rev $1;
+       pg_rules             = $3;
+       pg_trailer           = $4 
+      }
+    }
+
+trailer:
+  EOF
+    { None }
+| PERCENTPERCENT /* followed by actual trailer */
+    { Some (Lazy.force $1) }
+
+/* ------------------------------------------------------------------------- */
+/* A declaration is an %{ Objective Caml header %}, or a %token, %start,
+   %type, %left, %right, or %nonassoc declaration. */
+
+declarations:
+  /* epsilon */
+    { [] }
+| declarations declaration
+    { $2 @ $1 }
+
+declaration:
+| HEADER /* lexically delimited by %{ ... %} */
+    { [ unknown_pos (DCode $1) ] }
+
+| TOKEN optional_ocamltype terminals
+    { List.map (Positions.map (fun terminal -> DToken ($2, terminal))) $3 }
+
+| START nonterminals
+    { List.map (Positions.map (fun nonterminal -> DStart nonterminal)) $2 }
+
+| TYPE OCAMLTYPE actual_parameters
+    { List.map (Positions.map (fun nt -> DType ($2, nt)))
+        (List.map Parameters.with_pos $3) }
+
+| START OCAMLTYPE nonterminals
+    /* %start <ocamltype> foo is syntactic sugar for %start foo %type <ocamltype> foo */
+    { Misc.mapd (fun ntloc -> 
+        Positions.mapd (fun nt -> DStart nt, DType ($2, ParameterVar ntloc)) ntloc) $3 }
+
+| priority_keyword symbols
+    { let prec = ParserAux.current_token_precedence (rhs_start_pos 1) (rhs_end_pos 1) in
+      List.map (Positions.map (fun symbol -> DTokenProperties (symbol, $1, prec))) $2 }
+
+| PARAMETER OCAMLTYPE
+    { [ unknown_pos (DParameter $2) ] }
+
+optional_ocamltype:
+  /* epsilon */
+    { None }
+| OCAMLTYPE /* lexically delimited by angle brackets */
+    { Some $1 }
+
+priority_keyword:
+  LEFT
+    { LeftAssoc }
+| RIGHT
+    { RightAssoc }
+| NONASSOC
+    { NonAssoc }
+
+/* ------------------------------------------------------------------------- */
+/* A symbol is a terminal or nonterminal symbol. One would like to
+   require nonterminal symbols to begin with a lowercase letter, so as
+   to lexically distinguish them from terminal symbols, which must
+   begin with an uppercase letter. However, for compatibility with
+   ocamlyacc, this is impossible. It can be required only for
+   nonterminal symbols that are also start symbols. */
+
+symbols:
+  /* epsilon */
+    { [] }
+| symbols optional_comma symbol
+    { $3 :: $1 }
+
+symbol:
+  LID
+    { $1 }
+| UID
+    { $1 }
+
+optional_comma:
+  /* epsilon */
+    { () }
+| COMMA
+    { () }
+
+/* ------------------------------------------------------------------------- */
+/* Terminals must begin with an uppercase letter. Nonterminals that are
+   declared to be start symbols must begin with a lowercase letter. */
+
+terminals:
+  /* epsilon */
+    { [] }
+| terminals optional_comma UID
+    { $3 :: $1 }
+
+nonterminals:
+  /* epsilon */
+    { [] }
+| nonterminals LID
+    { $2 :: $1 }
+
+/* ------------------------------------------------------------------------- */
+/* A rule defines a symbol. It is optionally declared %public, and optionally
+   carries a number of formal parameters. The right-hand side of the definition
+   consists of a list of production groups. */
+
+rules:
+  /* epsilon */
+    { [] }
+| rules rule
+    { $2 :: $1 }
+
+rule:
+  flags
+  symbol
+  optional_formal_parameters
+  COLON optional_bar
+  production_group production_groups
+    { 
+      let public, inline = $1 in
+      { pr_public_flag = public; 
+       pr_inline_flag = inline;
+       pr_nt          = Positions.value $2;
+       pr_positions   = [ Positions.position $2 ];
+       pr_parameters  = $3;
+       pr_branches    = List.flatten ($6 :: List.rev $7)
+      }
+    }
+
+flags:
+  /* epsilon */
+    { false, false }
+| PUBLIC
+    { true, false }
+| INLINE
+    { false, true }
+| PUBLIC INLINE
+    { true, true }
+| INLINE PUBLIC
+    { true, true }
+
+/* ------------------------------------------------------------------------- */
+/* Parameters are surroundered with parentheses and delimited by commas.
+   The syntax of actual parameters allows applications, whereas the syntax
+   of formal parameters does not. It also allows use of the "?", "+", and
+   "*" shortcuts. */
+
+optional_formal_parameters:
+  /* epsilon */
+    { [] }
+| LPAREN formal_parameters RPAREN
+    { $2 }
+
+formal_parameters:
+  symbol
+    { [ Positions.value $1 ] }
+| symbol COMMA formal_parameters
+    { Positions.value $1 :: $3 }
+
+optional_actual_parameters:
+  /* epsilon */
+    { [] }
+| LPAREN actual_parameters_comma RPAREN
+    { $2 }
+
+actual_parameters_comma:
+  actual_parameter 
+    { [ $1 ] }
+| actual_parameter COMMA actual_parameters_comma
+    { $1 :: $3 }
+
+actual_parameter:
+  symbol optional_actual_parameters optional_modifier
+    { Parameters.oapp1 $3 (Parameters.app $1 $2) }
+
+actual_parameters:
+  /* epsilon */
+    { [] }
+| actual_parameters optional_comma actual_parameter
+    { $3::$1 }
+
+optional_bar:
+  /* epsilon */ %prec no_optional_bar
+    { () }
+| BAR
+    { () }
+
+/* ------------------------------------------------------------------------- */
+/* The "?", "+", and "*" modifiers are short-hands for applications of
+   certain parameterized nonterminals, defined in the standard library. */
+
+optional_modifier:
+  /* epsilon */
+    { None }
+| modifier
+    { Some $1 }
+
+modifier:
+  QUESTION
+    { unknown_pos "option" }
+| PLUS
+    { unknown_pos "nonempty_list" }
+| STAR
+    { unknown_pos "list" }
+
+/* ------------------------------------------------------------------------- */
+/* A production group consists of a list of productions, followed by a
+   semantic action and an optional precedence specification. */
+
+production_groups:
+  /* epsilon */
+    { [] }
+| production_groups BAR production_group
+    { $3 :: $1 }
+
+production_group:
+  productions ACTION /* action is lexically delimited by braces */ optional_precedence
+    { 
+      let productions, action, oprec2 = $1, $2, $3 in
+
+      ParserAux.check_production_group
+       productions
+       (rhs_start_pos 2) (rhs_end_pos 2) action;
+
+      List.map (fun (producers, oprec1, rprec, pos) -> {
+       pr_producers                = producers;
+       pr_action                   = action;
+       pr_branch_shift_precedence  = ParserAux.override pos oprec1 oprec2;
+       pr_branch_reduce_precedence = rprec;
+       pr_branch_position          = pos
+      }) productions
+    }
+
+optional_precedence:
+  /* epsilon */
+    { None }
+| PREC symbol
+    { Some $2 }
+
+/* ------------------------------------------------------------------------- */
+/* A production is a list of producers, optionally followed by a
+   precedence declaration. Lists of productions are nonempty and
+   separated with bars. */
+
+productions:
+  production
+    { [ $1 ] }
+| production bar_productions
+    { $1 :: $2 }
+
+bar_productions:
+  BAR production
+    { [ $2 ] }
+| BAR production bar_productions
+    { $2 :: $3 }
+
+production:
+  producers optional_precedence
+    { List.rev $1,
+      $2,
+      ParserAux.current_reduce_precedence(),
+      Positions.lex_join (symbol_start_pos()) (symbol_end_pos())
+    }
+
+producers:
+  /* epsilon */ 
+    { [] }
+| producers producer
+    { $2 :: $1 }
+
+/* ------------------------------------------------------------------------- */
+/* A producer is an actual parameter, possibly preceded by a
+   binding. */
+
+producer:
+| actual_parameter
+    { None, $1 }
+| LID EQUAL actual_parameter
+    { Some $1, $3 }
+
+%%
+
diff --git a/bundles/menhirLib/menhir-20120123/src/parserAux.ml b/bundles/menhirLib/menhir-20120123/src/parserAux.ml
new file mode 100644 (file)
index 0000000..af8971c
--- /dev/null
@@ -0,0 +1,80 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+open Positions
+open Syntax
+
+let current_token_precedence =
+  let c = ref 0 in
+  fun pos1 pos2 ->
+    incr c;
+    PrecedenceLevel (Error.get_filemark (), !c, pos1, pos2)
+      
+let current_reduce_precedence =
+  let c = ref 0 in
+  fun () ->
+    incr c;
+    PrecedenceLevel (Error.get_filemark (), !c, Lexing.dummy_pos, Lexing.dummy_pos)
+
+module IdSet = Set.Make (struct
+  type t = identifier located
+  let compare id1 id2 =
+    compare (value id1) (value id2)
+end)
+
+let defined_identifiers ((ido, _) : producer) accu =
+  Option.fold IdSet.add ido accu
+
+let defined_identifiers (producers : producer list) =
+  List.fold_right defined_identifiers producers IdSet.empty
+
+let check_production_group right_hand_sides pos1 pos2 action =
+
+  begin
+    match right_hand_sides with
+    | [] ->
+       assert false
+    | ((producers : producer list), _, _, _) :: right_hand_sides ->
+       let ids = defined_identifiers producers in
+       List.iter (fun (producers, _, _, _) ->
+         let ids' = defined_identifiers producers in
+         try
+           let id =
+             IdSet.choose (IdSet.union
+                                 (IdSet.diff ids ids')
+                                 (IdSet.diff ids' ids))
+           in
+           Error.error [Positions.position id]
+             "Two productions that share a semantic action must define\n\
+              exactly the same identifiers."
+         with Not_found ->
+           ()
+         ) right_hand_sides
+  end;
+  begin
+    if List.length right_hand_sides > 1 && Action.use_dollar action then
+      Error.signal (Positions.two pos1 pos2)
+       "A semantic action that is shared between several productions must\n\
+        not use the $i notation -- semantic values must be named instead."
+  end
+
+let override pos o1 o2 =
+  match o1, o2 with
+  | Some _, Some _ ->
+      Error.signal [ pos ] "This production carries two %prec declarations.";
+      o2
+  | None, Some _ ->
+      o2
+  | _, None ->
+      o1
diff --git a/bundles/menhirLib/menhir-20120123/src/parserAux.mli b/bundles/menhirLib/menhir-20120123/src/parserAux.mli
new file mode 100644 (file)
index 0000000..6c75c54
--- /dev/null
@@ -0,0 +1,39 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* This module provides utilities that are shared by the two versions
+   of the parser. *)
+
+open Syntax
+
+(* TEMPORARY document *)
+
+val current_token_precedence: Lexing.position -> Lexing.position -> precedence_level
+val current_reduce_precedence: unit -> precedence_level
+
+(* [check_disjunctive_production] accepts production group and checks
+   that they all productions in the group define the same set of
+   identifiers. It also checks that the semantic action does not use
+   any [$i] keyword. *)
+
+val check_production_group:
+  (producer list * 'a * 'b * 'c) list ->
+  Lexing.position -> Lexing.position -> Action.t -> unit
+
+(* [override pos oprec1 oprec2] decides which of the two optional
+   %prec declarations [oprec1] and [oprec2] applies to a
+   production. It signals an error if the two are present. *)
+
+val override: Positions.t -> 'a option -> 'a option -> 'a option
+
diff --git a/bundles/menhirLib/menhir-20120123/src/partialGrammar.ml b/bundles/menhirLib/menhir-20120123/src/partialGrammar.ml
new file mode 100644 (file)
index 0000000..8e55c14
--- /dev/null
@@ -0,0 +1,777 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* $Id: partialGrammar.ml,v 1.63 2006/10/22 14:07:57 fpottier Exp $ *)
+open Misc
+open Syntax
+open Stretch
+open ConcreteSyntax
+open InternalSyntax
+open Positions
+open Keyword
+
+(* ------------------------------------------------------------------------- *)
+(* This adds one declaration [decl], as found in file [filename], to
+   the grammar [grammar]. *)
+
+let join_declaration filename (grammar : grammar) decl = 
+  match decl.value with
+
+  (* Preludes are stored in an arbitrary order. The order of
+     preludes within a single source file is preserved. Same
+     treatment for functor parameters. *)
+
+  | DCode code -> 
+      { grammar with p_preludes = grammar.p_preludes @ [ code ] }
+  | DParameter (Stretch.Declared stretch) -> 
+      { grammar with p_parameters = grammar.p_parameters @ [ stretch ] }
+  | DParameter (Stretch.Inferred _) ->
+      assert false
+
+  (* Token declarations are recorded. Things are made somewhat
+     difficult by the fact that %token and %left-%right-%nonassoc
+     declarations are independent. *)
+
+  | DToken (ocamltype, terminal) ->
+      let token_property = 
+       try
+
+         (* Retrieve any previous definition for this token. *)
+
+         let token_property =
+           StringMap.find terminal grammar.p_tokens
+         in
+
+         (* If the previous definition was actually a %token declaration
+            (as opposed to a %left, %right, or %nonassoc specification),
+            signal an error. *)
+
+         if token_property.tk_is_declared then
+           Error.errorp decl
+             (Printf.sprintf "the token %s has multiple definitions." terminal)
+
+         (* Otherwise, update the previous definition. *)
+
+         else 
+           { token_property with 
+             tk_is_declared = true;
+             tk_ocamltype   = ocamltype;
+             tk_filename    = filename;
+             tk_position    = decl.position;
+           }
+
+       with Not_found -> 
+
+         (* If no previous definition exists, create one. *)
+
+         { 
+           tk_filename      = filename; 
+           tk_ocamltype     = ocamltype;
+           tk_associativity = UndefinedAssoc;
+           tk_priority      = UndefinedPrecedence;
+           tk_position      = decl.position;
+           tk_is_declared   = true
+         } 
+
+      in
+      { grammar with
+       p_tokens = StringMap.add terminal token_property grammar.p_tokens }
+
+  (* Start symbols. *)
+
+  | DStart nonterminal ->
+      { grammar with
+        p_start_symbols = StringMap.add nonterminal decl.position grammar.p_start_symbols }
+
+  (* Type declarations for nonterminals. *)
+
+  | DType (ocamltype, nonterminal) ->
+      { grammar with
+          p_types = (nonterminal, with_pos (position decl) ocamltype)::grammar.p_types }
+
+  (* Token associativity and precedence. *)
+
+  | DTokenProperties (terminal, assoc, prec) ->
+
+      (* Retrieve the property record for this token, creating one
+        if none existed (but without deeming the token to have been
+        declared). *)
+
+      let token_properties, grammar = 
+       try 
+         StringMap.find terminal grammar.p_tokens, grammar
+       with Not_found -> 
+         let p = { 
+           tk_filename      = filename; 
+           tk_ocamltype     = None;
+           tk_associativity = UndefinedAssoc;
+           tk_priority      = prec;
+           tk_is_declared   = false;
+           (* Will be updated later. *)
+           tk_position      = decl.position;
+         } in 
+         p, { grammar with 
+              p_tokens = StringMap.add terminal p grammar.p_tokens }
+      in
+
+      (* Reject duplicate precedence declarations. *)
+
+      if token_properties.tk_associativity <> UndefinedAssoc then 
+       Error.error
+         [ decl.position; token_properties.tk_position ]
+         (Printf.sprintf "there are multiple precedence declarations for token %s." terminal);
+
+      (* Record the new declaration. *)
+
+      token_properties.tk_priority <- prec;
+      token_properties.tk_associativity <- assoc;
+      grammar
+
+(* ------------------------------------------------------------------------- *)
+(* This stores an optional trailer into a grammar. 
+   Trailers are stored in an arbitrary order. *)
+
+let join_trailer trailer grammar = 
+  match trailer with
+  | None -> 
+      grammar 
+  | Some trailer -> 
+      { grammar with p_postludes = trailer :: grammar.p_postludes }
+
+(* ------------------------------------------------------------------------- *)
+(* We rewrite definitions when nonterminals are renamed. The
+   renaming [phi] is an association list of names to names. *)
+
+type renaming =
+   (nonterminal * nonterminal) list
+
+let identity_renaming = 
+  [] 
+
+let rewrite_nonterminal (phi : renaming) nonterminal =
+  Misc.support_assoc phi nonterminal
+
+let rewrite_parameter phi parameter = 
+  Parameters.map (Positions.map (Misc.support_assoc phi)) parameter
+
+let rewrite_element phi (ido, parameter) =
+  ido, rewrite_parameter phi parameter
+
+let rewrite_branch phi ({ pr_producers = producers } as branch) =
+  { branch with pr_producers = List.map (rewrite_element phi) producers }
+
+let rewrite_branches phi branches =
+  match phi with
+  | [] ->
+      branches
+  | _ ->
+      List.map (rewrite_branch phi) branches
+
+let fresh_counter = ref 0 
+
+let names = ref StringSet.empty
+
+let use_name name = 
+  names := StringSet.add name !names
+
+let used_name name = 
+  StringSet.mem name !names
+
+let rec fresh ?(hint = "v") () = 
+  let name = 
+    incr fresh_counter;
+    hint ^ string_of_int !fresh_counter
+  in
+    if used_name name then
+      fresh ~hint ()
+    else (
+      use_name name;
+      name
+    )
+      
+(* Alpha conversion of [prule]. We rename bound parameters using
+   fresh names. *)
+let alphaconvert_rule parameters prule = 
+  let phi = 
+    List.combine parameters (List.map (fun x -> fresh ~hint:x ()) parameters)
+  in
+    { prule with
+       pr_parameters  = List.map (Misc.support_assoc phi) prule.pr_parameters;
+       pr_branches    = rewrite_branches phi prule.pr_branches
+    }
+
+(* Rewrite a rule taking bounded names into account. We rename parameters
+   to avoid capture. *)
+let rewrite_rule phi prule = 
+  let ids = 
+    List.fold_left (fun acu (f, d) -> StringSet.add f (StringSet.add d acu)) 
+      StringSet.empty phi 
+  in
+  let captured_parameters = 
+    List.filter (fun p -> StringSet.mem p ids) prule.pr_parameters
+  in
+  let prule = 
+    alphaconvert_rule captured_parameters prule
+  in
+    { prule with
+       pr_nt = rewrite_nonterminal phi prule.pr_nt;
+       pr_branches = rewrite_branches phi prule.pr_branches }
+      
+let rewrite_rules phi rules =
+  List.map (rewrite_rule phi) rules
+
+let rewrite_grammar phi grammar =
+  (* We assume that [phi] affects only private symbols, so it does
+     not affect the start symbols. *)
+  if phi = identity_renaming then 
+    grammar
+  else 
+    { grammar with pg_rules = rewrite_rules phi grammar.pg_rules }
+
+(* ------------------------------------------------------------------------- *)
+(* To rename (internalize) a nonterminal, we prefix it with its filename.
+   This guarantees that names are unique. *)
+
+let is_valid_nonterminal_character = function
+  | 'A' .. 'Z' 
+  | 'a' .. 'z'
+  | '_'
+  | '\192' .. '\214'
+  | '\216' .. '\246'
+  | '\248' .. '\255'
+  | '0' .. '9' ->
+      true
+  | _ ->
+      false
+
+let restrict filename =
+  let m = String.copy (Filename.chop_suffix filename (if Settings.coq then ".vy" else ".mly")) in
+  for i = 0 to String.length m - 1 do
+    if not (is_valid_nonterminal_character m.[i]) then
+      m.[i] <- '_'
+  done;
+  m
+
+let rename nonterminal filename = 
+  let name = restrict filename ^ "_" ^ nonterminal in
+    if used_name name then
+      fresh ~hint:name ()
+    else 
+      (use_name name; name)
+
+(* ------------------------------------------------------------------------- *)
+(* A nonterminal is considered public if it is declared using %public
+   or %start. *)
+
+let is_public grammar prule =
+  prule.pr_public_flag || StringMap.mem prule.pr_nt grammar.p_start_symbols
+
+(* ------------------------------------------------------------------------- *)
+type symbol_kind =
+    
+  (* The nonterminal is declared public at a particular position. *)
+  | PublicNonTerminal of Positions.t
+
+  (* The nonterminal is not declared public at a particular position. *)
+  | PrivateNonTerminal of Positions.t
+
+  (* The symbol is a token. *)
+  | Token of token_properties
+
+  (* We do not know yet what does the symbol means. 
+     This is defined in the sequel or it is free in the partial grammar. *)
+  | DontKnow of Positions.t
+
+type symbol_table =
+    (symbol, symbol_kind) Hashtbl.t
+
+let find_symbol symbols symbol =
+  Hashtbl.find symbols symbol
+
+let add_in_symbol_table symbols symbol kind =
+  use_name symbol;
+  Hashtbl.add symbols symbol kind;
+  symbols
+
+let replace_in_symbol_table symbols symbol kind =
+  Hashtbl.replace symbols symbol kind;
+  symbols
+
+let empty_symbol_table () =
+  Hashtbl.create 13
+
+let store_symbol symbols symbol kind = 
+  try
+    let sym_info = find_symbol symbols symbol in
+      match sym_info, kind with
+         
+       (* There are two definitions of the same symbol in one
+          particular unit. This is forbidden. *)
+       | (PublicNonTerminal p | PrivateNonTerminal p),
+         (PublicNonTerminal p' | PrivateNonTerminal p') ->
+           Error.error [ p; p'] 
+             (Printf.sprintf 
+                "the nonterminal symbol %s is multiply defined."
+                symbol)
+
+       (* The symbol is known to be a token but declared as a non terminal.*)
+       | (Token tkp, (PrivateNonTerminal p | PublicNonTerminal p)) 
+       | ((PrivateNonTerminal p | PublicNonTerminal p), Token tkp) ->
+           Error.error [ p; tkp.tk_position ]
+             (Printf.sprintf 
+                "The identifier %s is a reference to a token."
+                symbol)
+
+       (* We do not gain any piece of information. *)
+       | _, DontKnow _ | Token _, Token _ ->
+           symbols 
+
+       (* We learn that the symbol is a non terminal or a token. *)
+       | DontKnow _, _ ->
+           replace_in_symbol_table symbols symbol kind
+
+  with Not_found ->
+    add_in_symbol_table symbols symbol kind
+
+let store_used_symbol position tokens symbols symbol =
+  try
+    store_symbol symbols symbol (Token (StringMap.find symbol tokens))
+  with Not_found ->
+    store_symbol symbols symbol (DontKnow position)
+
+let non_terminal_is_not_reserved symbol positions = 
+  if symbol = "error" then
+    Error.error positions
+      (Printf.sprintf "%s is reserved and thus cannot be used \
+                       as a non-terminal symbol." symbol)
+
+let non_terminal_is_not_a_token tokens symbol positions = 
+  try
+    let tkp = StringMap.find symbol tokens in
+      Error.error (positions @ [ tkp.tk_position ])
+      (Printf.sprintf 
+        "The identifier %s is a reference to a token."
+        symbol)
+  with Not_found -> ()
+
+let store_public_nonterminal tokens symbols symbol positions =
+  non_terminal_is_not_reserved symbol positions;
+  non_terminal_is_not_a_token tokens symbol positions;
+  store_symbol symbols symbol (PublicNonTerminal (List.hd positions))
+      
+let store_private_nonterminal tokens symbols symbol positions =
+  non_terminal_is_not_reserved symbol positions;
+  non_terminal_is_not_a_token tokens symbol positions;
+  store_symbol symbols symbol (PrivateNonTerminal (List.hd positions))
+
+let string_of_kind = function
+  | PublicNonTerminal p ->
+      Printf.sprintf "public (%s)" (Positions.string_of_pos p)
+
+  | PrivateNonTerminal p ->
+      Printf.sprintf "private (%s)" (Positions.string_of_pos p)
+
+  | Token tk ->
+      Printf.sprintf "token (%s)" tk.tk_filename
+
+  | DontKnow p ->
+      Printf.sprintf "only used at (%s)" (Positions.string_of_pos p)
+
+let string_of_symbol_table t = 
+  let b = Buffer.create 13 in
+  let m = 1 + Hashtbl.fold (fun k v acu -> max (String.length k) acu) t 0 in
+  let fill_blank s =
+    let s' = String.make m ' ' in
+      String.blit s 0 s' 0 (String.length s);
+      s'
+  in
+    Hashtbl.iter (fun k v -> Buffer.add_string b 
+                   (Printf.sprintf "%s: %s\n" 
+                      (fill_blank k) (string_of_kind v))) t;
+    Buffer.contents b
+
+let is_private_symbol t x = 
+  try
+    match Hashtbl.find t x with
+      | PrivateNonTerminal _ ->
+         true
+           
+      | _ ->
+         false
+  with Not_found -> 
+    false
+
+let is_public_symbol t x = 
+  try
+    match Hashtbl.find t x with
+      | PublicNonTerminal _ ->
+         true
+           
+      | _ ->
+         false
+  with Not_found -> 
+    false
+
+let fold_on_private_symbols f init t = 
+  Hashtbl.fold 
+    (fun k -> function PrivateNonTerminal _ -> (fun acu -> f acu k)
+       | _ -> (fun acu -> acu))
+    t init
+
+let fold_on_public_symbols f init t = 
+  Hashtbl.fold 
+    (fun k -> function PublicNonTerminal _ -> (fun acu -> f acu k)
+       | _ -> (fun acu -> acu))
+    t init
+
+let iter_on_only_used_symbols f t = 
+  Hashtbl.iter 
+    (fun k -> function DontKnow pos -> f k pos
+       | _ -> ())
+    t 
+
+let symbols_of grammar (pgrammar : ConcreteSyntax.grammar) = 
+  let tokens = grammar.p_tokens in
+  let symbols_of_rule symbols prule = 
+    let rec store_except_rule_parameters = 
+      fun symbols (symbol, parameters) ->
+       (* Rule parameters are bound locally, so they are not taken into
+          account. *)
+       if List.mem symbol.value prule.pr_parameters then
+         symbols
+       else 
+         (* Otherwise, mark this symbol as being used and analyse its
+            parameters. *)
+         List.fold_left 
+           (fun symbols -> function 
+              | ParameterApp (symbol, parameters) -> 
+                  store_except_rule_parameters symbols (symbol, parameters)
+              | ParameterVar symbol ->
+                  store_except_rule_parameters symbols (symbol, [])
+           )
+           (store_used_symbol symbol.position tokens symbols symbol.value) parameters
+    in
+      
+    (* Analyse each branch. *)
+    let symbols = List.fold_left (fun symbols branch ->
+      List.fold_left (fun symbols (_, p) -> 
+       let symbol, parameters = Parameters.unapp p in
+       store_except_rule_parameters symbols (symbol, parameters)
+      ) symbols branch.pr_producers
+    ) symbols prule.pr_branches
+    in
+      (* Store the symbol declaration. *)
+      if prule.pr_public_flag 
+       || StringMap.mem prule.pr_nt grammar.p_start_symbols then 
+       store_public_nonterminal tokens symbols prule.pr_nt prule.pr_positions
+      else
+       store_private_nonterminal tokens symbols prule.pr_nt prule.pr_positions
+  in
+    List.fold_left symbols_of_rule (empty_symbol_table ()) pgrammar.pg_rules
+
+let merge_rules tokens symbols pgs = 
+
+  (* Retrieve all the public symbols. *)
+  let public_symbols =
+    List.fold_left (fold_on_public_symbols (fun s k -> StringSet.add k s)) 
+      (StringSet.singleton "error")
+      symbols
+  in
+
+  (* We check the references in each grammar can be bound to 
+     a public symbol. *)
+  let _ = 
+    List.iter 
+      (iter_on_only_used_symbols 
+        (fun k pos -> if not (StringSet.mem k public_symbols) then
+           Error.error [ pos ]
+             (Printf.sprintf "%s is undefined." k)))
+      symbols
+  in
+  (* Detect private symbol clashes and rename them if necessary. *)
+  let detect_private_symbol_clashes = 
+    fold_on_private_symbols 
+      (fun (defined, clashes) symbol ->
+        if StringSet.mem symbol defined 
+          || StringSet.mem symbol public_symbols then
+          (defined, StringSet.add symbol clashes)
+        else 
+          (StringSet.add symbol defined, clashes))
+  in 
+  let private_symbols, clashes = 
+    List.fold_left detect_private_symbol_clashes (StringSet.empty, StringSet.empty) symbols
+  in 
+  let rpgs = List.map 
+    (fun (symbol_table, pg) ->
+       let renaming = 
+        StringSet.fold 
+          (fun x phi ->
+             if is_private_symbol symbol_table x then begin
+                 let x' = rename x pg.pg_filename in
+                   Printf.fprintf stderr
+                     "Note: the nonterminal symbol %s (from %s) is renamed %s.\n"
+                     x pg.pg_filename x';
+                   (x, x') :: phi
+               end
+             else phi)
+          clashes []    
+       in
+        rewrite_grammar renaming pg)
+    pgs
+  in
+    
+    (* Merge public nonterminal definitions 
+       and copy private nonterminal definitions. Since the clash between
+       private symbols have already been resolved, these copies are safe. *)
+    List.fold_left 
+      (fun rules rpg -> List.fold_left 
+        (fun rules r -> 
+           let r = 
+             try
+               let r' = StringMap.find r.pr_nt rules in
+               let positions = r.pr_positions @ r'.pr_positions in
+               let ra, ra' = 
+                 List.length r.pr_parameters, 
+                 List.length r'.pr_parameters            
+               in
+                 (* The arity of the parameterized symbols must be constant.*)
+                 if ra <> ra' then 
+                   Error.error positions 
+                     (Printf.sprintf "symbol %s is defined with arities %d and %d."
+                        r.pr_nt ra ra')
+                 else if r.pr_inline_flag <> r'.pr_inline_flag then
+                   Error.error positions
+                     (Printf.sprintf 
+                        "not all definitions of %s are marked %%inline." r.pr_nt)
+                 else 
+                   (* We combine the different branches. The parameters 
+                      could have different names, we rename them with
+                      the fresh names assigned earlier (see the next 
+                      comment). *)
+                   let phi = List.combine r.pr_parameters r'.pr_parameters in
+                   let rbr = rewrite_branches phi r.pr_branches in
+                     { r' with 
+                         pr_positions = positions;
+                         pr_branches  = rbr @ r'.pr_branches 
+                     } 
+             with Not_found ->
+               (* We alphaconvert the rule in order to avoid the capture of 
+                  private symbols coming from another unit. *)
+               alphaconvert_rule r.pr_parameters r
+           in
+             StringMap.add r.pr_nt r rules) rules rpg.pg_rules)
+      StringMap.empty rpgs
+
+let empty_grammar =
+  {
+    p_preludes                = [];
+    p_postludes               = [];
+    p_parameters              = [];
+    p_start_symbols           = StringMap.empty;
+    p_types                   = [];
+    p_tokens                  = StringMap.empty;
+    p_rules                   = StringMap.empty
+  }
+
+let join grammar pgrammar =
+  let filename = pgrammar.pg_filename in
+    List.fold_left (join_declaration filename) grammar pgrammar.pg_declarations
+    $$ join_trailer pgrammar.pg_trailer
+
+(* Check that the $i's are consistent, that is, that they are within
+   bounds and that they are not used when symbols are explicitly
+   named. Check also that no two symbols carry the same name. *)
+
+let check_keywords grammar producers action =
+  let length = List.length producers in
+    List.iter
+      (function keyword ->
+        match Positions.value keyword with
+          | Dollar i
+          | Position (RightDollar i, _, _) ->
+              if i < 1 || i > length then
+                Error.errorp keyword
+                  (Printf.sprintf "$%d refers to a nonexistent symbol." i);
+              let ido, param = List.nth producers (i - 1) in
+              begin
+                match ido with
+                  | Some { value = id } ->
+                      Error.errorp keyword
+                        (Printf.sprintf 
+                           "please do not say: $%d. Instead, say: %s." i id)
+                  | None ->
+                      ()
+              end
+          | Position (RightNamed id, _, _) ->
+              let found =
+                ref false 
+              in
+              List.iter (fun (ido, param) ->
+                match ido with
+                | Some { value = id' } when id = id' ->
+                    found := true
+                | _ ->
+                    ()
+              ) producers;
+              if not !found then
+                Error.errorp keyword
+                  (Printf.sprintf "%s refers to a nonexistent symbol." id)
+          | Position (Left, _, _)
+          | PreviousError
+          | SyntaxError ->
+              ()
+      ) (Action.pkeywords action)
+
+let check_parameterized_grammar_is_well_defined grammar =
+
+  (* Every start symbol is defined and has a %type declaration. *)
+  StringMap.iter 
+    (fun nonterminal p ->
+       if not (StringMap.mem nonterminal grammar.p_rules) then
+        Error.error [p] (Printf.sprintf "the start symbol %s is undefined." 
+                          nonterminal);
+       if not (List.exists (function 
+                            | ParameterVar { value = id }, _ -> id = nonterminal
+                            | _ -> false) grammar.p_types) then
+        Error.error [p]
+          (Printf.sprintf 
+             "the type of the start symbol %s is unspecified." nonterminal);
+    ) grammar.p_start_symbols;
+
+  let rec parameter_head_symb = function
+    | ParameterVar id -> id
+    | ParameterApp (id, _) -> id
+  in
+
+  List.iter (fun (symbol, _) ->
+    let head_symb = parameter_head_symb symbol in
+    if not (StringMap.mem (value head_symb) grammar.p_rules) then
+      Error.errorp (Parameters.with_pos symbol)
+       (Printf.sprintf
+          "this is a terminal symbol.\n\
+             %%type declarations are applicable only to nonterminal symbols."))
+    grammar.p_types;
+
+  (* Every reference to a symbol is well defined. *)
+  let reserved = [ "error" ] in
+  let used_tokens = ref StringSet.empty in
+  let mark_token_as_used token = 
+    used_tokens := StringSet.add token !used_tokens
+  in
+  let check_identifier_reference grammar prule s p = 
+    (* Mark the symbol as a used token if this is a token. *)
+    if StringMap.mem s grammar.p_tokens then
+      mark_token_as_used s;
+    
+    if not (StringMap.mem s grammar.p_rules
+          || StringMap.mem s grammar.p_tokens
+          || List.mem s prule.pr_parameters
+          || List.mem s reserved) then
+      Error.error [ p ] (Printf.sprintf "%s is undefined." s)
+  in
+    StringMap.iter
+      (fun k prule -> List.iter
+
+        (* Check each branch. *)
+        (fun { pr_producers = producers; 
+              pr_branch_shift_precedence = sprec;
+              pr_action = action 
+            } -> ignore (List.fold_left
+                           
+           (* Check the producers. *)
+            (fun already_seen (id, p) ->
+              let symbol, parameters = Parameters.unapp p in
+              let s = symbol.value and p = symbol.position in
+              let already_seen = 
+                match id with
+                    None -> already_seen
+                  | Some id -> 
+                      (* Check the producer id is unique. *)
+                      if StringSet.mem id.value already_seen then
+                        Error.error [ id.position ]
+                          (Printf.sprintf
+                             "there are multiple producers named %s in this sequence." 
+                             id.value);
+                      StringSet.add id.value already_seen
+              in
+
+                (* Check that the producer is defined somewhere. *)
+                check_identifier_reference grammar prule s p;
+                StringMap.iter (check_identifier_reference grammar prule) 
+                  (List.fold_left Parameters.identifiers StringMap.empty parameters);
+                
+                (* Check the %prec is a valid reference to a token. *)
+                (try
+                    if not ((StringMap.find s grammar.p_tokens).tk_is_declared
+                           || List.mem s reserved) then 
+                     Error.errorp symbol
+                       (Printf.sprintf "%s has not been declared as a token." s)
+                 with Not_found -> ());
+                already_seen
+                                
+            ) StringSet.empty producers);
+
+           check_keywords grammar producers action;
+
+            match sprec with
+
+              | None -> ()
+
+              | Some terminal ->
+                 check_identifier_reference grammar prule 
+                   terminal.value terminal.position;
+
+                 (* It is forbidden to use the %prec directive with %inline. *)
+                 if prule.pr_inline_flag then
+                   Error.errorp terminal
+                     "use of %prec is forbidden in an %inlined nonterminal definition.";
+
+                 (* Furthermore, the symbol following %prec must be a valid
+                    token identifier. *)  
+                  if not (StringMap.mem terminal.value grammar.p_tokens) then
+                   Error.errorp terminal
+                     (Printf.sprintf "%s is undefined." terminal.value))
+
+        prule.pr_branches;
+
+        (* It is forbidden to use %inline on a %start symbol. *)
+        if (prule.pr_inline_flag 
+            && StringMap.mem k grammar.p_start_symbols) then
+          Error.error prule.pr_positions 
+            (Printf.sprintf 
+               "%s cannot be both a start symbol and inlined." k);
+
+      ) grammar.p_rules;
+    
+  (* Check that every token is used. *)
+  begin match Settings.token_type_mode with
+  | Settings.TokenTypeOnly ->
+      ()
+  | Settings.TokenTypeAndCode
+  | Settings.CodeOnly _ ->
+      StringMap.iter (fun token { tk_position = p } -> 
+       if not (StringSet.mem token !used_tokens) then
+         Error.warning [p] 
+           (Printf.sprintf "the token %s is unused." token)
+      ) grammar.p_tokens
+  end;
+    
+  grammar
+
+let join_partial_grammars pgs =
+  let grammar = List.fold_left join empty_grammar pgs in
+  let symbols = List.map (symbols_of grammar) pgs in
+  let tpgs = List.combine symbols pgs in
+  let rules = merge_rules grammar.p_tokens symbols tpgs in 
+  check_parameterized_grammar_is_well_defined { grammar with p_rules = rules }
diff --git a/bundles/menhirLib/menhir-20120123/src/partialGrammar.mli b/bundles/menhirLib/menhir-20120123/src/partialGrammar.mli
new file mode 100644 (file)
index 0000000..978a663
--- /dev/null
@@ -0,0 +1,18 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* $Id: partialGrammar.mli,v 1.4 2005/12/01 16:20:07 regisgia Exp $ *)
+
+val join_partial_grammars : 
+  ConcreteSyntax.grammar list -> InternalSyntax.grammar
diff --git a/bundles/menhirLib/menhir-20120123/src/patricia.ml b/bundles/menhirLib/menhir-20120123/src/patricia.ml
new file mode 100644 (file)
index 0000000..981258d
--- /dev/null
@@ -0,0 +1,1204 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* This is an implementation of Patricia trees, following Chris Okasaki's paper at the 1998 ML Workshop in Baltimore.
+   Both big-endian and little-endian trees are provided. Both sets and maps are implemented on top of Patricia
+   trees. *)
+
+(*i --------------------------------------------------------------------------------------------------------------- i*)
+(*s \mysection{Little-endian vs big-endian trees} *)
+
+  (* A tree is little-endian if it expects the key's least significant bits to be tested first during a search. It is
+     big-endian if it expects the key's most significant bits to be tested first.
+
+     Most of the code is independent of this design choice, so it is written as a functor, parameterized by a small
+     structure which defines endianness. Here is the interface which must be adhered to by such a structure. *)
+
+module Endianness = struct
+
+  module type S = sig
+
+    (* A mask is an integer with a single one bit (i.e. a power of 2). *)
+
+    type mask = int
+
+    (* [branching_bit] accepts two distinct integers and returns a mask which identifies the first bit where they
+       differ. The meaning of ``first'' varies according to the endianness being implemented. *)
+
+    val branching_bit: int -> int -> mask
+
+    (* [mask i m] returns an integer [i'], where all bits which [m] says are relevant are identical to those in [i],
+       and all others are set to some unspecified, but fixed value. Which bits are ``relevant'' according to a given
+       mask varies according to the endianness being implemented. *)
+
+    val mask: int -> mask -> int
+
+    (* [shorter m1 m2] returns [true] if and only if [m1] describes a shorter prefix than [m2], i.e. if it makes fewer
+       bits relevant. Which bits are ``relevant'' according to a given mask varies according to the endianness being
+       implemented. *)
+
+    val shorter: mask -> mask -> bool
+
+  end
+
+  (* Now, let us define [Little] and [Big], two possible [Endiannness] choices. *)
+
+  module Little = struct
+
+    type mask = int
+
+    let lowest_bit x =
+      x land (-x)
+
+    (* Performing a logical ``xor'' of [i0] and [i1] yields a bit field where all differences between [i0] and [i1]
+       show up as one bits. (There must be at least one, since [i0] and [i1] are distinct.) The ``first'' one is
+       the lowest bit in this bit field, since we are checking least significant bits first. *)
+
+    let branching_bit i0 i1 =
+      lowest_bit (i0 lxor i1)
+
+    (* The ``relevant'' bits in an integer [i] are those which are found (strictly) to the right of the single one bit
+       in the mask [m]. We keep these bits, and set all others to 0. *)
+
+    let mask i m =
+      i land (m-1)
+
+    (* The smaller [m] is, the fewer bits are relevant. *)
+
+    let shorter =
+      (<)
+
+  end
+
+  module Big = struct
+
+    type mask = int
+
+    let lowest_bit x =
+      x land (-x)
+
+    let rec highest_bit x =
+      let m = lowest_bit x in
+      if x = m then
+       m
+      else
+       highest_bit (x - m)
+
+    (* Performing a logical ``xor'' of [i0] and [i1] yields a bit field where all differences between [i0] and [i1]
+       show up as one bits. (There must be at least one, since [i0] and [i1] are distinct.) The ``first'' one is
+       the highest bit in this bit field, since we are checking most significant bits first.
+
+       In Okasaki's paper, this loop is sped up by computing a conservative initial guess. Indeed, the bit at which
+       the two prefixes disagree must be somewhere within the shorter prefix, so we can begin searching at the
+       least-significant valid bit in the shorter prefix. Unfortunately, to allow computing the initial guess, the
+       main code has to pass in additional parameters, e.g. a mask which describes the length of each prefix. This
+       ``pollutes'' the endianness-independent code. For this reason, this optimization isn't implemented here. *)
+
+    let branching_bit i0 i1 =
+      highest_bit (i0 lxor i1)
+
+    (* The ``relevant'' bits in an integer [i] are those which are found (strictly) to the left of the single one bit
+       in the mask [m]. We keep these bits, and set all others to 0. Okasaki uses a different convention, which allows
+       big-endian Patricia trees to masquerade as binary search trees. This feature does not seem to be useful here. *)
+
+    let mask i m =
+      i land (lnot (2*m-1))
+
+    (* The smaller [m] is, the more bits are relevant. *)
+
+    let shorter =
+      (>)
+
+  end
+
+end
+
+(*i --------------------------------------------------------------------------------------------------------------- i*)
+(*s \mysection{Patricia-tree-based maps} *)
+
+module Make (X : Endianness.S) = struct
+
+  (* Patricia trees are maps whose keys are integers. *)
+
+  type key = int
+
+  (* A tree is either empty, or a leaf node, containing both the integer key and a piece of data, or a binary node.
+     Each binary node carries two integers. The first one is the longest common prefix of all keys in this
+     sub-tree. The second integer is the branching bit. It is an integer with a single one bit (i.e. a power of 2),
+     which describes the bit being tested at this node. *)
+
+  type 'a t =
+    | Empty
+    | Leaf of int * 'a
+    | Branch of int * X.mask * 'a t * 'a t
+
+  (* The empty map. *)
+
+  let empty =
+    Empty
+
+  (* [choose m] returns an arbitrarily chosen binding in [m], if [m]
+     is nonempty, and raises [Not_found] otherwise. *)
+
+  let rec choose = function
+    | Empty ->
+       raise Not_found
+    | Leaf (key, data) ->
+       key, data
+    | Branch (_, _, tree0, _) ->
+       choose tree0
+
+  (* [lookup k m] looks up the value associated to the key [k] in the map [m], and raises [Not_found] if no value is
+     bound to [k].
+
+     This implementation takes branches \emph{without} checking whether the key matches the prefix found at the
+     current node. This means that a query for a non-existent key shall be detected only when finally reaching
+     a leaf, rather than higher up in the tree. This strategy is better when (most) queries are expected to be
+     successful. *)
+
+  let rec lookup key = function
+    | Empty ->
+       raise Not_found
+    | Leaf (key', data) ->
+       if key = key' then
+         data
+       else
+         raise Not_found
+    | Branch (_, mask, tree0, tree1) ->
+       lookup key (if (key land mask) = 0 then tree0 else tree1)
+
+  let find =
+    lookup
+
+  (* [mem k m] tells whether the key [k] appears in the domain of the
+     map [m]. *)
+
+  let mem k m =
+    try
+      let _ = lookup k m in
+      true
+    with Not_found ->
+      false
+
+  (* The auxiliary function [join] merges two trees in the simple case where their prefixes disagree.
+
+     Assume $t_0$ and $t_1$ are non-empty trees, with longest common prefixes $p_0$ and $p_1$, respectively. Further,
+     suppose that $p_0$ and $p_1$ disagree, that is, neither prefix is contained in the other. Then, no matter how
+     large $t_0$ and $t_1$ are, we can merge them simply by creating a new [Branch] node that has $t_0$ and $t_1$
+     as children! *)
+
+  let join p0 t0 p1 t1 =
+    let m = X.branching_bit p0 p1 in
+    let p = X.mask p0 (* for instance *) m in
+    if (p0 land m) = 0 then
+      Branch(p, m, t0, t1)
+    else
+      Branch(p, m, t1, t0)
+
+  (* The auxiliary function [match_prefix] tells whether a given key has a given prefix. More specifically,
+     [match_prefix k p m] returns [true] if and only if the key [k] has prefix [p] up to bit [m].
+
+     Throughout our implementation of Patricia trees, prefixes are assumed to be in normal form, i.e. their
+     irrelevant bits are set to some predictable value. Formally, we assume [X.mask p m] equals [p] whenever [p]
+     is a prefix with [m] relevant bits. This allows implementing [match_prefix] using only one call to
+     [X.mask]. On the other hand, this requires normalizing prefixes, as done e.g. in [join] above, where
+     [X.mask p0 m] has to be used instead of [p0]. *)
+
+  let match_prefix k p m =
+    X.mask k m = p
+
+  (* [fine_add decide k d m] returns a map whose bindings are all bindings in [m], plus a binding of the key [k] to
+     the datum [d]. If a binding from [k] to [d0] already exists, then the resulting map contains a binding from
+     [k] to [decide d0 d]. *)
+
+  type 'a decision = 'a -> 'a -> 'a
+
+  exception Unchanged
+
+  let basic_add decide k d m =
+
+    let rec add t =
+      match t with
+      |        Empty ->
+         Leaf (k, d)
+      |        Leaf (k0, d0) ->
+         if k = k0 then
+           let d' = decide d0 d in
+           if d' == d0 then
+             raise Unchanged
+           else
+             Leaf (k, d')
+         else
+           join k (Leaf (k, d)) k0 t
+      |        Branch (p, m, t0, t1) ->
+         if match_prefix k p m then
+           if (k land m) = 0 then Branch (p, m, add t0, t1)
+           else Branch (p, m, t0, add t1)
+         else
+           join k (Leaf (k, d)) p t in
+
+    add m
+
+  let strict_add k d m =
+    basic_add (fun _ _ -> raise Unchanged) k d m
+
+  let fine_add decide k d m =
+    try
+      basic_add decide k d m
+    with Unchanged ->
+      m
+
+  (* [add k d m] returns a map whose bindings are all bindings in [m], plus a binding of the key [k] to the datum
+     [d]. If a binding already exists for [k], it is overridden. *)
+
+  let add k d m =
+    fine_add (fun old_binding new_binding -> new_binding) k d m
+
+  (* [singleton k d] returns a map whose only binding is from [k] to [d]. *)
+
+  let singleton k d =
+    Leaf (k, d)
+
+  (* [is_singleton m] returns [Some (k, d)] if [m] is a singleton map
+     that maps [k] to [d]. Otherwise, it returns [None]. *)
+
+  let is_singleton = function
+    | Leaf (k, d) ->
+       Some (k, d)
+    | Empty
+    | Branch _ ->
+       None
+
+  (* [is_empty m] returns [true] if and only if the map [m] defines no bindings at all. *)
+
+  let is_empty = function
+    | Empty ->
+       true
+    | Leaf _
+    | Branch _ ->
+       false
+
+  (* [cardinal m] returns [m]'s cardinal, that is, the number of keys it binds, or, in other words, its domain's
+     cardinal. *)
+
+  let rec cardinal = function
+    | Empty ->
+       0
+    | Leaf _ ->
+       1
+    | Branch (_, _, t0, t1) ->
+       cardinal t0 + cardinal t1
+
+  (* [remove k m] returns the map [m] deprived from any binding involving [k]. *)
+
+  let remove key m =
+
+    let rec remove = function
+      | Empty ->
+         raise Not_found
+      | Leaf (key', _) ->
+         if key = key' then
+           Empty
+         else
+           raise Not_found
+      | Branch (prefix, mask, tree0, tree1) ->
+         if (key land mask) = 0 then
+           match remove tree0 with
+           | Empty ->
+               tree1
+           | tree0 ->
+               Branch (prefix, mask, tree0, tree1)
+         else
+           match remove tree1 with
+           | Empty ->
+               tree0
+           | tree1 ->
+               Branch (prefix, mask, tree0, tree1) in
+
+    try
+      remove m
+    with Not_found ->
+      m
+
+  (* [lookup_and_remove k m] looks up the value [v] associated to the key [k] in the map [m], and raises [Not_found]
+     if no value is bound to [k]. The call returns the value [v], together with the map [m] deprived from the binding
+     from [k] to [v]. *)
+
+  let rec lookup_and_remove key = function
+    | Empty ->
+       raise Not_found
+    | Leaf (key', data) ->
+       if key = key' then
+         data, Empty
+       else
+         raise Not_found
+    | Branch (prefix, mask, tree0, tree1) ->
+       if (key land mask) = 0 then
+         match lookup_and_remove key tree0 with
+         | data, Empty ->
+             data, tree1
+         | data, tree0 ->
+             data, Branch (prefix, mask, tree0, tree1)
+       else
+         match lookup_and_remove key tree1 with
+         | data, Empty ->
+             data, tree0
+         | data, tree1 ->
+             data, Branch (prefix, mask, tree0, tree1)
+
+  let find_and_remove =
+    lookup_and_remove
+
+  (* [fine_union decide m1 m2] returns the union of the maps [m1] and
+     [m2]. If a key [k] is bound to [x1] (resp. [x2]) within [m1]
+     (resp. [m2]), then [decide] is called. It is passed [x1] and
+     [x2], and must return the value which shall be bound to [k] in
+     the final map. The operation returns [m2] itself (as opposed to a
+     copy of it) when its result is equal to [m2]. *)
+
+  let reverse decision elem1 elem2 =
+    decision elem2 elem1
+
+  let fine_union decide m1 m2 =
+
+    let rec union s t =
+      match s, t with
+       
+      |        Empty, _ ->
+         t
+      | (Leaf _ | Branch _), Empty ->
+         s
+
+      | Leaf(key, value), _ ->
+         fine_add (reverse decide) key value t
+      | Branch _, Leaf(key, value) ->
+         fine_add decide key value s
+
+      | Branch(p, m, s0, s1), Branch(q, n, t0, t1) ->
+         if (p = q) & (m = n) then
+
+           (* The trees have the same prefix. Merge their sub-trees. *)
+
+           let u0 = union s0 t0
+           and u1 = union s1 t1 in
+           if t0 == u0 && t1 == u1 then t
+           else Branch(p, m, u0, u1)
+
+         else if (X.shorter m n) & (match_prefix q p m) then
+
+           (* [q] contains [p]. Merge [t] with a sub-tree of [s]. *)
+
+           if (q land m) = 0 then
+             Branch(p, m, union s0 t, s1)
+           else
+             Branch(p, m, s0, union s1 t)
+
+         else if (X.shorter n m) & (match_prefix p q n) then
+
+           (* [p] contains [q]. Merge [s] with a sub-tree of [t]. *)
+
+           if (p land n) = 0 then
+             let u0 = union s t0 in
+             if t0 == u0 then t
+             else Branch(q, n, u0, t1)
+           else
+             let u1 = union s t1 in
+             if t1 == u1 then t
+             else Branch(q, n, t0, u1)
+
+         else
+
+           (* The prefixes disagree. *)
+
+           join p s q t in
+
+    union m1 m2
+
+  (* [union m1 m2] returns the union of the maps [m1] and
+     [m2]. Bindings in [m2] take precedence over those in [m1]. *)
+
+  let union m1 m2 =
+    fine_union (fun d d' -> d') m1 m2
+
+  (* [iter f m] invokes [f k x], in turn, for each binding from key [k] to element [x] in the map [m]. Keys are
+     presented to [f] according to some unspecified, but fixed, order. *)
+
+  let rec iter f = function
+    | Empty ->
+       ()
+    | Leaf (key, data) ->
+       f key data
+    | Branch (_, _, tree0, tree1) ->
+       iter f tree0;
+       iter f tree1
+
+  (* [fold f m seed] invokes [f k d accu], in turn, for each binding from key [k] to datum [d] in the map
+     [m]. Keys are presented to [f] in increasing order according to the map's ordering. The initial value of
+     [accu] is [seed]; then, at each new call, its value is the value returned by the previous invocation of [f]. The
+     value returned by [fold] is the final value of [accu]. *)
+
+  let rec fold f m accu =
+    match m with
+    | Empty ->
+       accu
+    | Leaf (key, data) ->
+       f key data accu
+    | Branch (_, _, tree0, tree1) ->
+       fold f tree1 (fold f tree0 accu)
+
+  (* [fold_rev] performs exactly the same job as [fold], but presents keys to [f] in the opposite order. *)
+
+  let rec fold_rev f m accu =
+    match m with
+    | Empty ->
+       accu
+    | Leaf (key, data) ->
+       f key data accu
+    | Branch (_, _, tree0, tree1) ->
+       fold_rev f tree0 (fold_rev f tree1 accu)
+
+  (* It is valid to evaluate [iter2 f m1 m2] if and only if [m1] and [m2] have the same domain. Doing so invokes
+     [f k x1 x2], in turn, for each key [k] bound to [x1] in [m1] and to [x2] in [m2]. Bindings are presented to [f]
+     according to some unspecified, but fixed, order. *)
+
+  let rec iter2 f t1 t2 =
+    match t1, t2 with
+    | Empty, Empty ->
+       ()
+    | Leaf (key1, data1), Leaf (key2, data2) ->
+       assert (key1 = key2);
+       f key1 (* for instance *) data1 data2
+    | Branch (p1, m1, left1, right1), Branch (p2, m2, left2, right2) ->
+       assert (p1 = p2);
+       assert (m1 = m2);
+       iter2 f left1 left2;
+       iter2 f right1 right2
+    | _, _ ->
+       assert false
+
+  (* [map f m] returns the map obtained by composing the map [m] with the function [f]; that is, the map
+     $k\mapsto f(m(k))$. *)
+
+  let rec map f = function
+    | Empty ->
+       Empty
+    | Leaf (key, data) ->
+       Leaf(key, f data)
+    | Branch (p, m, tree0, tree1) ->
+       Branch (p, m, map f tree0, map f tree1)
+
+  (* [endo_map] is similar to [map], but attempts to physically share its result with its input. This saves
+     memory when [f] is the identity function. *)
+
+  let rec endo_map f tree =
+    match tree with
+    | Empty ->
+       tree
+    | Leaf (key, data) ->
+       let data' = f data in
+       if data == data' then
+         tree
+       else
+         Leaf(key, data')
+    | Branch (p, m, tree0, tree1) ->
+       let tree0' = endo_map f tree0 in
+       let tree1' = endo_map f tree1 in
+       if (tree0' == tree0) & (tree1' == tree1) then
+         tree
+       else
+         Branch (p, m, tree0', tree1')
+
+  (* [iterator m] returns a stateful iterator over the map [m]. *)
+
+  (* TEMPORARY performance could be improved, see JCF's paper *)
+
+  let iterator m =
+
+    let remainder = ref [ m ] in
+
+    let rec next () =
+      match !remainder with
+      | [] ->
+         None
+      | Empty :: parent ->
+         remainder := parent;
+         next()
+      | (Leaf (key, data)) :: parent ->
+         remainder := parent;
+         Some (key, data)
+      | (Branch(_, _, s0, s1)) :: parent ->
+         remainder := s0 :: s1 :: parent;
+         next () in
+
+    next
+
+  (* If [dcompare] is an ordering over data, then [compare dcompare]
+     is an ordering over maps. *)
+
+  exception Got of int
+
+  let compare dcompare m1 m2 =
+    let iterator2 = iterator m2 in
+    try
+      iter (fun key1 data1 ->
+       match iterator2() with
+       | None ->
+           raise (Got 1)
+       | Some (key2, data2) ->
+           let c = Pervasives.compare key1 key2 in
+           if c <> 0 then
+             raise (Got c)
+           else
+             let c = dcompare data1 data2 in
+             if c <> 0 then
+               raise (Got c)
+      ) m1;
+      match iterator2() with
+      | None ->
+         0
+      | Some _ ->
+         -1
+    with Got c ->
+      c
+
+(*i --------------------------------------------------------------------------------------------------------------- i*)
+(*s \mysection{Patricia-tree-based sets} *)
+
+(* To enhance code sharing, it would be possible to implement maps as sets of pairs, or (vice-versa) to implement
+   sets as maps to the unit element. However, both possibilities introduce some space and time inefficiency. To
+   avoid it, we define each structure separately. *)
+
+module Domain = struct
+
+  type element = int
+
+  type t =
+    | Empty
+    | Leaf of int
+    | Branch of int * X.mask * t * t
+
+  (* The empty set. *)
+
+  let empty =
+    Empty
+
+  (* [is_empty s] returns [true] if and only if the set [s] is empty. *)
+
+  let is_empty = function
+    | Empty ->
+       true
+    | Leaf _
+    | Branch _ ->
+       false
+
+  (* [singleton x] returns a set whose only element is [x]. *)
+
+  let singleton x =
+    Leaf x
+
+  (* [is_singleton s] returns [Some x] if [s] is a singleton
+     containing [x] as its only element; otherwise, it returns
+     [None]. *)
+
+  let is_singleton = function
+    | Leaf x ->
+       Some x
+    | Empty
+    |  Branch _ ->
+       None
+
+  (* [choose s] returns an arbitrarily chosen element of [s], if [s]
+     is nonempty, and raises [Not_found] otherwise. *)
+
+  let rec choose = function
+    | Empty ->
+       raise Not_found
+    | Leaf x ->
+       x
+    | Branch (_, _, tree0, _) ->
+       choose tree0
+
+  (* [cardinal s] returns [s]'s cardinal. *)
+
+  let rec cardinal = function
+    | Empty ->
+       0
+    | Leaf _ ->
+       1
+    | Branch (_, _, t0, t1) ->
+       cardinal t0 + cardinal t1
+
+  (* [mem x s] returns [true] if and only if [x] appears in the set [s]. *)
+
+  let rec mem x = function
+    | Empty ->
+       false
+    | Leaf x' ->
+       x = x'
+    | Branch (_, mask, tree0, tree1) ->
+       mem x (if (x land mask) = 0 then tree0 else tree1)
+
+  (* The auxiliary function [join] merges two trees in the simple case where their prefixes disagree. *)
+
+  let join p0 t0 p1 t1 =
+    let m = X.branching_bit p0 p1 in
+    let p = X.mask p0 (* for instance *) m in
+    if (p0 land m) = 0 then
+      Branch(p, m, t0, t1)
+    else
+      Branch(p, m, t1, t0)
+
+  (* [add x s] returns a set whose elements are all elements of [s], plus [x]. *)
+
+  exception Unchanged
+
+  let rec strict_add x t =
+    match t with
+    | Empty ->
+       Leaf x
+    | Leaf x0 ->
+       if x = x0 then
+         raise Unchanged
+       else
+         join x (Leaf x) x0 t
+    | Branch (p, m, t0, t1) ->
+       if match_prefix x p m then
+         if (x land m) = 0 then Branch (p, m, strict_add x t0, t1)
+         else Branch (p, m, t0, strict_add x t1)
+       else
+         join x (Leaf x) p t
+
+  let add x s =
+    try
+      strict_add x s
+    with Unchanged ->
+      s
+
+  (* [make2 x y] creates a set whose elements are [x] and [y]. [x] and [y] need not be distinct. *)
+
+  let make2 x y =
+    add x (Leaf y)
+
+  (* [fine_add] does not make much sense for sets of integers. Better warn the user. *)
+
+  type decision = int -> int -> int
+
+  let fine_add decision x s =
+    assert false
+
+  (* [remove x s] returns a set whose elements are all elements of [s], except [x]. *)
+
+  let remove x s =
+
+    let rec strict_remove = function
+      | Empty ->
+         raise Not_found
+      | Leaf x' ->
+       if x = x' then
+         Empty
+       else
+         raise Not_found
+      | Branch (prefix, mask, tree0, tree1) ->
+         if (x land mask) = 0 then
+           match strict_remove tree0 with
+           | Empty ->
+               tree1
+           | tree0 ->
+               Branch (prefix, mask, tree0, tree1)
+         else
+           match strict_remove tree1 with
+           | Empty ->
+               tree0
+           | tree1 ->
+               Branch (prefix, mask, tree0, tree1) in
+
+    try
+      strict_remove s
+    with Not_found ->
+      s
+
+  (* [union s1 s2] returns the union of the sets [s1] and [s2]. *)
+
+  let rec union s t =
+    match s, t with
+
+    | Empty, _ ->
+       t
+    | _, Empty ->
+       s
+
+    | Leaf x, _ ->
+       add x t
+    | _, Leaf x ->
+       add x s
+
+    | Branch(p, m, s0, s1), Branch(q, n, t0, t1) ->
+       if (p = q) & (m = n) then
+
+         (* The trees have the same prefix. Merge their sub-trees. *)
+
+         let u0 = union s0 t0
+         and u1 = union s1 t1 in
+         if t0 == u0 && t1 == u1 then t
+         else Branch(p, m, u0, u1)
+
+       else if (X.shorter m n) & (match_prefix q p m) then
+
+         (* [q] contains [p]. Merge [t] with a sub-tree of [s]. *)
+
+         if (q land m) = 0 then
+           Branch(p, m, union s0 t, s1)
+         else
+           Branch(p, m, s0, union s1 t)
+
+       else if (X.shorter n m) & (match_prefix p q n) then
+
+         (* [p] contains [q]. Merge [s] with a sub-tree of [t]. *)
+
+         if (p land n) = 0 then
+           let u0 = union s t0 in
+           if t0 == u0 then t
+           else Branch(q, n, u0, t1)
+         else
+           let u1 = union s t1 in
+           if t1 == u1 then t
+           else Branch(q, n, t0, u1)
+
+       else
+
+         (* The prefixes disagree. *)
+
+         join p s q t
+
+  (* [fine_union] does not make much sense for sets of integers. Better warn the user. *)
+
+  let fine_union decision s1 s2 =
+    assert false
+
+  (* [build] is a ``smart constructor''. It builds a [Branch] node with the specified arguments, but ensures
+     that the newly created node does not have an [Empty] child. *)
+
+  let build p m t0 t1 =
+    match t0, t1 with
+    |  Empty, Empty ->
+       Empty
+    |  Empty, _ ->
+       t1
+    |  _, Empty ->
+       t0
+    |  _, _ ->
+       Branch(p, m, t0, t1)
+
+  (* [diff s t] returns the set difference of [s] and [t], that is, $s\setminus t$. *)
+
+  let rec diff s t =
+    match s, t with
+
+    |  Empty, _
+    |  _, Empty ->
+       s
+
+    |  Leaf x, _ ->
+       if mem x t then Empty else s
+    |  _, Leaf x ->
+       remove x s
+
+    | Branch(p, m, s0, s1), Branch(q, n, t0, t1) ->
+       if (p = q) & (m = n) then
+
+         (* The trees have the same prefix. Compute the differences of their sub-trees. *)
+
+         build p m (diff s0 t0) (diff s1 t1)
+
+       else if (X.shorter m n) & (match_prefix q p m) then
+
+         (* [q] contains [p]. Subtract [t] off a sub-tree of [s]. *)
+
+         if (q land m) = 0 then
+           build p m (diff s0 t) s1
+         else
+           build p m s0 (diff s1 t)
+
+       else if (X.shorter n m) & (match_prefix p q n) then
+
+         (* [p] contains [q]. Subtract a sub-tree of [t] off [s]. *)
+
+         diff s (if (p land n) = 0 then t0 else t1)
+
+       else
+
+         (* The prefixes disagree. *)
+
+         s
+
+  (* [inter s t] returns the set intersection of [s] and [t], that is, $s\cap t$. *)
+
+  let rec inter s t =
+    match s, t with
+
+    | Empty, _
+    | _, Empty ->
+       Empty
+
+    | (Leaf x as s), t
+    | t, (Leaf x as s) ->
+       if mem x t then s else Empty
+
+    | Branch(p, m, s0, s1), Branch(q, n, t0, t1) ->
+       if (p = q) & (m = n) then
+
+         (* The trees have the same prefix. Compute the intersections of their sub-trees. *)
+
+         build p m (inter s0 t0) (inter s1 t1)
+
+       else if (X.shorter m n) & (match_prefix q p m) then
+
+         (* [q] contains [p]. Intersect [t] with a sub-tree of [s]. *)
+
+         inter (if (q land m) = 0 then s0 else s1) t
+
+       else if (X.shorter n m) & (match_prefix p q n) then
+
+         (* [p] contains [q]. Intersect [s] with a sub-tree of [t]. *)
+
+         inter s (if (p land n) = 0 then t0 else t1)
+
+       else
+
+         (* The prefixes disagree. *)
+
+         Empty
+
+  (* [disjoint s1 s2] returns [true] if and only if the sets [s1] and [s2] are disjoint, i.e. iff their intersection
+     is empty. It is a specialized version of [inter], which uses less space. *)
+
+  exception NotDisjoint
+
+  let disjoint s t =
+
+    let rec inter s t =
+      match s, t with
+
+      | Empty, _
+      | _, Empty ->
+         ()
+
+      | Leaf x, _ ->
+         if mem x t then
+           raise NotDisjoint
+      | _, Leaf x ->
+         if mem x s then
+           raise NotDisjoint
+
+      | Branch(p, m, s0, s1), Branch(q, n, t0, t1) ->
+         if (p = q) & (m = n) then begin
+           inter s0 t0;
+           inter s1 t1
+         end
+         else if (X.shorter m n) & (match_prefix q p m) then
+           inter (if (q land m) = 0 then s0 else s1) t
+         else if (X.shorter n m) & (match_prefix p q n) then
+           inter s (if (p land n) = 0 then t0 else t1)
+         else
+           () in
+
+    try
+      inter s t;
+      true
+    with NotDisjoint ->
+      false
+
+  (* [iter f s] invokes [f x], in turn, for each element [x] of the set [s]. Elements are presented to [f] according
+     to some unspecified, but fixed, order. *)
+
+  let rec iter f = function
+    | Empty ->
+       ()
+    | Leaf x ->
+       f x
+    | Branch (_, _, tree0, tree1) ->
+       iter f tree0;
+       iter f tree1
+
+  (* [fold f s seed] invokes [f x accu], in turn, for each element [x] of the set [s]. Elements are presented to [f]
+     according to some unspecified, but fixed, order. The initial value of [accu] is [seed]; then, at each new call,
+     its value is the value returned by the previous invocation of [f]. The value returned by [fold] is the final
+     value of [accu]. In other words, if $s = \{ x_1, x_2, \ldots, x_n \}$, where $x_1 < x_2 < \ldots < x_n$, then
+     [fold f s seed] computes $([f]\,x_n\,\ldots\,([f]\,x_2\,([f]\,x_1\,[seed]))\ldots)$. *)
+
+  let rec fold f s accu =
+    match s with
+    |  Empty ->
+       accu
+    |  Leaf x ->
+       f x accu
+    |  Branch (_, _, s0, s1) ->
+       fold f s1 (fold f s0 accu)
+
+  (* [elements s] is a list of all elements in the set [s]. *)
+
+  let elements s =
+    fold (fun tl hd -> tl :: hd) s []
+
+  (* [fold_rev] performs exactly the same job as [fold], but presents elements to [f] in the opposite order. *)
+
+  let rec fold_rev f s accu =
+    match s with
+    | Empty ->
+       accu
+    | Leaf x ->
+       f x accu
+    | Branch (_, _, s0, s1) ->
+       fold_rev f s0 (fold_rev f s1 accu)
+
+  (* [iter2] does not make much sense for sets of integers. Better warn the user. *)
+
+  let rec iter2 f t1 t2 =
+    assert false
+
+  (* [iterator s] returns a stateful iterator over the set [s]. That is, if $s = \{ x_1, x_2, \ldots, x_n \}$, where
+     $x_1 < x_2 < \ldots < x_n$, then [iterator s] is a function which, when invoked for the $k^{\text{th}}$ time,
+     returns [Some]$x_k$, if $k\leq n$, and [None] otherwise. Such a function can be useful when one wishes to
+     iterate over a set's elements, without being restricted by the call stack's discipline.
+
+     For more comments about this algorithm, please see module [Baltree], which defines a similar one. *)
+
+  let iterator s =
+
+    let remainder = ref [ s ] in
+
+    let rec next () =
+      match !remainder with
+      | [] ->
+         None
+      | Empty :: parent ->
+         remainder := parent;
+         next()
+      | (Leaf x) :: parent ->
+         remainder := parent;
+         Some x
+      | (Branch(_, _, s0, s1)) :: parent ->
+         remainder := s0 :: s1 :: parent;
+         next () in
+
+    next
+
+  (* [exists p s] returns [true] if and only if some element of [s] matches the predicate [p]. *)
+
+  exception Exists
+
+  let exists p s =
+    try
+      iter (fun x ->
+       if p x then
+         raise Exists
+      ) s;
+      false
+    with Exists ->
+      true
+
+  (* [compare] is an ordering over sets. *)
+
+  exception Got of int
+
+  let compare s1 s2 =
+    let iterator2 = iterator s2 in
+    try
+      iter (fun x1 ->
+       match iterator2() with
+       | None ->
+           raise (Got 1)
+       | Some x2 ->
+           let c = Pervasives.compare x1 x2 in
+           if c <> 0 then
+             raise (Got c)
+      ) s1;
+      match iterator2() with
+      | None ->
+         0
+      | Some _ ->
+         -1
+    with Got c ->
+      c
+
+  (* [equal] implements equality over sets. *)
+
+  let equal s1 s2 =
+    compare s1 s2 = 0
+
+  (* [subset] implements the subset predicate over sets. In other words, [subset s t] returns [true] if and only if
+     $s\subseteq t$. It is a specialized version of [diff]. *)
+
+  exception NotSubset
+
+  let subset s t =
+
+    let rec diff s t =
+      match s, t with
+
+      | Empty, _ ->
+         ()
+      | _, Empty
+
+      | Branch _, Leaf _ ->
+         raise NotSubset
+      | Leaf x, _ ->
+         if not (mem x t) then
+           raise NotSubset
+
+      | Branch(p, m, s0, s1), Branch(q, n, t0, t1) ->
+
+         if (p = q) & (m = n) then begin
+
+           diff s0 t0;
+           diff s1 t1
+
+         end
+         else if (X.shorter n m) & (match_prefix p q n) then
+
+           diff s (if (p land n) = 0 then t0 else t1)
+
+         else
+
+           (* Either [q] contains [p], which means at least one of [s]'s sub-trees is not contained within [t],
+              or the prefixes disagree. In either case, the subset relationship cannot possibly hold. *)
+
+           raise NotSubset in
+
+    try
+      diff s t;
+      true
+    with NotSubset ->
+      false
+
+  (* [filter p s] returns the subset of [s] formed by all elements which satisfy the predicate [p]. *)
+
+  let filter predicate s =
+    let modified = ref false in
+
+    let subset = fold (fun element subset ->
+      if predicate element then
+       add element subset
+      else begin
+       modified := true;
+       subset
+      end
+    ) s Empty in
+
+    if !modified then
+      subset
+    else
+      s
+
+  (* [map f s] computes the image of [s] through [f]. *)
+
+  let map f s =
+    fold (fun element accu ->
+      add (f element) accu
+    ) s Empty
+
+  (* [monotone_map] and [endo_map] do not make much sense for sets of integers. Better warn the user. *)
+
+  let monotone_map f s =
+    assert false
+
+  let endo_map f s =
+    assert false
+
+end
+
+(*i --------------------------------------------------------------------------------------------------------------- i*)
+(*s \mysection{Relating sets and maps} *)
+
+  (* Back to the world of maps. Let us now describe the relationship which exists between maps and their domains. *)
+
+  (* [domain m] returns [m]'s domain. *) 
+
+  let rec domain = function
+    | Empty ->
+       Domain.Empty
+    | Leaf (k, _) ->
+       Domain.Leaf k
+    | Branch (p, m, t0, t1) ->
+       Domain.Branch (p, m, domain t0, domain t1)
+
+  (* [lift f s] returns the map $k\mapsto f(k)$, where $k$ ranges over a set of keys [s]. *)
+
+  let rec lift f = function
+    | Domain.Empty ->
+       Empty
+    | Domain.Leaf k ->
+       Leaf (k, f k)
+    | Domain.Branch (p, m, t0, t1) ->
+       Branch(p, m, lift f t0, lift f t1)
+
+  (* [build] is a ``smart constructor''. It builds a [Branch] node with the specified arguments, but ensures
+     that the newly created node does not have an [Empty] child. *)
+
+  let build p m t0 t1 =
+    match t0, t1 with
+    | Empty, Empty ->
+       Empty
+    | Empty, _ ->
+       t1
+    | _, Empty ->
+       t0
+    | _, _ ->
+       Branch(p, m, t0, t1)
+
+  (* [corestrict m d] performs a co-restriction of the map [m] to the domain [d]. That is, it returns the map
+     $k\mapsto m(k)$, where $k$ ranges over all keys bound in [m] but \emph{not} present in [d]. Its code resembles
+     [diff]'s. *)
+
+    let rec corestrict s t =
+      match s, t with
+
+      |        Empty, _
+      |        _, Domain.Empty ->
+         s
+
+      |        Leaf (k, _), _ ->
+         if Domain.mem k t then Empty else s
+      |        _, Domain.Leaf k ->
+         remove k s
+      
+      | Branch(p, m, s0, s1), Domain.Branch(q, n, t0, t1) ->
+         if (p = q) & (m = n) then
+
+           build p m (corestrict s0 t0) (corestrict s1 t1)
+
+         else if (X.shorter m n) & (match_prefix q p m) then
+
+           if (q land m) = 0 then
+             build p m (corestrict s0 t) s1
+           else
+             build p m s0 (corestrict s1 t)
+
+         else if (X.shorter n m) & (match_prefix p q n) then
+
+           corestrict s (if (p land n) = 0 then t0 else t1)
+
+         else
+
+           s
+
+end
+
+(*i --------------------------------------------------------------------------------------------------------------- i*)
+(*s \mysection{Instantiating the functor} *)
+
+module Little = Make(Endianness.Little)
+
+module Big = Make(Endianness.Big)
+
diff --git a/bundles/menhirLib/menhir-20120123/src/patricia.mli b/bundles/menhirLib/menhir-20120123/src/patricia.mli
new file mode 100644 (file)
index 0000000..c49b8b2
--- /dev/null
@@ -0,0 +1,22 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* This is an implementation of Patricia trees, following Chris Okasaki's paper at the 1998 ML Workshop in Baltimore.
+   Both big-endian and little-endian trees are provided. Both sets and maps are implemented on top of Patricia
+   trees. *)
+
+module Little : GMap.S with type key = int
+
+module Big : GMap.S with type key = int
+
diff --git a/bundles/menhirLib/menhir-20120123/src/positions.ml b/bundles/menhirLib/menhir-20120123/src/positions.ml
new file mode 100644 (file)
index 0000000..73da659
--- /dev/null
@@ -0,0 +1,163 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* $Id: positions.ml,v 1.9 2005/12/01 16:20:07 regisgia Exp $ *)
+
+(* TEMPORARY vérifier que ces fonctions sont utilisées partout et
+             de façon cohérente; interaction avec [Error]? *)
+
+open Lexing
+
+type t = 
+    { 
+      start_p : Lexing.position; 
+      end_p   : Lexing.position 
+    }
+
+type 'a located =
+    {
+      value    : 'a;
+      position : t;
+    }
+
+let value { value = v } =
+  v
+
+let position { position = p } =
+  p
+
+let with_pos p v =
+  {
+    value     = v;
+    position  = p;
+  }
+
+let with_poss p1 p2 v =
+  with_pos { start_p = p1; end_p = p2 } v
+
+let map f v =
+  {
+    value     = f v.value;
+    position  = v.position;
+  }
+
+let iter f { value = v } =
+  f v
+
+let mapd f v =
+  let w1, w2 = f v.value in
+  let pos = v.position in
+  { value = w1; position = pos },
+  { value = w2; position = pos }
+
+let dummy = 
+  {
+    start_p = Lexing.dummy_pos;
+    end_p   = Lexing.dummy_pos
+  }
+
+let unknown_pos v = 
+  {
+    value     = v;
+    position  = dummy
+  }
+
+let start_of_position p = p.start_p
+
+let end_of_position p = p.end_p
+
+let filename_of_position p = 
+  p.start_p.Lexing.pos_fname
+
+let line p =
+  p.pos_lnum
+
+let column p =
+  p.pos_cnum - p.pos_bol
+
+let characters p1 p2 =
+  (column p1, p2.pos_cnum - p1.pos_bol) (* intentionally [p1.pos_bol] *)
+
+let join x1 x2 =
+{
+  start_p = if x1 = dummy then x2.start_p else x1.start_p;
+  end_p   = if x2 = dummy then x1.end_p else x2.end_p
+}
+
+let lex_join x1 x2 =
+{
+  start_p = x1;
+  end_p   = x2
+}
+
+let join_located l1 l2 f = 
+  {
+    value    = f l1.value l2.value;
+    position = join l1.position l2.position;
+  }
+
+let string_of_lex_pos p = 
+  let c = p.pos_cnum - p.pos_bol in
+  (string_of_int p.pos_lnum)^":"^(string_of_int c)
+
+let string_of_pos p = 
+  let filename = filename_of_position p in
+  assert (filename <> "");
+  let l = line p.start_p in
+  let c1, c2 = characters p.start_p p.end_p in
+  Printf.sprintf "File \"%s\", line %d, characters %d-%d" filename l c1 c2
+
+let pos_or_undef = function
+  | None -> dummy
+  | Some x -> x
+
+let cpos lexbuf =
+  { 
+    start_p = Lexing.lexeme_start_p lexbuf;
+    end_p   = Lexing.lexeme_end_p   lexbuf; 
+  }
+
+let with_cpos lexbuf v =
+  with_pos (cpos lexbuf) v
+
+let string_of_cpos lexbuf = 
+  string_of_pos (cpos lexbuf)
+
+let joinf f t1 t2 = 
+  join (f t1) (f t2)
+
+let ljoinf f =
+  List.fold_left (fun p t -> join p (f t)) dummy
+
+let join_located_list ls f = 
+  {
+    value     = f (List.map (fun l -> l.value) ls);
+    position  = ljoinf (fun x -> x.position) ls
+  }
+
+(* The functions that print error messages and warnings require a list of
+   positions. The following auxiliary functions help build such lists. *)
+
+type positions =
+    t list
+
+let one (pos : Lexing.position) : positions =
+  [ { start_p = pos; end_p = pos } ] (* or: lex_join pos pos *)
+
+let two (pos1 : Lexing.position) (pos2 : Lexing.position) : positions =
+  [ lex_join pos1 pos2 ]
+
+let lexbuf (lexbuf : Lexing.lexbuf) : positions =
+  [ lex_join lexbuf.Lexing.lex_start_p lexbuf.Lexing.lex_curr_p ]
+
diff --git a/bundles/menhirLib/menhir-20120123/src/positions.mli b/bundles/menhirLib/menhir-20120123/src/positions.mli
new file mode 100644 (file)
index 0000000..2f16394
--- /dev/null
@@ -0,0 +1,132 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* $Id: positions.mli,v 1.10 2005/12/01 16:20:07 regisgia Exp $ *)
+
+(* TEMPORARY faire un peu le ménage dans cette interface pléthorique? *)
+
+(** Extension of standard library's positions. *)
+
+(** {2 Extended lexing positions} *)
+
+(** Abstract type for pairs of positions in the lexing stream. *)
+type t
+
+(** Decoration of a value with a position. *)
+type 'a located =
+    {
+      value    : 'a;
+      position : t;
+    }
+
+(** [value dv] returns the raw value that underlies the
+    decorated value [dv]. *)
+val value: 'a located -> 'a
+
+(** [position dv] returns the position that decorates the
+    decorated value [dv]. *)
+val position: 'a located -> t
+
+(** [with_pos p v] decorates [v] with a position [p]. *)
+val with_pos : t -> 'a -> 'a located
+val with_cpos: Lexing.lexbuf -> 'a -> 'a located
+val with_poss : Lexing.position -> Lexing.position -> 'a -> 'a located
+
+val unknown_pos : 'a -> 'a located
+
+(** [map f v] extends the decoration from [v] to [f v]. *)
+val map: ('a -> 'b) -> 'a located -> 'b located
+
+(** [iter f dv] applies [f] to the value inside [dv]. *)
+val iter: ('a -> unit) -> 'a located -> unit
+
+(** [mapd f v] extends the decoration from [v] to both members of the pair [f v]. *)
+val mapd: ('a -> 'b1 * 'b2) -> 'a located -> 'b1 located * 'b2 located
+
+(** This value is used when an object does not from
+    a particular input location. *)
+val dummy: t
+
+(** {2 Accessors} *)
+
+(** [column p] returns the number of characters from the 
+    beginning of the line of the Lexing.position [p]. *)
+val column : Lexing.position -> int
+
+(** [column p] returns the line number of to the Lexing.position [p]. *)
+val line : Lexing.position -> int
+
+(** [characters p1 p2] returns the character interval 
+    between [p1] and [p2] assuming they are located in the same
+    line. 
+*)
+val characters : Lexing.position -> Lexing.position -> int * int
+
+val start_of_position: t -> Lexing.position
+
+val end_of_position: t -> Lexing.position
+
+val filename_of_position: t -> string 
+
+(** {2 Position handling} *)
+
+(** [join p1 p2] returns a position that starts where [p1]
+    starts and stops where [p2] stops. *)
+val join : t -> t -> t
+
+val lex_join : Lexing.position -> Lexing.position -> t
+
+val ljoinf : ('a -> t) -> 'a list -> t
+
+val joinf : ('a -> t) -> 'a -> 'a -> t
+
+val join_located : 'a located -> 'b located -> ('a -> 'b -> 'c) -> 'c located
+
+val join_located_list : 
+  ('a located) list -> ('a list -> 'b list) -> ('b list) located
+  
+
+(** [string_of_lex_pos p] returns a string representation for
+    the lexing position [p]. *)
+val string_of_lex_pos : Lexing.position -> string
+
+(** [string_of_pos p] returns the standard (Emacs-like) representation
+    of the position [p]. *)
+val string_of_pos : t -> string
+
+(** [pos_or_undef po] is the identity function except if po = None,
+    in that case, it returns [undefined_position]. *)
+val pos_or_undef : t option -> t
+
+(** {2 Interaction with the lexer runtime} *)
+
+(** [cpos lexbuf] returns the current position of the lexer. *)
+val cpos : Lexing.lexbuf -> t
+
+(** [string_of_cpos p] returns a string representation of 
+    the lexer's current position. *)
+val string_of_cpos : Lexing.lexbuf -> string
+
+(* The functions that print error messages and warnings require a list of
+   positions. The following auxiliary functions help build such lists. *)
+
+type positions =
+    t list
+
+val one: Lexing.position -> positions
+
+val two: Lexing.position -> Lexing.position -> positions
+
+val lexbuf: Lexing.lexbuf -> positions
+
diff --git a/bundles/menhirLib/menhir-20120123/src/pprint.ml b/bundles/menhirLib/menhir-20120123/src/pprint.ml
new file mode 100644 (file)
index 0000000..0cceb70
--- /dev/null
@@ -0,0 +1,920 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* This is an adaptation of Daan Leijen's [PPrint] library, which itself is
+   based on the ideas developed by Philip Wadler in ``A Prettier Printer''.
+   For more information, see:
+
+     http://www.cs.uu.nl/~daan/pprint.html
+     http://homepages.inf.ed.ac.uk/wadler/papers/prettier/prettier.pdf *)
+
+(* ------------------------------------------------------------------------- *)
+
+(* A uniform interface for output channels. *)
+
+module type OUTPUT = sig
+  type channel
+  val char: channel -> char -> unit
+  val substring: channel -> string -> int (* offset *) -> int (* length *) -> unit
+end
+
+(* ------------------------------------------------------------------------- *)
+
+(* Two implementations of the above interface, respectively based on
+   output channels and memory buffers. This compensates for the fact
+   that ocaml's standard library does not allow creating an output
+   channel out of a memory buffer (a regrettable omission). *)
+
+module ChannelOutput : OUTPUT with type channel = out_channel = struct
+  type channel = out_channel
+  let char = output_char
+  let substring = output
+end
+
+module BufferOutput : OUTPUT with type channel = Buffer.t = struct
+  type channel = Buffer.t
+  let char = Buffer.add_char
+  let substring = Buffer.add_substring
+end
+
+(* ------------------------------------------------------------------------- *)
+
+(* Here is the algebraic data type of documents. It is analogous to Daan
+   Leijen's version, but the binary constructor [Union] is replaced with
+   the unary constructor [Group], and the constant [Line] is replaced with
+   more general constructions, namely [IfFlat], which provides alternative
+   forms depending on the current flattening mode, and [HardLine], which
+   represents a newline character, and is invalid in flattening mode. *)
+
+type document =
+
+    (* [Empty] is the empty document. *)
+
+  | Empty
+
+    (* [Char c] is a document that consists of the single character [c]. We
+       enforce the invariant that [c] is not a newline character. *)
+
+  | Char of char
+
+    (* [String (s, ofs, len)] is a document that consists of the portion of
+       the string [s] delimited by the offset [ofs] and the length [len]. We
+       assume, but do not check, that this portion does not contain a newline
+       character. *)
+
+  | String of string * int * int
+
+    (* [Blank n] is a document that consists of [n] blank characters. *)
+
+  | Blank of int
+
+    (* When in flattening mode, [IfFlat (d1, d2)] turns into the document
+       [d1]. When not in flattening mode, it turns into the document [d2]. *)
+
+  | IfFlat of document * document
+
+    (* When in flattening mode, [HardLine] is illegal. When not in flattening
+       mode, it represents a newline character, followed with an appropriate
+       number of indentation. A safe way of using [HardLine] is to only use it
+       directly within the right branch of an [IfFlat] construct. *)
+
+  | HardLine
+
+    (* [Cat doc1 doc2] is the concatenation of the documents [doc1] and
+       [doc2]. *)
+
+  | Cat of document * document
+
+    (* [Nest (j, doc)] is the document [doc], in which the indentation level
+       has been increased by [j], that is, in which [j] blanks have been
+       inserted after every newline character. *)
+
+  | Nest of int * document
+
+    (* [Group doc] represents an alternative: it is either a flattened form of
+       [doc], in which occurrences of [Group] disappear and occurrences of
+       [IfFlat] resolve to their left branch, or [doc] itself. *)
+
+  | Group of document
+
+    (* [Column f] is the document obtained by applying [f] to the current
+       column number. *)
+
+  | Column of (int -> document)
+
+    (* [Nesting f] is the document obtained by applying [f] to the current
+       indentation level, that is, the number of blanks that were printed
+       at the beginning of the current line. *)
+
+  | Nesting of (int -> document)
+
+(* ------------------------------------------------------------------------- *)
+
+(* A signature for document renderers. *)
+
+module type RENDERER = sig
+  
+  (* Output channels. *)
+
+  type channel
+
+  (* [pretty rfrac width channel document] pretty-prints the document
+     [document] to the output channel [channel]. The parameter [width] is the
+     maximum number of characters per line. The parameter [rfrac] is the
+     ribbon width, a fraction relative to [width]. The ribbon width is the
+     maximum number of non-indentation characters per line. *)
+
+  val pretty: float -> int -> channel -> document -> unit
+
+  (* [compact channel document] prints the document [document] to the output
+     channel [channel]. No indentation is used. All newline instructions are
+     respected, that is, no groups are flattened. *)
+
+  val compact: channel -> document -> unit
+
+end
+
+(* ------------------------------------------------------------------------- *)
+
+(* The pretty rendering algorithm: preliminary declarations. *)
+
+(* The renderer is supposed to behave exactly like Daan Leijen's, although its
+   implementation is quite radically different. Instead of relying on
+   Haskell's lazy evaluation mechanism, we implement an abstract machine with
+   mutable current state, forking, backtracking (via an explicit stack of
+   choice points), and cut (disposal of earlier choice points). *)
+
+(* The renderer's input consists of an ordered sequence of documents. Each
+   document carries an extra indentation level, akin to an implicit [Nest]
+   constructor, and a ``flattening'' flag, which, if set, means that this
+   document should be printed in flattening mode. *)
+
+(* An alternative coding style would be to avoid decorating each input
+   document with an indentation level and a flattening mode, and allow
+   the input sequence to contain instructions that set the current
+   nesting level or reset the flattening mode. That would perhaps be
+   slightly more readable, and slightly less efficient. *)
+
+type input =
+  | INil
+  | ICons of int * bool * document * input
+
+(* When possible (that is, when the stack is empty), the renderer writes
+   directly to the output channel. Otherwise, output is buffered until either
+   a failure point is reached (then, the buffered output is discarded) or a
+   cut is reached (then, all buffered output is committed to the output
+   channel). At all times, the length of the buffered output is at most one
+   line. *)
+
+(* The buffered output consists of a list of characters and strings. It is
+   stored in reverse order (the head of the list should be printed last). *)
+
+type output =
+  | OEmpty
+  | OChar of char * output
+  | OString of string * int * int * output
+  | OBlank of int * output
+
+(* The renderer maintains the following state record. For efficiency, the
+   record is mutable; it is copied when the renderer forks, that is, at
+   choice points. *)
+
+type 'channel state = {
+
+    (* The line width and ribbon width. *)
+
+    width: int;
+    ribbon: int;
+
+    (* The output channel. *)
+
+    channel: 'channel;
+
+    (* The current indentation level. This is the number of blanks that
+       were printed at the beginning of the current line. *)
+
+    mutable indentation: int;
+
+    (* The current column. *)
+
+    mutable column: int;
+
+    (* The renderer's input. For efficiency, the input is assumed to never be
+       empty, and the leading [ICons] constructor is inlined within the state
+       record. In other words, the fields [nest1], [flatten1], and [input1]
+       concern the first input document, and the field [input] contains the
+       rest of the input sequence. *)
+
+    mutable indent1: int;
+    mutable flatten1: bool;
+    mutable input1: document;
+    mutable input: input;
+
+    (* The renderer's buffer output. *)
+
+    mutable output: output;
+
+  }
+
+(* The renderer maintains a stack of resumptions, that is, states in which
+   execution should be resumed if the current thread of execution fails by
+   lack of space on the current line. *)
+
+(* It is not difficult to prove that the stack is empty if and only if
+   flattening mode is off. Furthermore, when flattening mode is on,
+   all groups are ignored, so no new choice points are pushed onto the
+   stack. As a result, the stack has height one at most at all times,
+   so that the stack height is zero when flattening mode is off and
+   one when flattening mode is on. *)
+
+type 'channel stack =
+    'channel state list
+
+(* ------------------------------------------------------------------------- *)
+
+(* The pretty rendering algorithm: code. *)
+
+(* The renderer is parameterized over an implementation of output channels. *)
+
+module Renderer (Output : OUTPUT) = struct
+
+  type channel =
+      Output.channel
+
+  (* Printing blank space (indentation characters). *)
+
+  let blank_length =
+    80
+
+  let blank_buffer =
+    String.make blank_length ' '
+
+  let rec blanks channel n =
+    if n <= 0 then
+      ()
+    else if n <= blank_length then
+      Output.substring channel blank_buffer 0 n
+    else begin
+      Output.substring channel blank_buffer 0 blank_length;
+      blanks channel (n - blank_length)
+    end
+
+  (* Committing buffered output to the output channel. The list is printed in
+     reverse order. The code is not tail recursive, but there is no risk of
+     stack overflow, since the length of the buffered output cannot exceed one
+     line. *)
+
+  let rec commit channel = function
+    | OEmpty ->
+       ()
+    | OChar (c, output) ->
+       commit channel output;
+       Output.char channel c
+    | OString (s, ofs, len, output) ->
+       commit channel output;
+       Output.substring channel s ofs len
+    | OBlank (n, output) ->
+       commit channel output;
+       blanks channel n
+
+  (* The renderer's abstract machine. *)
+
+  (* The procedures [run], [shift], [emit_char], [emit_string], and
+     [emit_blanks] are mutually recursive, and are tail recursive. They
+     maintain a stack and a current state. The states in the stack, and the
+     current state, are pairwise distinct, so that the current state can be
+     mutated without affecting the contents of the stack. *)
+
+  (* An invariant is: the buffered output is nonempty only when the stack is
+     nonempty. The contrapositive is: if the stack is empty, then the buffered
+     output is empty. Indeed, the fact that the stack is empty means that no
+     choices were made, so we are not in a speculative mode of execution: as a
+     result, all output can be sent directly to the output channel. On the
+     contrary, when the stack is nonempty, there is a possibility that we
+     might backtrack in the future, so all output should be held in a
+     buffer. *)
+
+  (* [run] is allowed to call itself recursively only when no material is
+     printed.  In that case, the check for failure is skipped -- indeed,
+     this test is performed only within [shift]. *)
+
+  let rec run (stack : channel stack) (state : channel state) : unit =
+
+    (* Examine the first piece of input, as well as (in some cases) the
+       current flattening mode. *)
+
+    match state.input1, state.flatten1 with
+
+    (* The first piece of input is an empty document. Discard it
+       and continue. *)
+
+    | Empty, _ ->
+       shift stack state
+
+    (* The first piece of input is a character. Emit it and continue. *)
+
+    | Char c, _ ->
+       emit_char stack state c
+
+    (* The first piece of input is a string. Emit it and continue. *)
+
+    | String (s, ofs, len), _ ->
+       emit_string stack state s ofs len
+    | Blank n, _ ->
+       emit_blanks stack state n
+
+    (* The first piece of input is a hard newline instruction. Such an
+       instruction is valid only when flattening mode is off. *)
+
+    (* We emit a newline character, followed by the prescribed amount of
+       indentation. We update the current state to record how many
+       indentation characters were printed and to to reflect the new
+       column number. Then, we discard the current piece of input and
+       continue. *)
+
+    | HardLine, flattening ->
+       assert (not flattening); (* flattening mode must be off. *)
+       assert (stack = []);     (* since flattening mode is off, the stack must be empty. *)
+       Output.char state.channel '\n';
+       let i = state.indent1 in
+       blanks state.channel i;
+       state.column <- i;
+       state.indentation <- i;
+       shift stack state
+
+    (* The first piece of input is an [IfFlat] conditional instruction. *)
+
+    | IfFlat (doc, _), true
+    | IfFlat (_, doc), false ->
+       state.input1 <- doc;
+       run stack state
+
+    (* The first piece of input is a concatenation operator. We take it
+       apart and queue both documents in the input sequence. *)
+
+    | Cat (doc1, doc2), _ ->
+       state.input1 <- doc1;
+       state.input <- ICons (state.indent1, state.flatten1, doc2, state.input);
+       run stack state
+
+    (* The first piece of input is a [Nest] operator. We increase the amount
+       of indentation to be applied to the first input document. *)
+
+    | Nest (j, doc), _ ->
+       state.indent1 <- state.indent1 + j;
+       state.input1 <- doc;
+       run stack state
+
+    (* The first piece of input is a [Group] operator, and flattening mode
+       is currently off. This introduces a choice point: either we flatten
+       this whole group, or we don't. We try the former possibility first:
+       this is done by enabling flattening mode. Should this avenue fail,
+       we push the current state, in which flattening mode is disabled,
+       onto the stack. *)
+
+    (* Note that the current state is copied before continuing, so that
+       the state that is pushed on the stack is not affected by future
+       modifications. This is a fork. *)
+
+    | Group doc, false ->
+       state.input1 <- doc;
+       run (state :: stack) { state with flatten1 = true }
+
+    (* The first piece of input is a [Group] operator, and flattening mode
+       is currently on. The operator is ignored. *)
+
+    | Group doc, true ->
+       state.input1 <- doc;
+       run stack state
+
+    (* The first piece of input is a [Column] operator. The current column
+       is fed into it, so as to produce a document, with which we continue. *)
+
+    | Column f, _ ->
+       state.input1 <- f state.column;
+       run stack state
+
+    (* The first piece of input is a [Column] operator. The current
+       indentation level is fed into it, so as to produce a document, with
+       which we continue. *)
+
+    | Nesting f, _ ->
+       state.input1 <- f state.indentation;
+       run stack state
+
+  (* [shift] discards the first document in the input sequence, so that the
+     second input document, if there is one, becomes first. The renderer stops
+     if there is none. *)
+
+  and shift stack state =
+
+    assert (state.output = OEmpty || stack <> []);
+    assert (state.flatten1 = (stack <> []));
+
+    (* If the stack is nonempty and we have exceeded either the width or the
+       ribbon width parameters, then fail. Backtracking is implemented by
+       discarding the current state, popping a state off the stack, and making
+       it the current state. *)
+
+    match stack with
+    | resumption :: stack
+      when state.column > state.width
+        || state.column - state.indentation > state.ribbon ->
+       run stack resumption
+    | _ ->
+
+       match state.input with
+       | INil ->
+
+           (* End of input. Commit any buffered output and stop. *)
+
+           commit state.channel state.output
+
+       | ICons (indent, flatten, head, tail) ->
+
+           (* There is an input document. Move it one slot ahead and
+              check if we are leaving flattening mode. *)
+
+           state.indent1 <- indent;
+           state.input1 <- head;
+           state.input <- tail;
+           if state.flatten1 && not flatten then begin
+
+             (* Leaving flattening mode means success: we have flattened
+                a certain group, and fitted it all on a line, without
+                reaching a failure point. We would now like to commit our
+                decision to flatten this group. This is a Prolog cut. We
+                discard the stack of choice points, replacing it with an
+                empty stack, and commit all buffered output. *)
+
+             state.flatten1 <- flatten; (* false *)
+             commit state.channel state.output;
+             state.output <- OEmpty;
+             run [] state
+
+           end
+           else
+             run stack state
+
+  (* [emit_char] prints a character (either to the output channel or to the
+     output buffer), increments the current column, discards the first piece
+     of input, and continues. *)
+
+  and emit_char stack state c =
+    begin match stack with
+    | [] ->
+       Output.char state.channel c
+    | _ ->
+       state.output <- OChar (c, state.output)
+    end;
+    state.column <- state.column + 1;
+    shift stack state
+
+  (* [emit_string] prints a string (either to the output channel or to the
+     output buffer), updates the current column, discards the first piece of
+     input, and continues. *)
+
+  and emit_string stack state s ofs len =
+    begin match stack with
+    | [] ->
+       Output.substring state.channel s ofs len
+    | _ ->
+       state.output <- OString (s, ofs, len, state.output)
+    end;
+    state.column <- state.column + len;
+    shift stack state
+
+  (* [emit_blanks] prints a blank string (either to the output channel or to
+     the output buffer), updates the current column, discards the first piece
+     of input, and continues. *)
+
+  and emit_blanks stack state n =
+    begin match stack with
+    | [] ->
+       blanks state.channel n
+    | _ ->
+       state.output <- OBlank (n, state.output)
+    end;
+    state.column <- state.column + n;
+    shift stack state
+
+  (* This is the renderer's main entry point. *)
+
+  let pretty rfrac width channel document =
+    run [] {
+      width = width;
+      ribbon = max 0 (min width (truncate (float_of_int width *. rfrac)));
+      channel = channel;
+      indentation = 0;
+      column = 0;
+      indent1 = 0;
+      flatten1 = false;
+      input1 = document;
+      input = INil;
+      output = OEmpty;
+    }
+
+(* ------------------------------------------------------------------------- *)
+
+(* The compact rendering algorithm. *)
+
+  let compact channel document =
+
+    let column =
+      ref 0
+    in
+
+    let rec scan = function
+      | Empty ->
+         ()
+      | Char c ->
+         Output.char channel c;
+         column := !column + 1
+      | String (s, ofs, len) ->
+         Output.substring channel s ofs len;
+         column := !column + len
+      | Blank n ->
+         blanks channel n;
+         column := !column + n
+      | HardLine ->
+         Output.char channel '\n';
+         column := 0
+      | Cat (doc1, doc2) ->
+         scan doc1;
+         scan doc2
+      | IfFlat (doc, _)
+      | Nest (_, doc)
+      | Group doc ->
+         scan doc
+      | Column f ->
+         scan (f !column)
+      | Nesting f ->
+         scan (f 0)
+    in
+
+    scan document
+
+end
+
+(* ------------------------------------------------------------------------- *)
+
+(* Instantiating the renderers for the two kinds of output channels. *)
+
+module Channel =
+  Renderer(ChannelOutput)
+
+module Buffer =
+  Renderer(BufferOutput)
+
+(* ------------------------------------------------------------------------- *)
+
+(* Constructors. *)
+
+let empty =
+  Empty
+
+let (^^) x y =
+  match x, y with
+  | Empty, x
+  | x, Empty ->
+      x
+  | _, _ ->
+      Cat (x, y)
+
+let ifflat doc1 doc2 =
+  IfFlat (doc1, doc2)
+
+let hardline =
+  HardLine
+
+let char c =
+  assert (c <> '\n');
+  Char c
+
+let substring s ofs len =
+  if len = 0 then
+    Empty
+  else
+    String (s, ofs, len)
+
+let text s =
+  substring s 0 (String.length s)
+
+let blank n =
+  if n = 0 then
+    Empty
+  else
+    Blank n
+
+let nest i x =
+  assert (i >= 0);
+  Nest (i, x)
+
+let column f =
+  Column f
+
+let nesting f =
+  Nesting f
+
+let group x =
+  Group x
+
+(* ------------------------------------------------------------------------- *)
+
+(* Low-level combinators for alignment and indentation. *)
+
+let align d =
+  column (fun k ->
+    nesting (fun i ->
+      nest (k - i) d
+    )
+  )
+
+let hang i d =
+  align (nest i d)
+
+let indent i d =
+  hang i (blank i ^^ d)
+
+(* ------------------------------------------------------------------------- *)
+
+(* High-level combinators. *)
+
+let lparen          = char '('
+let rparen          = char ')'
+let langle          = char '<'
+let rangle          = char '>'
+let lbrace          = char '{'
+let rbrace          = char '}'
+let lbracket        = char '['
+let rbracket        = char ']'
+let squote          = char '\''
+let dquote          = char '"'
+let bquote          = char '`'
+let semi            = char ';'
+let colon           = char ':'
+let comma           = char ','
+let space           = char ' '
+let dot             = char '.'
+let sharp           = char '#'
+let backslash       = char '\\'
+let equals          = char '='
+let qmark           = char '?'
+let tilde           = char '~'
+let at              = char '@'
+let percent         = char '%'
+let dollar          = char '$'
+let caret           = char '^'
+let ampersand       = char '&'
+let star            = char '*'
+let plus            = char '+'
+let minus           = char '-'
+let underscore      = char '_'
+let bang            = char '!'
+let bar             = char '|'
+
+let break i         = ifflat (text (String.make i ' ')) hardline
+let break0          = ifflat empty hardline
+let break1          = ifflat space hardline
+
+let string s =
+  let n = String.length s in
+  let rec chop i =
+    try
+      let j = String.index_from s i '\n' in
+      substring s i (j - i) ^^ break1 ^^ chop (j + 1)
+    with Not_found ->
+      substring s i (n - i)
+  in
+  chop 0
+
+let group_break1 = group break1
+
+let words s =
+  let n = String.length s in
+  let rec blank accu i = (* we have skipped over at least one blank character *)
+    if i = n then
+      accu ^^ group_break1
+    else match s.[i] with
+    | ' '
+    | '\t'
+    | '\n'
+    | '\r' ->
+       blank accu (i + 1)
+    | _ ->
+       word break1 accu i (i + 1)
+  and word prefix accu i j = (* we have skipped over at least one non-blank character *)
+    if j = n then
+      accu ^^ group (prefix ^^ substring s i (j - i))
+    else match s.[j] with
+    | ' '
+    | '\t'
+    | '\n'
+    | '\r' ->
+       blank (accu ^^ group (prefix ^^ substring s i (j - i))) (j + 1)
+    | _ ->
+       word prefix accu i (j + 1)
+  in
+  if n = 0 then
+    empty
+  else
+    match s.[0] with
+    | ' '
+    | '\t'
+    | '\n'
+    | '\r' ->
+       blank empty 1
+    | _ ->
+       word empty empty 0 1
+
+let enclose l r x   = l ^^ x ^^ r
+
+let squotes         = enclose squote squote
+let dquotes         = enclose dquote dquote
+let bquotes         = enclose bquote bquote
+let braces          = enclose lbrace rbrace
+let parens          = enclose lparen rparen
+let angles          = enclose langle rangle
+let brackets        = enclose lbracket rbracket
+
+let fold f docs     = List.fold_right f docs empty
+
+let rec fold1 f docs =
+   match docs with
+   | [] ->
+       empty
+   | [ doc ] ->
+       doc
+   | doc :: docs ->
+       f doc (fold1 f docs)
+
+let rec fold1map f g docs =
+   match docs with
+   | [] ->
+       empty
+   | [ doc ] ->
+       g doc
+   | doc :: docs ->
+       let doc = g doc in (* force left-to-right evaluation *)
+       f doc (fold1map f g docs)
+
+let sepmap sep g docs =
+  fold1map (fun x y -> x ^^ sep ^^ y) g docs
+
+let optional f = function
+  | None ->
+      empty
+  | Some x ->
+      f x
+
+let group1 d = group (nest 1 d)
+let group2 d = group (nest 2 d)
+
+module Operators = struct
+  let ( !^ ) = text
+  let ( ^^ ) = ( ^^ )
+  let ( ^/^ ) x y = x ^^ break1 ^^ y
+  let ( ^//^ ) x y = group (x ^^ nest 2 (break1 ^^ y))
+  let ( ^@^ ) x y = group (x ^^ break1 ^^ y)
+  let ( ^@@^ ) x y = group2 (x ^^ break1 ^^ y)
+end
+
+open Operators
+let prefix op x = !^op ^//^ x
+let infix op x y = (x ^^ space ^^ !^op) ^//^ y
+let infix_dot op x y = group2 ((x ^^ !^op) ^^ break0 ^^ y)
+let infix_com op x y = x ^^ !^op ^^ group_break1 ^^ y
+let surround n sep open_doc contents close_doc =
+  group (open_doc ^^ nest n (sep ^^ contents) ^^ sep ^^ close_doc)
+let surround1 open_txt contents close_txt =
+  surround 1 break0 !^open_txt contents !^close_txt
+let surround2 open_txt contents close_txt =
+  surround 2 break1 !^open_txt contents !^close_txt
+
+let soft_surround n sep open_doc contents close_doc =
+  group (open_doc ^^ nest n (group sep ^^ contents) ^^
+         group (sep ^^ close_doc))
+
+let seq indent break empty_seq open_seq sep_seq close_seq = function
+  | [] -> empty_seq
+  | xs ->
+      surround indent break
+        open_seq (fold1 (fun x xs -> x ^^ sep_seq ^^ xs) xs) close_seq
+let seq1 open_txt sep_txt close_txt =
+  seq 1 break0 !^(open_txt ^ close_txt) !^open_txt (!^sep_txt ^^ break1) !^close_txt
+let seq2 open_txt sep_txt close_txt =
+  seq 2 break1 !^(open_txt ^ close_txt) !^open_txt (!^sep_txt ^^ break1) !^close_txt
+
+let sprintf fmt = Printf.ksprintf string fmt
+
+(* A signature for value representations.
+   This is compatible with the associated Camlp4 generator:
+     SwitchValueRepresentation *)
+
+module type VALUE_REPRESENTATION = sig
+  (* The type of value representation *)
+  type t
+
+  (* [variant type_name data_constructor_name tag arguments]
+        Given information about the variant and its arguments,
+        this function produces a new value representation. *)
+  val variant : string -> string -> int -> t list -> t
+
+  (* [record type_name fields]
+        Given a type name and a list of record fields, this function
+        produces the value representation of a record. *)
+  val record : string -> (string * t) list -> t
+
+  (* [tuple arguments]
+        Given a list of value representation this function produces
+        a new value representation. *)
+  val tuple : t list -> t
+
+  (* ------------------------------------------------------------------------- *)
+
+  (* Value representation for primitive types. *)
+
+  val string : string -> t
+  val int : int -> t
+  val int32 : int32 -> t
+  val int64 : int64 -> t
+  val nativeint : nativeint -> t
+  val float : float -> t
+  val char : char -> t
+  val bool : bool -> t
+  val option : ('a -> t) -> 'a option -> t
+  val list : ('a -> t) -> 'a list -> t
+  val array : ('a -> t) -> 'a array -> t
+  val ref : ('a -> t) -> 'a ref -> t
+
+  (* Value representation for any other value. *)
+  val unknown : string -> 'a -> t
+end
+
+module type DOCUMENT_VALUE_REPRESENTATION =
+  VALUE_REPRESENTATION with type t = document
+
+(* please remove as soon as this will be available in ocaml *)
+module MissingFloatRepr = struct
+  let valid_float_lexeme s =
+    let l = String.length s in
+    let rec loop i =
+      if i >= l then s ^ "." else
+      match s.[i] with
+      | '0' .. '9' | '-' -> loop (i+1)
+      | _ -> s
+    in loop 0
+
+  let float_repres f =
+    match classify_float f with
+      FP_nan -> "nan"
+    | FP_infinite ->
+        if f < 0.0 then "neg_infinity" else "infinity"
+    | _ ->
+        let s1 = Printf.sprintf "%.12g" f in
+        if f = float_of_string s1 then valid_float_lexeme s1 else
+        let s2 = Printf.sprintf "%.15g" f in
+        if f = float_of_string s2 then valid_float_lexeme s2 else
+        Printf.sprintf "%.18g" f
+end
+
+module ML = struct
+  type t = document
+  let tuple = seq1 "(" "," ")"
+  let variant _ cons _ args =
+    if args = [] then !^cons else !^cons ^^ tuple args
+  let record _ fields =
+    seq2 "{" ";" "}" (List.map (fun (k, v) -> infix ":" !^k v) fields)
+  let option f = function
+    | Some x -> !^"Some" ^^ tuple [f x]
+    | None -> !^"None"
+  let list f xs = seq2 "[" ";" "]" (List.map f xs)
+  let array f xs = seq2 "[|" ";" "|]" (Array.to_list (Array.map f xs))
+  let ref f x = record "ref" ["contents", f !x]
+  let float f = string (MissingFloatRepr.float_repres f)
+  let int = sprintf "%d"
+  let int32 = sprintf "%ld"
+  let int64 = sprintf "%Ld"
+  let nativeint = sprintf "%nd"
+  let char = sprintf "%C"
+  let bool = sprintf "%B"
+  let string = sprintf "%S"
+  let unknown tyname _ = sprintf "<abstr:%s>" tyname
+end
+
+(* Deprecated *)
+let line            = ifflat space hardline
+let linebreak       = ifflat empty hardline
+let softline        = group line
+let softbreak       = group linebreak
diff --git a/bundles/menhirLib/menhir-20120123/src/pprint.mli b/bundles/menhirLib/menhir-20120123/src/pprint.mli
new file mode 100644 (file)
index 0000000..6988cea
--- /dev/null
@@ -0,0 +1,283 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* ------------------------------------------------------------------------- *)
+
+(* Basic combinators for building documents. *)
+
+type document
+
+val empty: document
+val hardline: document
+val char: char -> document
+val substring: string -> int -> int -> document
+val text: string -> document
+val blank: int -> document
+val (^^): document -> document -> document
+val nest: int -> document -> document
+val column: (int -> document) -> document
+val nesting: (int -> document) -> document
+val group: document -> document
+val ifflat: document -> document -> document
+
+(* ------------------------------------------------------------------------- *)
+
+(* Low-level combinators for alignment and indentation. *)
+
+val align: document -> document
+val hang: int -> document -> document
+val indent: int -> document -> document
+
+(* ------------------------------------------------------------------------- *)
+
+(* High-level combinators for building documents. *)
+
+(* [break n] Puts [n] spaces in flat mode and a new line otherwise.
+   Equivalent to: [ifflat (String.make n ' ') hardline] *)
+val break: int -> document
+
+(* [break0] equivalent to [break 0] *)
+val break0: document
+
+(* [break1] equivalent to [break 1] *)
+val break1: document
+
+val string: string -> document
+val words: string -> document
+
+val lparen: document
+val rparen: document
+val langle: document
+val rangle: document
+val lbrace: document
+val rbrace: document
+val lbracket: document
+val rbracket: document
+val squote: document
+val dquote: document
+val bquote: document
+val semi: document
+val colon: document
+val comma: document
+val space: document
+val dot: document
+val sharp: document
+val backslash: document
+val equals: document
+val qmark: document
+val tilde: document
+val at: document
+val percent: document
+val dollar: document
+val caret: document
+val ampersand: document
+val star: document
+val plus: document
+val minus: document
+val underscore: document
+val bang: document
+val bar: document
+
+val squotes: document -> document
+val dquotes: document -> document
+val bquotes: document -> document
+val braces: document -> document
+val parens: document -> document
+val angles: document -> document
+val brackets: document -> document
+
+val fold: (document -> document -> document) -> document list -> document
+val fold1: (document -> document -> document) -> document list -> document
+val fold1map: (document -> document -> document) -> ('a -> document) -> 'a list -> document
+val sepmap: document -> ('a -> document) -> 'a list -> document
+
+val optional: ('a -> document) -> 'a option -> document
+
+(* [prefix left right]
+      Flat layout: [left] [right]
+      Otherwise:   [left]
+                     [right]
+ *)
+val prefix: string -> document -> document
+
+(* [infix middle left right]
+      Flat layout: [left] [middle] [right]
+      Otherwise:   [left] [middle]
+                     [right]
+ *)
+val infix: string -> document -> document -> document
+
+(* [infix_com middle left right]
+      Flat layout: [left][middle] [right]
+      Otherwise:   [left][middle]
+                     [right]
+ *)
+val infix_com: string -> document -> document -> document
+
+(* [infix_dot middle left right]
+      Flat layout: [left][middle][right]
+      Otherwise: [left][middle]
+                    [right]
+ *)
+val infix_dot: string -> document -> document -> document
+
+(* [surround nesting break open_doc contents close_doc] *)
+val surround: int -> document -> document -> document -> document -> document
+
+(* [surround1 open_txt contents close_txt]
+     Flat:      [open_txt][contents][close_txt]
+     Otherwise: [open_txt]
+                 [contents]
+                [close_txt]
+ *)
+val surround1: string -> document -> string -> document
+
+(* [surround2 open_txt contents close_txt]
+     Flat:      [open_txt] [contents] [close_txt]
+     Otherwise: [open_txt]
+                  [contents]
+                [close_txt]
+ *)
+val surround2: string -> document -> string -> document
+
+(* [soft_surround nesting break open_doc contents close_doc] *)
+val soft_surround: int -> document -> document -> document -> document -> document
+
+(* [seq indent break empty_seq open_seq sep_seq close_seq contents] *)
+val seq: int -> document -> document -> document -> document -> document ->
+         document list -> document 
+
+(* [seq1 open_seq sep_seq close_seq contents]
+     Flat layout: [open_seq][contents][sep_seq]...[sep_seq][contents][close_seq]
+     Otherwise:   [open_seq]
+                   [contents][sep_seq]...[sep_seq][contents]
+                  [close_seq]
+ *)
+val seq1: string -> string -> string -> document list -> document
+
+(* [seq2 open_seq sep_seq close_seq contents]
+     Flat layout: [open_seq] [contents][sep_seq]...[sep_seq][contents] [close_seq]
+     Otherwise:   [open_seq]
+                    [contents][sep_seq]...[sep_seq][contents]
+                  [close_seq]
+ *)
+val seq2: string -> string -> string -> document list -> document
+
+(* [group1 d] equivalent to [group (nest 1 d)] *)
+val group1: document -> document
+
+(* [group2 d] equivalent to [group (nest 2 d)] *)
+val group2: document -> document
+
+module Operators : sig
+  val ( ^^ ) : document -> document -> document
+  val ( !^ ) : string -> document
+  val ( ^/^ ) : document -> document -> document
+  val ( ^//^ ) : document -> document -> document
+  val ( ^@^ ) : document -> document -> document
+  val ( ^@@^ ) : document -> document -> document
+end
+
+(* ------------------------------------------------------------------------- *)
+
+(* A signature for document renderers. *)
+
+module type RENDERER = sig
+  
+  (* Output channels. *)
+
+  type channel
+
+  (* [pretty rfrac width channel document] pretty-prints the document
+     [document] to the output channel [channel]. The parameter [width] is the
+     maximum number of characters per line. The parameter [rfrac] is the
+     ribbon width, a fraction relative to [width]. The ribbon width is the
+     maximum number of non-indentation characters per line. *)
+
+  val pretty: float -> int -> channel -> document -> unit
+
+  (* [compact channel document] prints the document [document] to the output
+     channel [channel]. No indentation is used. All newline instructions are
+     respected, that is, no groups are flattened. *)
+
+  val compact: channel -> document -> unit
+
+end
+
+(* ------------------------------------------------------------------------- *)
+
+(* Renderers to output channels and to memory buffers. *)
+
+module Channel : RENDERER with type channel = out_channel
+
+module Buffer : RENDERER with type channel = Buffer.t
+
+(* ------------------------------------------------------------------------- *)
+
+(* A signature for value representations.
+   This is compatible with the associated Camlp4 generator:
+     SwitchValueRepresentation *)
+
+module type VALUE_REPRESENTATION = sig
+  (* The type of value representation *)
+  type t
+
+  (* [variant type_name data_constructor_name tag arguments]
+        Given information about the variant and its arguments,
+        this function produces a new value representation. *)
+  val variant : string -> string -> int -> t list -> t
+
+  (* [record type_name fields]
+        Given a type name and a list of record fields, this function
+        produces the value representation of a record. *)
+  val record : string -> (string * t) list -> t
+
+  (* [tuple arguments]
+        Given a list of value representation this function produces
+        a new value representation. *)
+  val tuple : t list -> t
+
+  (* ------------------------------------------------------------------------- *)
+
+  (* Value representation for primitive types. *)
+
+  val string : string -> t
+  val int : int -> t
+  val int32 : int32 -> t
+  val int64 : int64 -> t
+  val nativeint : nativeint -> t
+  val float : float -> t
+  val char : char -> t
+  val bool : bool -> t
+  val option : ('a -> t) -> 'a option -> t
+  val list : ('a -> t) -> 'a list -> t
+  val array : ('a -> t) -> 'a array -> t
+  val ref : ('a -> t) -> 'a ref -> t
+
+  (* Value representation for any other value. *)
+  val unknown : string -> 'a -> t
+end
+
+(* A signature for source printers. *)
+
+module type DOCUMENT_VALUE_REPRESENTATION =
+  VALUE_REPRESENTATION with type t = document
+
+module ML : DOCUMENT_VALUE_REPRESENTATION
+
+(* Deprecated *)
+val line: document
+val linebreak: document
+val softline: document
+val softbreak: document
diff --git a/bundles/menhirLib/menhir-20120123/src/preFront.ml b/bundles/menhirLib/menhir-20120123/src/preFront.ml
new file mode 100644 (file)
index 0000000..d9931b4
--- /dev/null
@@ -0,0 +1,102 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+open Printf
+open Syntax
+
+let read_whole_file filename =
+
+  (* Open the file in text mode, so that (under Windows) CRLF is converted to LF.
+     This guarantees that one byte is one character and seems to be required in
+     order to report accurate positions. *)
+
+  let channel = open_in filename in
+
+  (* The standard library functions [pos_in] and [seek_in] do not work correctly
+     when CRLF conversion is being performed, so we abandon their use. (They were
+     used to go and extract the text of semantic actions.) Instead we load the
+     entire file into memory up front, and work with a string. *)
+
+  (* The standard library function [in_channel_length] does not work correctly
+     when CRLF conversion is being performed, so we do not use it to read the
+     whole file. And the standard library function [Buffer.add_channel] uses
+     [really_input] internally, so we cannot use it either. Bummer. *)
+
+  let block_size = 16384 in
+  let b = Buffer.create block_size in
+  let s = String.create block_size in
+
+  let rec loop () =
+    let read = input channel s 0 block_size in
+    if read > 0 then begin
+      Buffer.add_substring b s 0 read;
+      loop()
+    end
+  in
+
+  loop();
+  close_in channel;
+  Buffer.contents b
+
+let load_partial_grammar filename = 
+  if Filename.check_suffix filename (if Settings.coq then ".vy" else ".mly") then
+    Error.set_filename filename
+  else
+    Error.error [] (sprintf "argument file names should end in .mly. \"%s\" is not accepted." filename);
+  try
+
+    let contents = read_whole_file filename in
+    Error.file_contents := Some contents;
+    let lexbuf = Lexing.from_string contents in
+    lexbuf.Lexing.lex_curr_p <-
+       { 
+         Lexing.pos_fname = filename; 
+         Lexing.pos_lnum  = 1;
+         Lexing.pos_bol   = 0; 
+         Lexing.pos_cnum  = 0
+       };
+    let grammar =
+      { (Parser.grammar Lexer.main lexbuf) with ConcreteSyntax.pg_filename = filename }
+    in
+    Error.file_contents := None;
+
+    (* If there were errors during parsing, stop. This has to be done
+       explicitly here because the parser performs error recovery and
+       does not die at the first error. One could even go further and
+       attempt to work with the grammar in spite of the parse errors,
+       but we choose not to. *)
+
+    if Error.errors () then
+      exit 1
+    else
+      grammar
+
+  with Sys_error msg ->
+    Error.error [] msg
+
+let partial_grammars = 
+  List.map load_partial_grammar Settings.filenames
+
+let () =
+  Time.tick "Lexing and parsing"
+
+let parameterized_grammar = 
+  PartialGrammar.join_partial_grammars partial_grammars
+
+let grammar = 
+  ParameterizedGrammar.expand parameterized_grammar
+
+let () =
+  Time.tick "Joining and expanding"
+
diff --git a/bundles/menhirLib/menhir-20120123/src/preFront.mli b/bundles/menhirLib/menhir-20120123/src/preFront.mli
new file mode 100644 (file)
index 0000000..70f1bba
--- /dev/null
@@ -0,0 +1,28 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* This module drives the first half of the front-end. It opens and
+   parses the input files, which yields a number of partial
+   grammars. It joins these grammars, expands them to get rid of
+   parameterized nonterminals, and performs reachability
+   analysis. This yields a single unified grammar.
+
+   More transformations over this grammar are performed in the second
+   half of the front-end, which is driven by [Front]. The modules
+   [PreFront] and [Front] are separated because it is convenient to
+   insert auxiliary modules, such as [TokenType] and [Infer], in
+   between the two.  *)
+
+val grammar: UnparameterizedSyntax.grammar
+
diff --git a/bundles/menhirLib/menhir-20120123/src/printer.ml b/bundles/menhirLib/menhir-20120123/src/printer.ml
new file mode 100644 (file)
index 0000000..36aba64
--- /dev/null
@@ -0,0 +1,667 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* A pretty-printer for [IL]. *)
+
+open IL
+open Printf
+
+module Make (X : sig
+
+  (* This is the channel that is being written to. *)
+
+  val f: out_channel
+
+  (* If [raw_stretch_action] is set, then we print the semantic actions
+     as they are found into the original source code. *)
+  val raw_stretch_action: bool
+
+  (* This controls the way we print Objective Caml stretches (types and
+     semantic actions). We either surround them with #line directives
+     (for better error reports if the generated code is ill - typed) or
+     don't (for better readability). The value is either [None] -- do
+     not provide #line directives -- or [Some filename] -- do provide
+     them. [filename] is the name of the file that is being written
+     to. *)
+
+  val locate_stretches: string option
+
+end) = struct
+
+(* ------------------------------------------------------------------------- *)
+(* Dealing with newlines and indentation. *)
+
+let maxindent =
+  120
+
+let whitespace =
+  String.make maxindent ' '
+
+let indentation =
+  ref 0
+
+let line =
+  ref 1
+
+(* [rawnl] is, in principle, the only place where writing a newline
+   character to the output channel is permitted. This ensures that the
+   line counter remains correct. But see also [stretch] and [typ0]. *)
+
+let rawnl f =
+  incr line;
+  output_char f '\n'
+
+let nl f =
+  rawnl f;
+  output f whitespace 0 !indentation
+
+let indent ofs producer f x =
+  let old_indentation = !indentation in
+  let new_indentation = old_indentation + ofs in
+  if new_indentation <= maxindent then
+    indentation := new_indentation;
+  nl f;
+  producer f x;
+  indentation := old_indentation
+
+(* This produces a #line directive. *)
+
+let sharp f line file =
+  fprintf f "%t# %d \"%s\"%t" rawnl line file rawnl
+
+(* ------------------------------------------------------------------------- *)
+(* Printers of atomic elements. *)
+
+let nothing f =
+  ()
+
+let space f =
+  output_char f ' '
+
+let comma f =
+  output_string f ", "
+
+let seminl f =
+  output_char f ';';
+  nl f
+
+let times f =
+  output_string f " * "
+
+let letrec f =
+  output_string f "let rec "
+
+let letnonrec f =
+  output_string f "let "
+
+let keytyp f =
+  output_string f "type "
+
+let exc f =
+  output_string f "exception "
+
+let et f =
+  output_string f "and "
+
+let var f x =
+  output_string f x
+
+let bar f =
+  output_string f " | "
+
+(* ------------------------------------------------------------------------- *)
+(* List printers. *)
+
+let rec list elem sep f = function
+  | [] ->
+      ()
+  | e :: es ->
+      fprintf f "%t%a%a" sep elem e (list elem sep) es
+
+let rec typeparams p0 p1 f = function
+  | [] ->
+      ()
+  | [ param ] ->
+      fprintf f "%a " p0 param
+  | param :: params ->
+      fprintf f "(%a%a) " p1 param (list p1 comma) params
+
+(* ------------------------------------------------------------------------- *)
+(* Expression printer. *)
+
+(* We use symbolic constants that stand for subsets of the
+   expression constructors. We do not use numeric levels
+   to stand for subsets, because our subsets do not form
+   a linear inclusion chain. *)
+
+type subset =
+  | All
+  | AllButSeq
+  | AllButFunTryMatch
+  | AllButFunTryMatchSeq
+  | AllButLetFunTryMatch
+  | AllButLetFunTryMatchSeq
+  | AllButIfThen
+  | AllButIfThenSeq
+  | OnlyAppOrAtom
+  | OnlyAtom
+
+(* This computes the intersection of a subset with the
+   constraint "should not be a sequence". *)
+
+let andNotSeq = function
+  | All
+  | AllButSeq ->
+      AllButSeq
+  | AllButFunTryMatch
+  | AllButFunTryMatchSeq ->
+      AllButFunTryMatchSeq
+  | AllButLetFunTryMatch
+  | AllButLetFunTryMatchSeq ->
+      AllButLetFunTryMatchSeq
+  | AllButIfThen
+  | AllButIfThenSeq ->
+      AllButIfThenSeq
+  | OnlyAppOrAtom ->
+      OnlyAppOrAtom
+  | OnlyAtom ->
+      OnlyAtom
+
+(* This defines the semantics of subsets by relating
+   expressions with subsets. *)
+
+let rec member e k =
+  match e with
+  | EComment _
+  | EPatComment _ ->
+      true
+  | EFun _
+  | ETry _
+  | EMatch _ ->
+      begin
+       match k with
+       | AllButFunTryMatch
+       | AllButFunTryMatchSeq
+       | AllButLetFunTryMatch
+       | AllButLetFunTryMatchSeq
+       | OnlyAppOrAtom
+       | OnlyAtom ->
+           false
+       | _ ->
+           true
+      end
+  | ELet ([], e) ->
+      member e k
+  | ELet ((PUnit, _) :: _, _) ->
+      begin
+       match k with
+       | AllButSeq
+       | AllButFunTryMatchSeq
+       | AllButLetFunTryMatchSeq
+       | AllButIfThenSeq
+       | OnlyAppOrAtom
+       | OnlyAtom ->
+           false
+       | _ ->
+           true
+      end
+  | ELet (_ :: _, _) ->
+      begin
+       match k with
+       | AllButLetFunTryMatch
+       | AllButLetFunTryMatchSeq
+       | OnlyAppOrAtom
+       | OnlyAtom ->
+           false
+       | _ ->
+           true
+      end
+  | EIfThen _ ->
+      begin
+       match k with
+       | AllButIfThen
+       | AllButIfThenSeq
+       | OnlyAppOrAtom
+       | OnlyAtom ->
+           false
+       | _ ->
+           true
+      end
+  | EApp (_, _ :: _)
+  | EData (_, _ :: _)
+  | EMagic _
+  | ERepr _
+  | ERaise _ ->
+      begin
+       match k with
+       | OnlyAtom ->
+           false
+       | _ ->
+           true
+      end
+  | ERecordWrite _
+  | EIfThenElse _ ->
+      begin
+       match k with
+       | OnlyAppOrAtom
+       | OnlyAtom ->
+           false
+       | _ ->
+           true
+      end
+  | EVar _
+  | ETextual _
+  | EApp (_, [])
+  | EData (_, [])
+  | ETuple _
+  | EAnnot _
+  | ERecord _
+  | ERecordAccess (_, _)
+  | EIntConst _
+  | EStringConst _
+  | EUnit
+  | EArray _
+  | EArrayAccess (_, _) ->
+      true
+
+
+let rec exprlet k pes f e2 =
+  match pes with
+  | [] ->
+      exprk k f e2
+  | (PUnit, e1) :: pes ->
+      fprintf f "%a%t%a" (exprk AllButLetFunTryMatch) e1 seminl (exprlet k pes) e2
+  | (PVar id1, EAnnot (e1, ts1)) :: pes ->
+      (* TEMPORARY current ocaml does not support type schemes here; drop quantifiers, if any *)
+      fprintf f "let %s : %a = %a in%t%a" id1 typ ts1.body (* scheme ts1 *) expr e1 nl (exprlet k pes) e2
+  | (PVar id1, EFun (ps1, e1)) :: pes ->
+      fprintf f "let %s%a = %a in%t%t%a"
+       id1 (list pat0 space) ps1 (indent 2 expr) e1 nl nl (exprlet k pes) e2
+  | (p1, (ELet _ as e1)) :: pes ->
+      fprintf f "let %a =%a%tin%t%a" pat p1 (indent 2 expr) e1 nl nl (exprlet k pes) e2
+  | (p1, e1) :: pes ->
+      fprintf f "let %a = %a in%t%a" pat p1 expr e1 nl (exprlet k pes) e2
+
+and atom f e =
+  exprk OnlyAtom f e
+
+and app f e =
+  exprk OnlyAppOrAtom f e
+
+and expr f e =
+  exprk All f e
+
+and exprk k f e =
+  if member e k then
+    match e with
+    | EComment (c, e) ->
+       if Settings.comment then
+         fprintf f "(* %s *)%t%a" c nl (exprk k) e
+       else
+         exprk k f e
+    | EPatComment (s, p, e) ->
+       if Settings.comment then
+         fprintf f "(* %s%a *)%t%a" s pat p nl (exprk k) e
+       else
+         exprk k f e
+    | ELet (pes, e2) ->
+       exprlet k pes f e2
+    | ERecordWrite (e1, field, e2) ->
+       fprintf f "%a.%s <- %a" atom e1 field (exprk (andNotSeq k)) e2
+    | EMatch (e, []) ->
+       assert false
+    | EMatch (e, brs) ->
+       fprintf f "match %a with%a" expr e (branches k) brs
+    | ETry (_, []) ->
+       assert false
+    | ETry (e, brs) ->
+       fprintf f "try%a%twith%a" (indent 2 expr) e nl (branches k) brs
+    | EIfThen (e1, e2) ->
+       fprintf f "if %a then%a" expr e1 (indent 2 (exprk (andNotSeq k))) e2
+    | EIfThenElse (e0, e1, e2) ->
+       fprintf f "if %a then%a%telse%a"
+          expr e0 (indent 2 (exprk AllButIfThenSeq)) e1 nl (indent 2 (exprk (andNotSeq k))) e2
+    | EFun (ps, e) ->
+       fprintf f "fun%a ->%a" (list pat0 space) ps (indent 2 (exprk k)) e
+    | EApp (EVar op, [ e1; e2 ])
+      when op.[0] = '(' && op.[String.length op - 1] = ')' ->
+       let op = String.sub op 1 (String.length op - 2) in
+       fprintf f "%a %s %a" app e1 op app e2
+    | EApp (e, args) ->
+       fprintf f "%a%a" app e (list atom space) args
+    | ERaise e ->
+       fprintf f "raise %a" atom e
+    | EMagic e ->
+       fprintf f "Obj.magic %a" atom e
+    | ERepr e ->
+       fprintf f "Obj.repr %a" atom e
+    | EData (d, []) ->
+       var f d
+    | EData (d, [ arg ]) ->
+       fprintf f "%s %a" d atom arg
+    | EData (d, arg :: args) ->
+       fprintf f "%s (%a%a)" d app arg (list app comma) args
+    | EVar v ->
+       var f v
+    | ETextual action ->
+       stretch (X.raw_stretch_action) f action
+    | EUnit ->
+       fprintf f "()"
+    | EIntConst k ->
+       if k >= 0 then
+         fprintf f "%d" k
+       else
+         fprintf f "(%d)" k
+    | EStringConst s ->
+       fprintf f "\"%s\"" (String.escaped s)
+    | ETuple [] ->
+       assert false
+    | ETuple [ e ] ->
+       atom f e
+    | ETuple (e :: es) ->
+       fprintf f "(%a%a)" app e (list app comma) es
+    | EAnnot (e, s) ->
+       (* TEMPORARY current ocaml does not support type schemes here; drop quantifiers, if any *)
+       fprintf f "(%a : %a)" app e typ s.body (* should be scheme s *)
+    | ERecordAccess (e, field) ->
+       fprintf f "%a.%s" atom e field
+    | ERecord fs ->
+       fprintf f "{%a}" (indent 2 (list field nothing)) fs
+    | EArray fs ->
+       fprintf f "[|%a|]" (indent 2 (list array_field nothing)) fs
+    | EArrayAccess (e, i) ->
+       fprintf f "%a.(%a)" atom e expr i
+  else
+    fprintf f "(%a)" expr e
+
+and stretch raw f stretch =
+  let content = stretch.Stretch.stretch_content
+  and raw_content = stretch.Stretch.stretch_raw_content in
+  match X.locate_stretches with
+  | Some basename ->
+      sharp f stretch.Stretch.stretch_linenum stretch.Stretch.stretch_filename;
+      output_string f content;
+      line := !line + stretch.Stretch.stretch_linecount;
+      sharp f (!line + 2) basename;
+      output f whitespace 0 !indentation
+  | None ->
+      output_string f (if raw then raw_content else content)
+
+and branches k f = function
+  | [] ->
+      ()
+  | [ br ] ->
+      fprintf f "%t| %a" nl (branch k) br
+  | br :: brs ->
+      fprintf f "%t| %a%a" nl (branch AllButFunTryMatch) br (branches k) brs
+
+and branch k f br =
+  fprintf f "%a ->%a" pat br.branchpat (indent 4 (exprk k)) br.branchbody
+
+and field f (label, e) =
+  fprintf f "%s = %a%t" label app e seminl
+
+and fpats f fps =
+  list fpat nothing f fps
+
+and fpat f = function
+  | (_, PWildcard) ->
+      () (* in a record pattern, fields can be omitted *)
+  | (label, p) ->
+      fprintf f "%s = %a%t" label pat p seminl
+
+and array_field f e =
+  fprintf f "%a%t" app e seminl
+
+and pat0 f = function
+  | PUnit ->
+      fprintf f "()"
+  | PWildcard ->
+      fprintf f "_"
+  | PVar x ->
+      var f x
+  | PData (d, []) ->
+      var f d
+  | PTuple [] ->
+      assert false
+  | PTuple [ p ] ->
+      pat0 f p
+  | PTuple (p :: ps) ->
+      fprintf f "(%a%a)" pat1 p (list pat1 comma) ps
+  | PAnnot (p, t) ->
+      fprintf f "(%a : %a)" pat p typ t
+  | PRecord fps ->
+      fprintf f "{%a}" (indent 2 fpats) fps
+  | p ->
+      fprintf f "(%a)" pat p
+
+and pat1 f = function
+  | PData (d, [ arg ]) ->
+      fprintf f "%s %a" d pat0 arg
+  | PData (d, arg :: args) ->
+      fprintf f "%s (%a%a)" d pat1 arg (list pat1 comma) args
+  | PTuple [ p ] ->
+      pat1 f p
+  | p ->
+      pat0 f p
+
+and pat2 f = function
+  | POr [] ->
+      assert false
+  | POr (p :: ps) ->
+      fprintf f "%a%a" pat2 p (list pat2 bar) ps
+  | PTuple [ p ] ->
+      pat2 f p
+  | p ->
+      pat1 f p
+
+and pat f p =
+  pat2 f p
+
+and typevar f v =
+  fprintf f "'%s" v
+
+and typ0 f = function
+  | TypTextual (Stretch.Declared ocamltype) ->
+      (* Parentheses are necessary to avoid confusion between 1 - ary
+        data constructor with n arguments and n - ary data constructor. *)
+      fprintf f "(%a)" (stretch true) ocamltype
+  | TypTextual (Stretch.Inferred t) ->
+      line := !line + LineCount.count 0 (Lexing.from_string t);
+      fprintf f "(%s)" t
+  | TypVar v ->
+      typevar f v
+  | TypApp (t, params) ->
+      fprintf f "%a%s" (typeparams typ0 typ) params t
+  | t ->
+      fprintf f "(%a)" typ t
+
+and typ1 f = function
+  | TypTuple [] ->
+      assert false
+  | TypTuple [ t ] ->
+      typ1 f t
+  | TypTuple (t :: ts) ->
+      fprintf f "%a%a" typ0 t (list typ0 times) ts
+  | t ->
+      typ0 f t
+
+and typ2 f = function
+  | TypArrow (t1, t2) ->
+      fprintf f "%a -> %a" typ1 t1 typ2 t2
+  | t ->
+      typ1 f t
+
+and typ f =
+  typ2 f
+
+and scheme f scheme =
+  match scheme.quantifiers with
+  | [] ->
+      typ f scheme.body
+  | qs ->
+      fprintf f "%a. %a" (list typevar space) qs typ scheme.body
+
+(* ------------------------------------------------------------------------- *)
+(* Toplevel definition printer. *)
+
+let datavalparams f = function
+  | [] ->
+      ()
+  | valparam :: valparams ->
+      fprintf f " of %a%a" typ valparam (list typ times) valparams
+
+let datatypeparams f = function
+  | None ->
+      ()
+  | Some typs ->
+      fprintf f "(* %a*)" (list typ space) typs (* TEMPORARY not great *)
+
+let datadef f def =
+  fprintf f "  | %s%a%a" def.dataname datavalparams def.datavalparams datatypeparams def.datatypeparams
+
+let fielddef f def =
+  fprintf f "  %s%s: %a"
+    (if def.modifiable then "mutable " else "")
+    def.fieldname
+    scheme def.fieldtype
+
+let typerhs f = function
+  | TDefRecord [] ->
+      assert false
+  | TDefRecord (field :: fields) ->
+      fprintf f " = {%t%a%a%t}" nl fielddef field (list fielddef seminl) fields nl
+  | TDefSum [] ->
+      ()
+  | TDefSum defs ->
+      fprintf f " = %a" (list datadef nl) defs
+  | TAbbrev t ->
+      fprintf f " = %a" typ t
+
+let typeconstraint f = function
+  | None ->
+      ()
+  | Some (t1, t2) ->
+      fprintf f "%tconstraint %a = %a" nl typ t1 typ t2
+
+let typedef f def =
+  fprintf f "%a%s%a%a%t%t"
+    (typeparams typevar typevar) def.typeparams
+    def.typename
+    typerhs def.typerhs
+    typeconstraint def.typeconstraint
+    nl nl
+
+let rec pdefs pdef sep1 sep2 f = function
+  | [] ->
+      ()
+  | def :: defs ->
+      fprintf f "%t%a%a" sep1 pdef def (pdefs pdef sep2 sep2) defs
+
+let valdef f = function
+  | { valpat = PVar id; valval = EAnnot (e, ts) } ->
+      (* TEMPORARY current ocaml does not support type schemes here; drop quantifiers, if any *)
+      fprintf f "%s : %a =%a%t%t" id typ ts.body (* scheme ts *) (indent 2 expr) e nl nl
+  | { valpat = p; valval = e } ->
+      fprintf f "%a =%a%t%t" pat p (indent 2 expr) e nl nl
+
+let valdefs =
+  pdefs valdef letrec et
+
+let nonrecvaldefs =
+  pdefs valdef letnonrec letnonrec
+
+let typedefs =
+  pdefs typedef keytyp et
+
+let directive f = function
+  | DirOpen s ->
+      fprintf f "open %s%t%t" s nl nl
+  | DirInclude s ->
+      fprintf f "include %s%t%t" s nl nl
+
+let directives =
+  pdefs directive nothing nothing
+
+let excdef f def =
+  match def.exceq with
+  | None ->
+      fprintf f "%s%t%t" def.excname nl nl
+  | Some s ->
+      fprintf f "%s = %s%t%t" def.excname s nl nl
+
+let excdefs =
+  pdefs excdef exc exc
+
+let functorparams intf body b f params =
+  match params with
+  | [] ->
+      fprintf f "%a%!" body b
+  | _ ->
+      fprintf f "module Make%a%t%s%t%a%t%tend%t%!"
+       (list (stretch false) nl) params
+       nl (if intf then ": sig" else "= struct") nl
+       (indent 2 body) b
+       nl nl nl
+
+let structure f p =
+  fprintf f "struct%aend" (
+    indent 2 (fun f p ->
+      fprintf f "%t%a%a%a"
+       nl
+       excdefs p.struct_excdefs
+       typedefs p.struct_typedefs
+       nonrecvaldefs p.struct_nonrecvaldefs
+    )
+  ) p
+
+
+let rec modexpr f = function
+  | MVar x ->
+      fprintf f "%s" x
+  | MStruct s ->
+      structure f s
+  | MApp (e1, e2) ->
+      fprintf f "%a (%a)" modexpr e1 modexpr e2
+
+let moduledef f d =
+  fprintf f "module %s = %a%t%t" d.modulename modexpr d.modulerhs nl nl
+
+let program f p =
+  fprintf f "%a%a"
+    excdefs p.excdefs
+    typedefs p.typedefs;
+  List.iter (stretch false f) p.prologue;
+  fprintf f "%a%a%a"
+    nonrecvaldefs p.nonrecvaldefs
+    (list moduledef nothing) p.moduledefs
+    valdefs p.valdefs;
+  List.iter (output_string f) p.postlogue
+
+let valdecl f (x, ts) =
+  fprintf f "val %s: %a" x typ ts.body
+
+let interface f i =
+  fprintf f "%a%a%a%!" excdefs i.excdecls typedefs i.typedecls (list valdecl nl) i.valdecls
+
+let program p =
+  functorparams false program p X.f p.paramdefs
+
+let interface i =
+  functorparams true interface i X.f i.paramdecls
+
+let expr e =
+  expr X.f e
+
+end
diff --git a/bundles/menhirLib/menhir-20120123/src/printer.mli b/bundles/menhirLib/menhir-20120123/src/printer.mli
new file mode 100644 (file)
index 0000000..7f013af
--- /dev/null
@@ -0,0 +1,45 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* A pretty-printer for [IL]. *)
+
+module Make (X : sig
+
+  (* This is the channel that is being written to. *)
+
+  val f: out_channel
+
+  (* If [raw_stretch_action] is set, then we print the semantic actions 
+     as they are found into the original source code. *)
+  val raw_stretch_action: bool
+
+  (* This controls the way we print Objective Caml stretches (types and
+     semantic actions). We either surround them with #line directives
+     (for better error reports if the generated code is ill-typed) or
+     don't (for better readability). The value is either [None] -- do
+     not provide #line directives -- or [Some filename] -- do provide
+     them. [filename] is the name of the file that is being written. *)
+
+  val locate_stretches: string option
+
+end) : sig
+
+  val program: IL.program -> unit
+
+  val expr: IL.expr -> unit
+
+  val interface: IL.interface -> unit
+
+end
+
diff --git a/bundles/menhirLib/menhir-20120123/src/rawPrinter.ml b/bundles/menhirLib/menhir-20120123/src/rawPrinter.ml
new file mode 100644 (file)
index 0000000..53f6f15
--- /dev/null
@@ -0,0 +1,231 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* A debugging pretty-printer for [IL]. Newlines are used liberally, so as to
+   facilitate diffs. *)
+
+open IL
+open Printf
+
+module Make (X : sig
+
+  (* This is the channel that is being written to. *)
+
+  val f: out_channel
+
+end) = struct
+
+(* ------------------------------------------------------------------------- *)
+(* XML-style trees. *)
+
+type tree =
+  | Node of string * tree list
+
+let node label ts =
+  Node (label, ts)
+
+(* ------------------------------------------------------------------------- *)
+(* Dealing with newlines and indentation. *)
+
+let maxindent =
+  120
+
+let whitespace =
+  String.make maxindent ' '
+
+let indentation =
+  ref 0
+
+let line =
+  ref 1
+
+(* [rawnl] is, in principle, the only place where writing a newline
+   character to the output channel is permitted. This ensures that the
+   line counter remains correct. But see also [stretch] and [typ0]. *)
+
+let rawnl f =
+  incr line;
+  output_char f '\n'
+
+let nl f =
+  rawnl f;
+  output f whitespace 0 !indentation
+
+let indent ofs producer f x =
+  let old_indentation = !indentation in
+  let new_indentation = old_indentation + ofs in
+  if new_indentation <= maxindent then
+    indentation := new_indentation;
+  nl f;
+  producer f x;
+  indentation := old_indentation
+
+(* ------------------------------------------------------------------------- *)
+(* Tree printers. *)
+
+let rec print_tree f = function
+  | Node (label, []) ->
+      output_char f '<';
+      output_string f label;
+      output_char f '/';
+      output_char f '>';
+      nl f
+  | Node (label, ts) ->
+      output_char f '<';
+      output_string f label;
+      output_char f '>';
+      indent 2 print_trees f ts;
+      output_char f '<';
+      output_char f '/';
+      output_string f label;
+      output_char f '>';
+      nl f
+
+and print_trees f = function
+  | [] ->
+      ()
+  | t :: ts ->
+      print_tree f t;
+      print_trees f ts
+
+(* ------------------------------------------------------------------------- *)
+(* Expression-to-tree converter. *)
+
+let rec expr e =
+  match e with
+  | EComment (c, e) ->
+      node "comment" [ string c; expr e ]
+  | EPatComment (s, p, e) ->
+      node "patcomment" [ string s; pat p; expr e ]
+  | ELet (pes, e2) ->
+      node "let" ( patexprs pes @ [ expr e2 ])
+  | ERecordWrite (e1, field, e2) ->
+      node "recordwrite" [ expr e1; string field; expr e2 ]
+  | EMatch (e, brs) ->
+      node "match" ( expr e :: branches brs )
+  | ETry (e, brs) ->
+      node "try" ( expr e :: branches brs )
+  | EIfThen (e1, e2) ->
+      node "ifthen" [ expr e1; expr e2 ]
+  | EIfThenElse (e0, e1, e2) ->
+      node "ifthenelse" [ expr e0; expr e1; expr e2 ]
+  | EFun (ps, e) ->
+      node "fun" ( pats ps @ [ expr e ])
+  | EApp (e, args) ->
+      node "app" ( expr e :: exprs args )
+  | ERaise e ->
+      node "raise" [ expr e ]
+  | EMagic e ->
+      node "magic" [ expr e ]
+  | ERepr e ->
+      node "repr" [ expr e ]
+  | EData (d, args) ->
+      node "data" ( string d :: exprs args )
+  | EVar v ->
+      node "var" [ string v ]
+  | ETextual action ->
+      node "text" [ stretch action ]
+  | EUnit ->
+      node "unit" []
+  | EIntConst k ->
+      node "int" [ int k ]
+  | EStringConst s ->
+      node "string" [ string s ]
+  | ETuple es ->
+      node "tuple" ( exprs es )
+  | EAnnot (e, s) ->
+      node "annot" [ expr e; scheme s ]
+  | ERecordAccess (e, field) ->
+      node "recordaccess" [ expr e; string field ]
+  | ERecord fs ->
+      node "record" (fields fs)
+  | EArray fs ->
+      node "array" (exprs fs)
+  | EArrayAccess (e1, e2) ->
+      node "arrayaccess" [ expr e1; expr e2 ]
+
+and exprs es =
+  List.map expr es
+
+and stretch stretch =
+  string stretch.Stretch.stretch_content
+
+and branches brs =
+  List.map branch brs
+
+and branch br =
+  node "branch" [ pat br.branchpat; expr br.branchbody ]
+
+and fields fs =
+  List.map field fs
+
+and field (label, e) =
+  node "field" [ string label; expr e ]
+
+and pats ps =
+  List.map pat ps
+
+and pat = function
+  | PUnit ->
+      node "punit" []
+  | PWildcard ->
+      node "pwildcard" []
+  | PVar x ->
+      node "pvar" [ string x ]
+  | PTuple ps ->
+      node "ptuple" (pats ps)
+  | PAnnot (p, t) ->
+      node "pannot" [ pat p; typ t ]
+  | PData (d, args) ->
+      node "pdata" (string d :: pats args)
+  | PRecord fps ->
+      node "precord" (fpats fps)
+  | POr ps ->
+      node "por" (pats ps)
+
+and fpats fps =
+  List.map fpat fps
+
+and fpat (_, p) =
+  pat p
+
+and patexprs pes =
+  List.map patexpr pes
+
+and patexpr (p, e) =
+  node "patexpr" [ pat p; expr e ]
+
+and string s =
+  node s []
+
+and int k =
+  node (string_of_int k) []
+
+and bool b =
+  node (if b then "true" else "false") []
+
+and scheme s =
+  string "omitted" (* TEMPORARY to be completed, someday *)
+
+and typ t =
+  string "omitted" (* TEMPORARY to be completed, someday *)
+
+(* ------------------------------------------------------------------------- *)
+(* Convert to a tree, then print the tree. *)
+
+let expr e = 
+  print_tree X.f (expr e)
+
+end
+
diff --git a/bundles/menhirLib/menhir-20120123/src/rawPrinter.mli b/bundles/menhirLib/menhir-20120123/src/rawPrinter.mli
new file mode 100644 (file)
index 0000000..155addb
--- /dev/null
@@ -0,0 +1,29 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* A debugging pretty-printer for [IL]. Newlines are used liberally, so as to
+   facilitate diffs. *)
+
+module Make (X : sig
+
+  (* This is the channel that is being written to. *)
+
+  val f: out_channel
+
+end) : sig
+
+  val expr: IL.expr -> unit
+
+end
+
diff --git a/bundles/menhirLib/menhir-20120123/src/reachability.ml b/bundles/menhirLib/menhir-20120123/src/reachability.ml
new file mode 100644 (file)
index 0000000..0e98be2
--- /dev/null
@@ -0,0 +1,55 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+open UnparameterizedSyntax
+open Syntax
+
+let rec visit grammar visited symbol =
+  try
+    let rule = StringMap.find symbol grammar.rules in
+    if not (StringSet.mem symbol visited) then
+      let visited = StringSet.add symbol visited in
+      List.fold_left (visitb grammar) visited rule.branches
+    else
+      visited
+  with Not_found ->
+    (* This is a terminal symbol. *)
+    assert (symbol = "error" || StringMap.mem symbol grammar.tokens);
+    visited
+
+and visitb grammar visited { producers = symbols } =
+  List.fold_left (visits grammar) visited symbols
+
+and visits grammar visited (symbol, _) =
+  visit grammar visited symbol
+
+let trim grammar =
+  if StringSet.cardinal grammar.start_symbols = 0 then
+    Error.error [] "no start symbol has been declared."
+  else
+    let reachable =
+      StringSet.fold (fun symbol visited ->
+       visit grammar visited symbol
+      ) grammar.start_symbols StringSet.empty 
+    in
+    StringMap.iter (fun symbol rule ->
+      if not (StringSet.mem symbol reachable) then
+       Error.grammar_warning
+         rule.positions
+         (Printf.sprintf
+            "symbol %s is unreachable from any of the start symbol(s)."
+              symbol)
+    ) grammar.rules;
+    { grammar with rules = StringMap.restrict reachable grammar.rules }
+
diff --git a/bundles/menhirLib/menhir-20120123/src/reachability.mli b/bundles/menhirLib/menhir-20120123/src/reachability.mli
new file mode 100644 (file)
index 0000000..66c2860
--- /dev/null
@@ -0,0 +1,20 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* This extremely simple analysis restricts a grammar to the set
+   of nonterminals that are reachable, via productions, from the
+   start nonterminals. *)
+
+val trim: UnparameterizedSyntax.grammar -> UnparameterizedSyntax.grammar
+
diff --git a/bundles/menhirLib/menhir-20120123/src/reductionGraphs.ml b/bundles/menhirLib/menhir-20120123/src/reductionGraphs.ml
new file mode 100644 (file)
index 0000000..e9d1ab6
--- /dev/null
@@ -0,0 +1,361 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* This file contains experimental code that has been used in an attempt to
+   explore the validation of the termination property for LR(1) automata. *)
+
+(* This code is currently unused. It could be plugged in again (at the end of
+   the module [Invariant]. *)
+
+(* ------------------------------------------------------------------------ *)
+(* Build a graph of all reductions. The vertices are the states of the automaton;
+   there is an edge from [s1] to [s2] if a reduction (including the goto step)
+   can take us from [s1] to [s2]. Every edge is labeled with its effect on the
+   size of the stack. *)
+
+(* This graph is built with respect to a fixed lookahead token [tok]. We 
+   consider only the reductions that are permitted with [tok] is the next
+   token on the stream. *)
+
+exception NoDanger
+
+let clique_count =
+  ref 0
+
+let make_reduction_graph tok =
+
+  (* Build the reduction graph for this token. The main part of the work
+     is to define the edges; the rest is immediate. *)
+
+  let module ReductionGraph = struct
+
+    type node =
+       Lr1.node
+
+    let n =
+      Lr1.n
+
+    let index =
+      Lr1.number
+
+    (* This auxiliary function pops [n] cells off an abstract stack. The
+       parameter [states] is a set of states that we might be in before
+       popping. The function returns a set of states that we might be in
+       after popping. *)
+
+    let rec pop_word n states w =
+      if n = 0 then
+       states
+      else
+       match w with
+       | [] ->
+           (* the invariant is too weak to ensure that reduction is possible! *)
+           assert false
+       | (_, states) :: w ->
+           pop_word (n-1) states w
+
+    let pop_stack n states (w, _) =
+      pop_word n states w
+
+    (* The following function allows listing the successors of a node. Each
+       edge is labeled with an integer value that represents the decrease in
+       the size of the stack. *)
+
+    let successors (action : int -> node -> unit) node : unit =
+      (* Find which reductions are permitted at this node. *)
+      let prods =
+       match has_default_reduction node with
+       | Some (prod, _) ->
+           [ prod ]
+       | None ->
+           try
+             TerminalMap.find tok (Lr1.reductions node)
+           with Not_found ->
+             []
+      in
+      (* Get a description of the stack at this node. *)
+      let stack = lfp node in
+      (* For each production [prod], ... *)
+      List.iter (fun prod ->
+       (* If this is a start production, ignore it. We are not interested in
+          accept actions, only in true reduce actions. *)
+       match Production.classify prod with
+       | Some _ ->
+           ()
+       | None ->
+           (* Find out how many cells are popped. *)
+           let decrease = Production.length prod in
+           (* Find out what states we might be in after popping. *)
+           let states = pop_stack decrease (Lr1.NodeSet.singleton node) stack in
+           (* Now, the goto step pushes one cell... *)
+           let increase = 1 in
+           let net = decrease - increase in
+           (* Find out which states we might be in after the goto step. *)
+           let symbol = Symbol.N (Production.nt prod) in
+           let goto (state : Lr1.node) : Lr1.node =
+             try
+               SymbolMap.find symbol (Lr1.transitions state)
+             with Not_found ->
+               (* the invariant is too weak to ensure that goto is possible! *)
+               assert false
+           in
+           (* There is a transition, labelled [decrease - increase], from [node]
+              to every state in the image through [goto] of the set [states]. *)
+           Lr1.NodeSet.iter (fun state ->
+             action net (goto state)
+           ) states
+      ) prods
+
+    let iter =
+      Lr1.iter
+
+    (* The [successors] function describes a multi-graph: there might be multiple
+       edges with the same source and target nodes. In that case, we would like
+       to keep only one, the one with minimum weight, as this is the most dangerous
+       one. Do so (naively). *)
+
+    let adjacency : (int * node) list Lr1.NodeMap.t ref =
+      ref Lr1.NodeMap.empty
+
+    let () =
+      iter (fun source ->
+       (* Compute a list of outgoing edges. *)
+       let edges = ref [] in
+       successors (fun weight target ->
+         edges := (weight, target) :: !edges;
+       ) source;
+       let edges =
+         List.sort (fun (weight1, _) (weight2, _) -> weight1 - weight2) !edges
+       in
+       (* Define a predicate that accepts an edge only the first time
+          its target node is seen. *)
+       let seen =
+         ref Lr1.NodeSet.empty
+       in
+       let acceptable (_, node) =
+         if Lr1.NodeSet.mem node !seen then
+           false
+         else begin
+           seen := Lr1.NodeSet.add node !seen;
+           true
+         end
+       in
+       (* Filter the list of edges. This relies on [filter] evaluating the
+          predicate left-to-right. *)
+       let edges = List.filter acceptable edges in
+       (* Augment the table. *)
+       adjacency := Lr1.NodeMap.add source edges !adjacency
+      ) 
+
+    let successors (action : int -> node -> unit) source : unit =
+      let edges =
+       try
+         Lr1.NodeMap.find source !adjacency
+       with Not_found ->
+         assert false
+      in
+      List.iter (fun (weight, target) ->
+       action weight target
+      ) edges
+
+  end in
+
+  (* We are interested in determining whether the reduction graph contains
+     simple cycles of nonpositive weight. In order to answer this question,
+     it is sufficient (and more tractable) to consider each strongly connected
+     component separately. *)
+
+  (* Compute the strongly connected components. *)
+
+  let module SCC =
+    Tarjan.Run (struct
+      include ReductionGraph
+      (* Forget the edge labels. *)
+      let successors action node =
+       successors (fun _ target -> action target) node
+    end)
+  in
+
+  (* Examine the components, one at a time. *)
+
+  SCC.iter (fun representative elements ->
+    match elements with
+    | [] ->
+       assert false
+    | [ _ ] ->
+       ()
+    | _ ->
+
+       try
+
+         (* We have a non-trivial component. [representative] is its
+            representative, and [elements] is the list of its elements. *)
+
+         (* This auxiliary function tests whether a node is a member of
+            this component. *)
+
+         let member node =
+           Lr1.number (SCC.representative node) = Lr1.number representative
+         in
+
+         (* Build a description of this component. *)
+
+         let module Clique = struct
+
+           type node =
+               Lr1.node
+
+           (* Re-index the nodes. *)
+
+           let n, node_to_new_index =
+             List.fold_left (fun (n, map) node ->
+               n + 1, Lr1.NodeMap.add node n map
+             ) (0, Lr1.NodeMap.empty) elements
+
+           let index node =
+             try
+               Lr1.NodeMap.find node node_to_new_index
+             with Not_found ->
+               assert false
+
+           (* Restrict the edges to only those that remain within this component. *)
+
+           let successors (action : int -> node -> unit) node : unit =
+             ReductionGraph.successors (fun label successor ->
+               if member successor then
+                 action label successor
+             ) node
+
+           (* Restrict the vertices to only the elements of this component. *)
+
+           let iter (action : node -> unit) : unit =
+             List.iter action elements
+
+         end in
+
+         (* In the following, we perform several tests, of increasing strength and
+            cost, to determine whether there is a dangerous cycle in the clique. *)
+
+         (* Check whether at least one edge has nonpositive weight. If that is not
+            the case, then there is clearly no dangerous cycle. *)
+
+         let danger =
+           ref false
+         in
+
+         Clique.iter (fun node ->
+           Clique.successors (fun weight _ ->
+             if weight <= 0 then
+               danger := true
+           ) node
+         );
+
+         if not !danger then
+           raise NoDanger;
+
+         (* Check whether there is at least one edge of negative weight. If not,
+            look for a non-trivial strongly connected component among the edges
+            of zero weight. *)
+
+         let negative =
+           ref false
+         in
+
+         Clique.iter (fun node ->
+           Clique.successors (fun weight _ ->
+             if weight < 0 then
+               negative := true
+           ) node
+         );
+
+         if not !negative then begin
+           let module ZeroWeight = struct
+             include Clique
+             let successors action source =
+               successors (fun weight target ->
+                 if weight = 0 then
+                   action target
+               ) source
+           end in
+           let module ZeroWeightSCC =
+             Tarjan.Run (ZeroWeight)
+           in
+           danger := false;
+           ZeroWeightSCC.iter (fun _ elements ->
+             if List.length elements > 1 then
+               danger := true
+           )
+         end;
+
+         if not !danger then
+           raise NoDanger;
+
+         (* Use Floyd and Warshall's algorithm to determine if there is a dangerous
+            cycle. *)
+
+         let module NC =
+           NonpositiveCycles.Run(Clique)
+         in
+
+         if not NC.graph_has_nonpositive_simple_cycle then
+           raise NoDanger;
+
+         (* If there might be danger, then print this clique for manual examination. *)
+
+         let module PrintableClique = struct
+
+           include Clique
+
+           type vertex =
+               node
+
+           let name node =
+             Printf.sprintf "s%d" (Lr1.number node)
+
+           let successors (action: ?style:Dot.style -> label:string -> vertex -> unit) node : unit =
+             successors (fun label successor ->
+               action ~label:(string_of_int label) successor
+             ) node
+
+           let iter (action: ?style:Dot.style -> label:string -> vertex -> unit) : unit =
+             iter (fun node ->
+               action ~label:(name node) node
+             )
+
+         end in
+
+         let filename =
+           Printf.sprintf "%s.%d.dot"
+             (Terminal.print tok)
+             (Misc.postincrement clique_count)
+         in
+         let c = open_out filename in
+         let module P = Dot.Print(PrintableClique) in
+         P.print ~orientation:Dot.Portrait ~size:(8.,5.) c;
+         close_out c
+
+       with NoDanger ->
+         ()
+
+  )
+
+let () =
+  (* The graphs are built, and printed to .dot files, only if requested by
+     the user via [--make-reduction-graphs]. The reduction graphs are not
+     used by Menhir itself. *)
+  if Settings.make_reduction_graphs then begin
+    Terminal.iter make_reduction_graph;
+    Printf.fprintf stderr "Constructed %d potentially interesting reduction cliques.\n" !clique_count
+  end
+
diff --git a/bundles/menhirLib/menhir-20120123/src/referenceInterpreter.ml b/bundles/menhirLib/menhir-20120123/src/referenceInterpreter.ml
new file mode 100644 (file)
index 0000000..a56100d
--- /dev/null
@@ -0,0 +1,278 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+open Grammar
+open Cst
+
+(* Set up all of the information required by the LR engine. Everything is
+   read directly from [Grammar] and [Lr1]. *)
+
+module T = struct
+
+  type state =
+      Lr1.node
+   
+  type token =
+      Terminal.t
+
+  type terminal =
+      Terminal.t
+
+  type semantic_value =
+      cst
+
+  let token2terminal (token : token) : terminal =
+    token
+
+  let token2value (token : token) : semantic_value =
+    CstTerminal token
+
+  let error_terminal =
+    Terminal.error
+
+  let error_value =
+    CstError
+
+  type production =
+      Production.index
+
+  let default_reduction (s : state) defred nodefred env =
+    match Invariant.has_default_reduction s with
+    | Some (prod, _) ->
+       defred env prod
+    | None ->
+       nodefred env
+
+  let action (s : state) (tok : terminal) value shift reduce fail env =
+
+    (* Check whether [s] has an outgoing shift transition along [tok]. *)
+
+    try
+
+      let s' : state = SymbolMap.find (Symbol.T tok) (Lr1.transitions s) in
+
+      (* There is such a transition. Return either [ShiftDiscard] or
+        [ShiftNoDiscard], depending on the existence of a default
+        reduction on [#] at [s']. *)
+
+      match Invariant.has_default_reduction s' with
+      | Some (_, toks) when TerminalSet.mem Terminal.sharp toks ->
+         shift env false tok value s'
+      | _ ->
+         shift env true tok value s'
+         
+    (* There is no such transition. Look for a reduction. *)
+
+    with Not_found ->
+      try
+
+       let prod = Misc.single (TerminalMap.find tok (Lr1.reductions s)) in
+       reduce env prod
+
+      (* There is no reduction either. Fail. *)
+
+      with Not_found ->
+       fail env
+
+  let goto (s : state) (prod : production) : state =
+    try
+      SymbolMap.find (Symbol.N (Production.nt prod)) (Lr1.transitions s)
+    with Not_found ->
+      assert false
+
+  open MenhirLib.EngineTypes
+
+  exception Accept of semantic_value
+  exception Error
+
+  type semantic_action =
+      (state, semantic_value, token) env -> unit
+
+  let semantic_action (prod : production) : semantic_action =
+    fun env ->
+      
+      (* Check whether [prod] is a start production. *)
+
+      match Production.classify prod with
+
+      (* If it is one, accept. Start productions are of the form S' ->
+        S, where S is a non-terminal symbol, so the desired semantic
+        value is found within the top cell of the stack. *)
+
+      | Some _ ->
+         raise (Accept env.stack.semv)
+
+      (* If it is not, reduce. Pop a suffix of the stack, and use it
+        to construct a new concrete syntax tree node. *)
+
+      | None ->
+
+         let n = Production.length prod in
+         let values : semantic_value array =
+           Array.make n CstError (* dummy *)
+         and startp : Lexing.position ref =
+           ref Lexing.dummy_pos
+         and endp : Lexing.position ref =
+           ref Lexing.dummy_pos
+         in
+
+         (* The auxiliary function [pop k stack] pops [k] stack cells
+            and returns a truncated stack. It also updates the automaton's
+            current state, and fills in [values], [startp], and [endp]. *)
+
+         let rec pop k stack =
+
+           if k = 0 then
+
+             (* There are no more stack cells to pop. *)
+
+             stack
+
+           else begin
+
+             (* Fetch a semantic value. *)
+
+             values.(k - 1) <- stack.semv;
+
+             (* Pop one cell. The stack must be non-empty. As we pop a cell,
+                change the automaton's current state to the one stored within
+                the cell. (It is sufficient to do this only when [k] is 1.)
+                If this is the first (last) cell that we pop, update [endp]
+                ([startp]). *)
+
+             let next = stack.next in
+             assert (stack != next);
+             if k = n then begin
+               endp := stack.endp
+             end;
+             if k = 1 then begin
+               env.current <- stack.state;
+               startp := stack.startp
+             end;
+             pop (k - 1) next
+
+           end
+
+         in
+         let stack = pop n env.stack in
+
+         (* Construct and push a new stack cell. The associated semantic
+            value is a new concrete syntax tree. *)
+
+         env.stack <- {
+           state = env.current;
+           semv = CstNonTerminal (prod, values);
+           startp = !startp;
+           endp = !endp;
+           next = stack
+         }
+
+  (* The reference interpreter performs error recovery if and only if this
+     is requested via [--recovery]. *)
+
+  let recovery =
+    Settings.recovery
+
+  module Log = struct
+
+    open Printf
+
+    (* I use a reference as a quick and dirty form of parameter passing. *)
+
+    let log =
+      ref false
+
+    let maybe action =
+      if !log then begin
+       action();
+       prerr_newline()
+      end
+
+    let state s =
+      maybe (fun () ->
+       fprintf stderr "State %d:" (Lr1.number s)
+      )
+
+    let shift tok s' =
+      maybe (fun () ->
+       fprintf stderr "Shifting (%s) to state %d" (Terminal.print tok) (Lr1.number s')
+      )
+
+    let reduce_or_accept prod =
+      maybe (fun () ->
+       match Production.classify prod with
+       | Some _ ->
+           fprintf stderr "Accepting"
+       | None ->
+           fprintf stderr "Reducing production %s" (Production.print prod)
+      )
+
+    let lookahead_token lexbuf tok =
+      maybe (fun () ->
+       fprintf stderr "Lookahead token is now %s (%d-%d)"
+         (Terminal.print tok)
+         lexbuf.Lexing.lex_start_p.Lexing.pos_cnum
+         lexbuf.Lexing.lex_curr_p.Lexing.pos_cnum
+      )
+
+    let initiating_error_handling () =
+      maybe (fun () ->
+       fprintf stderr "Initiating error handling"
+      )
+
+    let resuming_error_handling () =
+      maybe (fun () ->
+       fprintf stderr "Resuming error handling"
+      )
+
+    let handling_error s =
+      maybe (fun () ->
+       fprintf stderr "Handling error in state %d" (Lr1.number s)
+      )
+
+    let discarding_last_token tok =
+      maybe (fun () ->
+       fprintf stderr "Discarding last token read (%s)" (Terminal.print tok)
+      )
+
+  end
+
+end
+
+(* Instantiate the LR engine with this information. *)
+
+module E =
+  MenhirLib.Engine.Make (T)
+
+(* Define a palatable user entry point. *)
+
+let interpret log nt lexer lexbuf =
+
+  (* Find the start state that corresponds to [nt] in the automaton. *)
+
+  let s : Lr1.node =
+    try
+      ProductionMap.find (Production.startsymbol2startprod nt) Lr1.entry
+    with Not_found ->
+      assert false
+  in
+
+  (* Run the engine. *)
+  
+  try
+    T.Log.log := log;
+    Some (E.entry s lexer lexbuf)
+  with T.Error ->
+    None
+
diff --git a/bundles/menhirLib/menhir-20120123/src/referenceInterpreter.mli b/bundles/menhirLib/menhir-20120123/src/referenceInterpreter.mli
new file mode 100644 (file)
index 0000000..c3c8e33
--- /dev/null
@@ -0,0 +1,35 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+open Grammar
+open Cst
+
+(* This reference interpreter animates the LR automaton. It uses the
+   grammar and automaton descriptions, as provided by [Grammar] and
+   [Lr1], as well as the generic LR engine in [MenhirLib.Engine]. *)
+
+(* The first parameter to the interpreter is a Boolean flag that tells
+   whether a trace should be produced on the standard error channel. *)
+
+(* The interpreter requires a start symbol, a lexer, and a lexing
+   buffer. It either succeeds and produces a concrete syntax tree, or
+   fails. *)
+
+val interpret:
+  bool ->
+  Nonterminal.t ->
+  (Lexing.lexbuf -> Terminal.t) ->
+  Lexing.lexbuf ->
+  cst option
+
diff --git a/bundles/menhirLib/menhir-20120123/src/rowDisplacement.ml b/bundles/menhirLib/menhir-20120123/src/rowDisplacement.ml
new file mode 100644 (file)
index 0000000..640c1ac
--- /dev/null
@@ -0,0 +1,272 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the GNU Library General Public License, with the   *)
+(*  special exception on linking described in file LICENSE.               *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* This module compresses a two-dimensional table, where some values
+   are considered insignificant, via row displacement. *)
+
+(* This idea reportedly appears in Aho and Ullman's ``Principles
+   of Compiler Design'' (1977). It is evaluated in Tarjan and Yao's
+   ``Storing a Sparse Table'' (1979) and in Dencker, Dürre, and Heuft's
+   ``Optimization of Parser Tables for Portable Compilers'' (1984). *)
+
+(* A compressed table is represented as a pair of arrays. The
+   displacement array is an array of offsets into the data array. *)
+
+type 'a table =
+    int array * (* displacement *)
+     'a array   (* data *)
+
+(* In a natural version of this algorithm, displacements would be greater
+   than (or equal to) [-n]. However, in the particular setting of Menhir,
+   both arrays are intended to be compressed with [PackedIntArray], which
+   does not efficiently support negative numbers. For this reason, we are
+   careful not to produce negative displacements. *)
+
+(* In order to avoid producing negative displacements, we simply use the
+   least significant bit as the sign bit. This is implemented by [encode]
+   and [decode] below. *)
+
+(* One could also think, say, of adding [n] to every displacement, so as
+   to ensure that all displacements are nonnegative. This would work, but
+   would require [n] to be published, for use by the decoder. *)
+
+let encode (displacement : int) : int =
+  if displacement >= 0 then
+    displacement lsl 1
+  else
+    (-displacement) lsl 1 + 1
+
+let decode (displacement : int) : int =
+  if displacement land 1 = 0 then
+    displacement lsr 1
+  else
+    -(displacement lsr 1)
+
+(* It is reasonable to assume that, as matrices grow large, their
+   density becomes low, i.e., they have many insignificant entries.
+   As a result, it is important to work with a sparse data structure
+   for rows. We internally represent a row as a list of its
+   significant entries, where each entry is a pair of a [j] index and
+   an element. *)
+
+type 'a row =
+    (int * 'a) list
+
+(* [compress equal insignificant dummy m n t] turns the two-dimensional table
+   [t] into a compressed table. The parameter [equal] is equality of data
+   values. The parameter [wildcard] tells which data values are insignificant,
+   and can thus be overwritten with other values. The parameter [dummy] is
+   used to fill holes in the data array. [m] and [n] are the integer
+   dimensions of the table [t]. *)
+
+let compress
+    (equal : 'a -> 'a -> bool)
+    (insignificant : 'a -> bool)
+    (dummy : 'a)
+    (m : int) (n : int)
+    (t : 'a array array) 
+    : 'a table =
+
+  (* Be defensive. *)
+
+  assert (Array.length t = m);
+  assert begin
+    for i = 0 to m - 1 do
+      assert (Array.length t.(i) = n)
+    done;
+    true
+  end;
+
+  (* This turns a row-as-array into a row-as-sparse-list. *)
+
+  let sparse (line : 'a array) : 'a row =
+
+    let rec loop (j : int) (row : 'a row) =
+      if j < 0 then
+       row
+      else
+       let x = line.(j) in
+       loop
+         (j - 1) 
+         (if insignificant x then row else (j, x) :: row)
+    in
+
+    loop (n - 1) []
+
+  in
+
+  (* Define the rank of a row as its number of significant entries. *)
+
+  let rank (row : 'a row) : int =
+    List.length row
+  in
+
+  (* Construct a list of all rows, together with their index and rank. *)
+
+  let rows : (int * int * 'a row) list = (* index, rank, row *)
+    Array.to_list (
+      Array.mapi (fun i line ->
+       let row = sparse line in
+       i, rank row, row
+      ) t
+    )
+  in
+
+  (* Sort this list by decreasing rank. This does not have any impact
+     on correctness, but reportedly improves compression. The
+     intuitive idea is that rows with few significant elements are
+     easy to fit, so they should be inserted last, after the problem
+     has become quite constrained by fitting the heavier rows. This
+     heuristic is attributed to Ziegler. *)
+
+  let rows =
+    List.sort (fun (_, rank1, _) (_, rank2, _) ->
+      compare rank2 rank1
+    ) rows
+  in
+
+  (* Allocate a one-dimensional array of displacements. *)
+
+  let displacement : int array =
+    Array.make m 0
+  in
+
+  (* Allocate a one-dimensional, infinite array of values. Indices
+     into this array are written [k]. *)
+
+  let data : 'a InfiniteArray.t =
+    InfiniteArray.make dummy
+  in
+
+  (* Determine whether [row] fits at offset [k] within the current [data]
+     array, up to extension of this array. *)
+
+  (* Note that this check always succeeds when [k] equals the length of
+     the [data] array. Indeed, the loop is then skipped. This property
+     guarantees the termination of the recursive function [fit] below. *)
+
+  let fits k (row : 'a row) : bool =
+
+    let d = InfiniteArray.extent data in
+
+    let rec loop = function
+      | [] ->
+         true
+      | (j, x) :: row ->
+
+         (* [x] is a significant element. *)
+
+         (* By hypothesis, [k + j] is nonnegative. If it is greater than or
+            equal to the current length of the data array, stop -- the row
+            fits. *)
+
+         assert (k + j >= 0);
+
+         if k + j >= d then
+           true
+
+         (* We now know that [k + j] is within bounds of the data
+            array. Check whether it is compatible with the element [y] found
+            there. If it is, continue. If it isn't, stop -- the row does not
+            fit. *)
+
+         else
+           let y = InfiniteArray.get data (k + j) in
+           if insignificant y || equal x y then
+             loop row
+           else
+             false
+
+    in
+    loop row
+
+  in
+
+  (* Find the leftmost position where a row fits. *)
+
+  (* If the leftmost significant element in this row is at offset [j],
+     then we can hope to fit as far left as [-j] -- so this element
+     lands at offset [0] in the data array. *)
+
+  (* Note that displacements may be negative. This means that, for
+     insignificant elements, accesses to the data array could fail: they could
+     be out of bounds, either towards the left or towards the right. This is
+     not a problem, as long as [get] is invoked only at significant
+     elements. *)
+
+  let rec fit k row : int =
+    if fits k row then
+      k
+    else
+      fit (k + 1) row
+  in
+  let fit row =
+    match row with
+    | [] ->
+       0 (* irrelevant *)
+    | (j, _) :: _ ->
+       fit (-j) row
+  in
+
+  (* Write [row] at (compatible) offset [k]. *)
+
+  let rec write k = function
+    | [] ->
+       ()
+    | (j, x) :: row ->
+       InfiniteArray.set data (k + j) x;
+       write k row
+  in
+
+  (* Iterate over the sorted list of rows. Fit and write each row at
+     the leftmost compatible offset. Update the displacement table. *)
+
+  let () =
+    List.iter (fun (i, _, row) ->
+      let k = fit row in (* if [row] has leading insignificant elements, then [k] can be negative *)
+      write k row;
+      displacement.(i) <- encode k
+    ) rows
+  in
+
+  (* Return the compressed tables. *)
+
+  displacement, InfiniteArray.domain data
+
+(* [get ct i j] returns the value found at indices [i] and [j] in the
+   compressed table [ct]. This function call is permitted only if the
+   value found at indices [i] and [j] in the original table is
+   significant -- otherwise, it could fail abruptly. *)
+
+(* Together, [compress] and [get] have the property that, if the value
+   found at indices [i] and [j] in an uncompressed table [t] is
+   significant, then [get (compress t) i j] is equal to that value. *)
+
+let get (displacement, data) i j =
+  assert (0 <= i && i < Array.length displacement);
+  let k = decode displacement.(i) in
+  assert (0 <= k + j && k + j < Array.length data);
+    (* failure of this assertion indicates an attempt to access an
+       insignificant element that happens to be mapped out of the bounds
+       of the [data] array. *)
+  data.(k + j)
+
+(* [getget] is a variant of [get] which only requires read access,
+   via accessors, to the two components of the table. *)
+
+let getget get_displacement get_data (displacement, data) i j =
+  let k = decode (get_displacement displacement i) in
+  get_data data (k + j)
+
diff --git a/bundles/menhirLib/menhir-20120123/src/rowDisplacement.mli b/bundles/menhirLib/menhir-20120123/src/rowDisplacement.mli
new file mode 100644 (file)
index 0000000..21efbaa
--- /dev/null
@@ -0,0 +1,63 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the GNU Library General Public License, with the   *)
+(*  special exception on linking described in file LICENSE.               *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* This module compresses a two-dimensional table, where some values
+   are considered insignificant, via row displacement. *)
+
+(* A compressed table is represented as a pair of arrays. The
+   displacement array is an array of offsets into the data array. *)
+
+type 'a table =
+    int array * (* displacement *)
+     'a array   (* data *)
+
+(* [compress equal insignificant dummy m n t] turns the two-dimensional table
+   [t] into a compressed table. The parameter [equal] is equality of data
+   values. The parameter [wildcard] tells which data values are insignificant,
+   and can thus be overwritten with other values. The parameter [dummy] is
+   used to fill holes in the data array. [m] and [n] are the integer
+   dimensions of the table [t]. *)
+
+val compress:
+  ('a -> 'a -> bool) ->
+  ('a -> bool) ->
+  'a ->
+  int -> int ->
+  'a array array ->
+  'a table
+
+(* [get ct i j] returns the value found at indices [i] and [j] in the
+   compressed table [ct]. This function call is permitted only if the
+   value found at indices [i] and [j] in the original table is
+   significant -- otherwise, it could fail abruptly. *)
+
+(* Together, [compress] and [get] have the property that, if the value
+   found at indices [i] and [j] in an uncompressed table [t] is
+   significant, then [get (compress t) i j] is equal to that value. *)
+
+val get:
+  'a table ->
+  int -> int ->
+  'a
+
+(* [getget] is a variant of [get] which only requires read access,
+   via accessors, to the two components of the table. *)
+
+val getget:
+  ('displacement -> int -> int) ->
+  ('data -> int -> 'a) ->
+  'displacement * 'data ->
+  int -> int ->
+  'a
+
diff --git a/bundles/menhirLib/menhir-20120123/src/sentenceLexer.mll b/bundles/menhirLib/menhir-20120123/src/sentenceLexer.mll
new file mode 100644 (file)
index 0000000..6c4541f
--- /dev/null
@@ -0,0 +1,77 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* This lexer is used to read the sentences provided on the standard input
+   channel when [--interpret] is enabled. *)
+
+{
+
+  open Lexing
+  open SentenceParser
+  open Grammar
+
+  (* Updates the line counter, which is used in some error messages. *)
+
+  let update_loc lexbuf =
+    let pos = lexbuf.lex_curr_p in
+    lexbuf.lex_curr_p <- { pos with
+      pos_lnum = pos.pos_lnum + 1;
+      pos_bol = pos.pos_cnum;
+    }
+
+  (* A short-hand. *)
+
+  let error1 lexbuf msg =
+    Error.error (Positions.one (lexeme_start_p lexbuf)) msg
+
+}
+
+let newline   = ('\010' | '\013' | "\013\010")
+
+let whitespace = [ ' ' '\t' ';' ]
+
+let lowercase = ['a'-'z' '\223'-'\246' '\248'-'\255' '_']
+
+let uppercase = ['A'-'Z' '\192'-'\214' '\216'-'\222']
+
+let identchar = ['A'-'Z' 'a'-'z' '_' '\192'-'\214' '\216'-'\246' '\248'-'\255' '0'-'9'] (* '\'' forbidden *)
+
+rule lex = parse
+  | (lowercase identchar *) as lid
+      { try
+         let nt = Nonterminal.lookup lid in
+         if StringSet.mem lid Front.grammar.UnparameterizedSyntax.start_symbols then
+           NONTERMINAL nt
+         else
+           error1 lexbuf (Printf.sprintf "\"%s\" is not a start symbol." lid)
+       with Not_found ->
+         error1 lexbuf (Printf.sprintf "\"%s\" is not a known non-terminal symbol." lid)
+      }
+  | (uppercase identchar *) as uid
+      { try
+         TERMINAL (Terminal.lookup uid)
+       with Not_found ->
+         error1 lexbuf (Printf.sprintf "\"%s\" is not a known terminal symbol." uid)
+      }
+  | whitespace
+      { lex lexbuf }
+  | newline
+      { update_loc lexbuf; EOL }
+  | eof
+      { EOF }
+  | ':'
+      { COLON }
+  | _
+      { error1 lexbuf "unexpected character(s)." }
+
diff --git a/bundles/menhirLib/menhir-20120123/src/sentenceParser.mly b/bundles/menhirLib/menhir-20120123/src/sentenceParser.mly
new file mode 100644 (file)
index 0000000..000642a
--- /dev/null
@@ -0,0 +1,49 @@
+/**************************************************************************/
+/*                                                                        */
+/*  Menhir                                                                */
+/*                                                                        */
+/*  François Pottier, INRIA Rocquencourt                                  */
+/*  Yann Régis-Gianas, PPS, Université Paris Diderot                      */
+/*                                                                        */
+/*  Copyright 2005-2008 Institut National de Recherche en Informatique    */
+/*  et en Automatique. All rights reserved. This file is distributed      */
+/*  under the terms of the Q Public License version 1.0, with the change  */
+/*  described in file LICENSE.                                            */
+/*                                                                        */
+/**************************************************************************/
+
+/* This parser is used to read the sentences provided on the standard input
+   channel when [--interpret] is enabled. */
+
+/* A sentence is a pair of an optional non-terminal start symbol and a list
+   of terminal symbols. */
+
+%{
+
+ open Grammar
+   
+%}
+
+%token COLON EOF EOL
+%token<Grammar.Terminal.t> TERMINAL
+%token<Grammar.Nonterminal.t> NONTERMINAL
+
+%type <(Grammar.Nonterminal.t option * Grammar.Terminal.t list) option> sentence
+%start sentence
+
+%%
+
+sentence:
+| EOF
+    { None } 
+| NONTERMINAL COLON terminals EOL
+    { Some (Some $1, $3) }
+| terminals EOL
+    { Some (None, $1) }
+
+terminals:
+| 
+    { [] } 
+| TERMINAL terminals
+    { $1 :: $2 }
+
diff --git a/bundles/menhirLib/menhir-20120123/src/settings.ml b/bundles/menhirLib/menhir-20120123/src/settings.ml
new file mode 100644 (file)
index 0000000..56bef69
--- /dev/null
@@ -0,0 +1,368 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+open Printf
+
+(* ------------------------------------------------------------------------- *)
+(* Prepare for parsing the command line. *)
+
+type token_type_mode =
+  | TokenTypeAndCode   (* produce the definition of the [token] type and code for the parser *)
+  | TokenTypeOnly      (* produce the type definition only *)
+  | CodeOnly of string (* produce the code only; import token type from specified module *)
+
+let token_type_mode =
+  ref TokenTypeAndCode
+
+let tokentypeonly () =
+  token_type_mode := TokenTypeOnly
+
+let codeonly m =
+  if String.capitalize m <> m then begin
+    (* Not using module [Error] to avoid a circular dependency. *)
+    fprintf stderr "Error: %s is not a valid Objective Caml module name.\n" m;
+    exit 1
+  end;
+  token_type_mode := CodeOnly m
+
+let version =
+  ref false
+
+let pager =
+  ref true
+
+let explain =
+  ref false
+
+let base =
+  ref ""
+
+let dump =
+  ref false
+
+let follow =
+  ref false
+
+let graph =
+  ref false
+
+let trace =
+  ref false
+
+let noprefix =
+  ref false
+
+type print_mode =
+    | PrintNormal
+    | PrintUnitActions
+    | PrintUnitActionsUnitTokens
+
+type preprocess_mode =
+    | PMNormal                       (* preprocess and continue *)
+    | PMOnlyPreprocess of print_mode (* preprocess, print grammar, stop *)
+
+let preprocess_mode =
+  ref PMNormal
+
+let recovery =
+  ref false
+
+let v () =
+  dump := true;
+  explain := true
+
+let infer =
+  ref false
+
+let inline =
+  ref true
+
+type ocamldep_mode =
+  | OMNone        (* do not invoke ocamldep *)
+  | OMRaw         (* invoke ocamldep and echo its raw output *)
+  | OMPostprocess (* invoke ocamldep and postprocess its output *)
+
+let depend =
+  ref OMNone
+
+let code_inlining =
+  ref true
+
+let comment =
+  ref false
+
+let ocamlc =
+  ref "ocamlc"
+
+let ocamldep =
+  ref "ocamldep"
+
+let logG, logA, logC =
+  ref 0, ref 0, ref 0
+
+let timings =
+  ref false
+
+let filenames = 
+  ref StringSet.empty
+
+let no_stdlib = 
+  ref false
+
+let stdlib_path =
+  ref Installation.libdir
+
+let insert name = 
+  filenames := StringSet.add name !filenames
+
+let interpret =
+  ref false
+
+let interpret_show_cst =
+  ref false
+
+let table = 
+  ref false
+
+let coq = 
+  ref false
+
+let coq_no_complete =
+  ref false
+
+let coq_no_actions =
+  ref false
+
+let strict =
+  ref false
+
+type suggestion =
+  | SuggestNothing
+  | SuggestCompFlags
+  | SuggestLinkFlags of string (* "cmo" or "cmx" *)
+
+let suggestion =
+  ref SuggestNothing
+
+let options = Arg.align [
+  "--base", Arg.Set_string base, "<basename> Specifies a base name for the output file(s)";
+  "--comment", Arg.Set comment, " Include comments in the generated code";
+  "--coq", Arg.Set coq, " (undocumented)";
+  "--coq-no-complete", Arg.Set coq_no_complete, " (undocumented)";
+  "--coq-no-actions", Arg.Set coq_no_actions, " (undocumented)";
+  "--depend", Arg.Unit (fun () -> depend := OMPostprocess), " Invoke ocamldep and display dependencies";
+  "--dump", Arg.Set dump, " Describe the automaton in <basename>.automaton";
+  "--error-recovery", Arg.Set recovery, " Attempt recovery by discarding tokens after errors";
+  "--explain", Arg.Set explain, " Explain conflicts in <basename>.conflicts";
+  "--external-tokens", Arg.String codeonly, "<module> Import token type definition from <module>";
+  "--follow-construction", Arg.Set follow, " (undocumented)";
+  "--graph", Arg.Set graph, " Write grammar's dependency graph to <basename>.dot";
+  "--infer", Arg.Set infer, " Invoke ocamlc for ahead of time type inference";
+  "--interpret", Arg.Set interpret, " Interpret the sentences provided on stdin";
+  "--interpret-show-cst", Arg.Set interpret_show_cst, " Show a concrete syntax tree upon acceptance";
+  "--log-automaton", Arg.Set_int logA, "<level> Log information about the automaton";
+  "--log-code", Arg.Set_int logC, "<level> Log information about the generated code";
+  "--log-grammar", Arg.Set_int logG, "<level> Log information about the grammar";
+  "--no-code-inlining", Arg.Clear code_inlining, " (undocumented)";
+  "--no-inline", Arg.Clear inline, " Ignore the %inline keyword.";
+  "--no-pager", Arg.Clear pager, " (undocumented)";
+  "--no-prefix", Arg.Set noprefix, " (undocumented)";
+  "--no-stdlib", Arg.Set no_stdlib, " Do not load the standard library";
+  "--ocamlc", Arg.Set_string ocamlc, "<command> Specifies how ocamlc should be invoked";
+  "--ocamldep", Arg.Set_string ocamldep, "<command> Specifies how ocamldep should be invoked";
+  "--only-preprocess", Arg.Unit (fun () -> preprocess_mode := PMOnlyPreprocess PrintNormal),
+                       " Print grammar and exit";
+  "--only-preprocess-u", Arg.Unit (fun () -> preprocess_mode := PMOnlyPreprocess PrintUnitActions),
+                         " Print grammar with unit actions and exit";
+  "--only-preprocess-uu", Arg.Unit (fun () -> preprocess_mode := PMOnlyPreprocess PrintUnitActionsUnitTokens),
+                          " Print grammar with unit actions & tokens and exit";
+  "--only-tokens", Arg.Unit tokentypeonly, " Generate token type definition only, no code";
+  "--raw-depend", Arg.Unit (fun () -> depend := OMRaw), " Invoke ocamldep and echo its raw output";
+  "--stdlib", Arg.Set_string stdlib_path, "<directory> Specify where the standard library lies";
+  "--strict", Arg.Set strict, " Warnings about the grammar are errors";
+  "--suggest-comp-flags", Arg.Unit (fun () -> suggestion := SuggestCompFlags),
+                          " Suggest compilation flags for ocaml{c,opt}";
+  "--suggest-link-flags-byte", Arg.Unit (fun () -> suggestion := SuggestLinkFlags "cmo"),
+                               " Suggest link flags for ocamlc";
+  "--suggest-link-flags-opt", Arg.Unit (fun () -> suggestion := SuggestLinkFlags "cmx"),
+                              " Suggest link flags for ocamlopt";
+  "--table", Arg.Set table, " Use the table-based back-end";
+  "--timings", Arg.Set timings, " Display internal timings";
+  "--trace", Arg.Set trace, " Include tracing instructions in the generated code";
+  "--version", Arg.Set version, " Show version number and exit";
+  "-b", Arg.Set_string base, "<basename> Synonymous with --base <basename>";
+  "-lg", Arg.Set_int logG, " Synonymous with --log-grammar";
+  "-la", Arg.Set_int logA, " Synonymous with --log-automaton";
+  "-lc", Arg.Set_int logC, " Synonymous with --log-code";
+  "-t", Arg.Set table, " Synonymous with --table";
+  "-v", Arg.Unit v, " Synonymous with --dump --explain";
+]
+
+let usage =
+  sprintf "Usage: %s <options> <filenames>" Sys.argv.(0)
+
+(* ------------------------------------------------------------------------- *)
+(* Parse the command line. *)
+
+let () =
+  Arg.parse options insert usage
+
+(* ------------------------------------------------------------------------- *)
+(* If required, print a version number and stop. *)
+
+let () =
+  if !version then begin
+    printf "menhir, version %s\n" Version.version;
+    exit 0
+  end
+
+(* ------------------------------------------------------------------------- *)
+
+(* Menhir is able to suggest compile and link flags to be passed to the
+   Objective Caml compilers. If required, do so and stop. *)
+
+(* If [--table] is not passed, no flags are necessary. If [--table] is
+   passed, then [MenhirLib] needs to be visible (at compile time) and
+   linked in (at link time). This is done either via [ocamlfind], if
+   it was available at installation time, or manually. *)
+
+(* The compilation flags are in fact meant to be used both at compile-
+   and link-time. *)
+
+let () =
+  match !suggestion with
+  | SuggestNothing ->
+      ()
+  | SuggestCompFlags ->
+      if !table then
+       if Installation.ocamlfind then
+         printf "-package menhirLib\n%!"
+       else
+         printf "-I %s\n%!" Installation.libdir;
+      exit 0
+  | SuggestLinkFlags extension ->
+      if !table then
+       if Installation.ocamlfind then
+         printf "-linkpkg\n%!"
+       else
+         printf "menhirLib.%s\n%!" extension;
+      exit 0
+
+(* ------------------------------------------------------------------------- *)
+(* Export the settings. *)
+
+let stdlib_filename = 
+  !stdlib_path ^ "/standard.mly"
+
+let filenames =
+  StringSet.elements !filenames
+
+let base =
+  if !base = "" then
+    match filenames with
+    | [] ->
+       fprintf stderr "%s\n" usage;
+       exit 1
+    | [ filename ] ->
+       Filename.chop_suffix filename (if !coq then ".vy" else ".mly")
+    | _ ->
+       fprintf stderr "Error: you must specify --base when providing multiple input files.\n";
+       exit 1
+  else
+    !base
+
+let filenames = 
+  if !no_stdlib || !coq then
+    filenames
+  else 
+    stdlib_filename :: filenames
+
+let token_type_mode =
+  !token_type_mode
+
+let pager =
+  !pager
+
+let explain =
+  !explain
+
+let dump =
+  !dump
+
+let follow =
+  !follow
+
+let graph =
+  !graph
+
+let trace =
+  !trace
+
+let recovery =
+  !recovery
+
+let noprefix =
+  !noprefix
+
+let infer =
+  !infer
+
+let code_inlining =
+  !code_inlining
+
+let depend =
+  !depend
+
+let inline =
+  !inline
+
+let comment =
+  !comment
+
+let preprocess_mode =
+  !preprocess_mode
+
+let ocamlc =
+  !ocamlc
+
+let ocamldep =
+  !ocamldep
+
+let logG, logA, logC =
+  !logG, !logA, !logC
+
+let timings =
+  !timings
+
+let interpret =
+  !interpret
+
+let interpret_show_cst =
+  !interpret_show_cst
+
+let table = 
+  !table
+
+let coq = 
+  !coq
+
+let coq_no_complete =
+  !coq_no_complete
+
+let coq_no_actions =
+  !coq_no_actions
+
+let strict =
+  !strict
+
diff --git a/bundles/menhirLib/menhir-20120123/src/settings.mli b/bundles/menhirLib/menhir-20120123/src/settings.mli
new file mode 100644 (file)
index 0000000..5a18eac
--- /dev/null
@@ -0,0 +1,163 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* This module parses the command line. *)
+
+(* The list of file names that appear on the command line. *)
+
+val filenames: string list
+
+(* How to deal with the type of tokens. *)
+
+type token_type_mode =
+  | TokenTypeAndCode   (* produce the definition of the [token] type and code for the parser *)
+  | TokenTypeOnly      (* produce the type definition only *)
+  | CodeOnly of string (* produce the code only, by relying on an external token type *)
+
+val token_type_mode: token_type_mode
+
+(* Whether Pager's algorithm should be used. *)
+
+val pager: bool
+
+(* Whether conflicts should be explained. *)
+
+val explain: bool
+
+(* Whether the automaton should be dumped. *)
+
+val dump: bool
+
+(* Whether the automaton's construction should be explained (very verbose). *)
+
+val follow: bool
+
+(* Whether the grammar's dependence graph should be dumped. *)
+
+val graph: bool
+
+(* Whether tracing instructions should be generated. *)
+
+val trace: bool
+
+(* Whether error recovery should be attempted. This consists
+   in discarding tokens, after the [error] token has been
+   shifted, until a token that can be accepted is found. *)
+
+val recovery: bool
+
+(* Whether one should stop and print the grammar after joining and
+   expanding the grammar. *)
+
+type print_mode =
+    | PrintNormal
+    | PrintUnitActions
+    | PrintUnitActionsUnitTokens
+
+type preprocess_mode =
+    | PMNormal                       (* preprocess and continue *)
+    | PMOnlyPreprocess of print_mode (* preprocess, print grammar, stop *)
+
+val preprocess_mode: preprocess_mode
+
+(* Whether one should invoke ocamlc in order to infer types for all
+   nonterminals. *)
+
+val infer: bool
+
+(* Whether one should inline the non terminal definitions marked
+   with the %inline keyword. *)
+
+val inline: bool
+
+(* Whether and how one should invoke ocamldep in order to compute and
+   display dependencies. *)
+
+type ocamldep_mode =
+  | OMNone        (* do not invoke ocamldep *)
+  | OMRaw         (* invoke ocamldep and echo its raw output *)
+  | OMPostprocess (* invoke ocamldep and postprocess its output *)
+
+val depend: ocamldep_mode
+
+(* Whether comments should be printed or discarded. *)
+
+val comment: bool
+
+(* This undocumented flag suppresses prefixing of identifiers with an
+   unlikely prefix in the generated code. This increases the code's
+   readability, but can cause identifiers in semantic actions to be
+   captured. *)
+
+val noprefix: bool
+
+(* This undocumented flag causes the code to be transformed by
+   [Inline]. It is on by default. *)
+
+val code_inlining: bool
+
+(* How [ocamlc] and [ocamldep] should be invoked. *)
+
+val ocamlc: string
+val ocamldep: string
+
+(* How verbose we should be. *)
+
+val logG: int (* diagnostics on the grammar *)
+val logA: int (* diagnostics on the automaton *)
+val logC: int (* diagnostics on the generated code *)
+
+(* Whether tasks should be timed. *)
+
+val timings: bool
+
+(* The base name that should be used for the files that we create.
+   This name can contain a path. *)
+
+val base: string
+
+(* The filename of the standard library. *)
+
+val stdlib_filename : string
+
+(* Whether Menhir should behave as an interpreter. *)
+
+val interpret : bool
+
+(* Whether the interpreter should build and display concrete syntax trees. *)
+
+val interpret_show_cst : bool
+
+(* Whether to use the table-based back-end ([true]) or the code-based
+   back-end ([false]). *)
+
+val table : bool
+
+(* Whether to generate a coq description of the grammar and automaton. *)
+
+val coq : bool
+
+(* Whether the coq description must contain completeness proofs. *)
+
+val coq_no_complete : bool
+
+(* Whether the coq backend should ignore types and semantic actions. *)
+
+val coq_no_actions : bool
+
+(* Whether unresolved LR(1) conflicts, useless precedence declarations,
+   productions that are never reduced, etc. should be treated as errors. *)
+
+val strict: bool
+
diff --git a/bundles/menhirLib/menhir-20120123/src/slr.ml b/bundles/menhirLib/menhir-20120123/src/slr.ml
new file mode 100644 (file)
index 0000000..0eff002
--- /dev/null
@@ -0,0 +1,172 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* This module extends the LR(0) automaton with lookahead information in order
+   to construct an SLR(1) automaton. The lookahead information is obtained by
+   considering the FOLLOW sets. *)
+
+(* This construction is not used by Menhir, but can be used to check whether
+   the grammar is in the class SLR(1). This check is performed when the log
+   level [lg] is at least 1. *)
+
+open Grammar
+
+(* This flag, which is reserved for internal use, causes more information
+   about SLR(1) conflict states to be printed. *)
+
+let tell_me_everything =
+  false
+
+(* The following function turns an LR(0) state into an SLR(1) state. *)
+
+let make_slr_state (s : Lr0.node) : Lr0.concretelr1state =
+
+  (* Obtain the set of LR(0) items associated with the state [s]. *)
+
+  let items = Lr0.items s in
+
+  (* Unfortunately, this set is not closed. We do not have a function that
+     computes the closure of a set of LR(0) items -- we could build one using
+     [Item.Closure], but that would be overkill.  So, we first convert this
+     set to a set of LR(1) items, then compute the closure at this level, and
+     finally we turn this LR(1) state into an SLR(1) state by letting the
+     lookahead sets be the FOLLOW sets. This is somewhat ugly and naïve, but
+     seems to work. *)
+
+  (* Convert this set to a set of LR(1) items. Here, we can use any set of
+     tokens as the lookahead set. We use the empty set. *)
+
+  let s = Item.Map.lift (fun item -> TerminalSet.empty) items in
+
+  (* Compute the LR(1) closure. *)
+
+  let s = Lr0.closure s in
+
+  (* We now have an LR(1) state that has the correct set of LR(0) items but
+     phony lookahead information. We convert it into an SLR(1) state by
+     deciding that, for each item, the lookahead set is the FOLLOW set of the
+     symbol that appears on the left-hand side of the item. *)
+
+  Item.Map.fold (fun item toks accu ->
+    let _, nt, _, _, _ = Item.def item in
+    let follow_nt = Analysis.follow nt in
+    assert (TerminalSet.subset toks follow_nt); (* sanity check *)
+    Item.Map.add item follow_nt accu
+  ) s Item.Map.empty
+
+(* Insertion of a new reduce action into the table of reductions. Copied
+   from [Lr1] (boo, hiss). *)
+
+let addl prod tok reductions =
+  let prods =
+    try
+      TerminalMap.lookup tok reductions
+    with Not_found ->
+      []
+  in
+  TerminalMap.add tok (prod :: prods) reductions
+
+(* Same thing, for a set of tokens. *)
+
+let addl prod toks reductions =
+  TerminalSet.fold (addl prod) toks reductions
+
+(* The following function turns a closed LR(1) state into a map of terminal
+   symbols to reduction actions. Copied from a related function in [Lr0]. *)
+
+let reductions (s : Lr0.concretelr1state) : Production.index list TerminalMap.t =
+  Item.Map.fold (fun item toks reductions ->
+    match Item.classify item with
+    | Item.Reduce prod ->
+       addl prod toks reductions
+    | Item.Shift _ ->
+       reductions
+  ) s TerminalMap.empty
+
+(* The following function turns a closed LR(1) state into a set of shift
+   actions. *)
+
+let transitions (s : Lr0.concretelr1state) : TerminalSet.t =
+  Item.Map.fold (fun item _ transitions ->
+    match Item.classify item with
+    | Item.Shift (Symbol.T tok, _) ->
+        TerminalSet.add tok transitions
+    | Item.Shift (Symbol.N _, _)
+    | Item.Reduce _ ->
+        transitions
+  ) s TerminalSet.empty
+
+(* This function computes the domain of a terminal map, producing a terminal
+   set. *)
+
+let domain (m : 'a TerminalMap.t) : TerminalSet.t =
+  TerminalMap.fold (fun tok _ accu ->
+    TerminalSet.add tok accu
+  ) m TerminalSet.empty
+
+(* The following function checks whether a closed LR(1) state is free of
+   conflicts. *)
+
+let state_is_ok (s : Lr0.concretelr1state) : bool =
+
+  let reductions = reductions s
+  and transitions = transitions s in
+
+  (* Check for shift/reduce conflicts. *)
+
+  TerminalSet.disjoint transitions (domain reductions) &&
+
+  (* Check for reduce/reduce conflicts. *)
+
+  TerminalMap.fold (fun _ prods ok ->
+    ok && match prods with
+    | []
+    | [ _ ] ->
+        true
+    | _ :: _ :: _ ->
+        false
+  ) reductions true
+
+(* The following function counts the number of states in the SLR(1) automaton
+   that have a conflict. *)
+
+let count_slr_violations () : int =
+
+  let count = ref 0 in
+
+  for s = 0 to Lr0.n - 1 do
+    let s = make_slr_state s in
+    if not (state_is_ok s) then begin
+      incr count;
+      if tell_me_everything then
+       Printf.fprintf
+         stderr
+         "The following SLR(1) state has a conflict:\n%s"
+         (Lr0.print_concrete s)
+    end
+  done;
+
+  !count
+
+(* At log level 1, indicate whether the grammar is SLR(1). *)
+
+let () =
+  Error.logG 1 (fun f ->
+    let count = count_slr_violations() in
+    if count = 0 then
+      Printf.fprintf f "The grammar is SLR(1).\n"
+    else
+      Printf.fprintf f "The grammar is not SLR(1) -- %d states have a conflict.\n" count
+  )
+
diff --git a/bundles/menhirLib/menhir-20120123/src/slr.mli b/bundles/menhirLib/menhir-20120123/src/slr.mli
new file mode 100644 (file)
index 0000000..7ed1b18
--- /dev/null
@@ -0,0 +1,22 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* This module extends the LR(0) automaton with lookahead information in order
+   to construct an SLR(1) automaton. The lookahead information is obtained by
+   considering the FOLLOW sets. *)
+
+(* This construction is not used by Menhir, but can be used to check whether
+   the grammar is in the class SLR(1). This check is performed when the log
+   level [lg] is at least 1. *)
+
diff --git a/bundles/menhirLib/menhir-20120123/src/standard.mly b/bundles/menhirLib/menhir-20120123/src/standard.mly
new file mode 100644 (file)
index 0000000..514bb79
--- /dev/null
@@ -0,0 +1,149 @@
+/**************************************************************************/
+/*                                                                        */
+/*  Menhir                                                                */
+/*                                                                        */
+/*  François Pottier, INRIA Rocquencourt                                  */
+/*  Yann Régis-Gianas, PPS, Université Paris Diderot                      */
+/*                                                                        */
+/*  Copyright 2005-2008 Institut National de Recherche en Informatique    */
+/*  et en Automatique. All rights reserved. This file is distributed      */
+/*  under the terms of the GNU Library General Public License, with the   */
+/*  special exception on linking described in file LICENSE.               */
+/*                                                                        */
+/**************************************************************************/
+
+(* This is menhir's standard library. It offers a number of
+   parameterized nonterminal definitions, such as options and lists,
+   that should be useful in a number of circumstances. *)
+
+%%
+
+(* ------------------------------------------------------------------------- *)
+(* Options. *)
+
+(* [option(X)] recognizes either nothing or [X]. It produces a value
+   of type ['a option] if [X] produces a value of type ['a]. *)
+
+%public option(X):
+  /* nothing */
+    { None }
+| x = X
+    { Some x }
+
+(* [ioption(X)] is identical to [option(X)], except its definition is
+   inlined. This has the effect of duplicating the production that
+   refers to it, possibly eliminating an LR(1) conflict. *)
+
+%public %inline ioption(X):
+  /* nothing */
+    { None }
+| x = X
+    { Some x }
+
+(* [boption(X)] recognizes either nothing or [X]. It produces a value
+   of type [bool]. *)
+
+%public boption(X):
+  /* nothing */
+    { false }
+| X
+    { true }
+
+(* [loption(X)] recognizes either nothing or [X]. It produces a value
+   of type ['a list] if [X] produces a value of type ['a list]. *)
+
+%public loption(X):
+  /* nothing */
+    { [] }
+| x = X
+    { x }
+
+(* ------------------------------------------------------------------------- *)
+(* Sequences. *)
+
+(* [pair(X, Y)] recognizes the sequence [X Y]. It produces a value of
+   type ['a * 'b] if [X] and [Y] produce values of type ['a] and ['b],
+   respectively. *)
+
+%public %inline pair(X, Y):
+  x = X; y = Y
+    { (x, y) }
+
+(* [separated_pair(X, sep, Y)] recognizes the sequence [X sep Y]. It
+   produces a value of type ['a * 'b] if [X] and [Y] produce values of
+   type ['a] and ['b], respectively. *)
+
+%public %inline separated_pair(X, sep, Y):
+  x = X; sep; y = Y
+    { (x, y) }
+
+(* [preceded(opening, X)] recognizes the sequence [opening X]. It
+   passes on the value produced by [X], so that it produces a value of
+   type ['a] if [X] produces a value of type ['a]. *)
+
+%public %inline preceded(opening, X):
+  opening; x = X
+    { x }
+
+(* [terminated(X, closing)] recognizes the sequence [X closing]. It
+   passes on the value produced by [X], so that it produces a value of
+   type ['a] if [X] produces a value of type ['a]. *)
+
+%public %inline terminated(X, closing):
+  x = X; closing
+    { x }
+
+(* [delimited(opening, X, closing)] recognizes the sequence [opening X
+   closing]. It passes on the value produced by [X], so that it
+   produces a value of type ['a] if [X] produces a value of type
+   ['a]. *)
+
+%public %inline delimited(opening, X, closing):
+  opening; x = X; closing
+    { x }
+
+(* ------------------------------------------------------------------------- *)
+(* Lists. *)
+
+(* [list(X)] recognizes a possibly empty list of [X]'s. It produces a
+   value of type ['a list] if [X] produces a value of type ['a]. The
+   front element of the list is the first element that was parsed. *)
+
+%public list(X):
+  /* nothing */
+    { [] }
+| x = X; xs = list(X)
+    { x :: xs }
+
+(* [nonempty_list(X)] recognizes a nonempty list of [X]'s. It produces
+   a value of type ['a list] if [X] produces a value of type ['a]. The
+   front element of the list is the first element that was parsed. *)
+
+%public nonempty_list(X):
+  x = X
+    { [ x ] }
+| x = X; xs = nonempty_list(X)
+    { x :: xs }
+
+(* [separated_list(separator, X)] recognizes a possibly empty list of
+   [X]'s, separated with [separator]'s. It produces a value of type
+   ['a list] if [X] produces a value of type ['a]. The front element
+   of the list is the first element that was parsed. *)
+
+%public %inline separated_list(separator, X):
+  xs = loption(separated_nonempty_list(separator, X))
+    { xs }
+
+(* [separated_nonempty_list(separator, X)] recognizes a nonempty list
+   of [X]'s, separated with [separator]'s. It produces a value of type
+   ['a list] if [X] produces a value of type ['a]. The front element
+   of the list is the first element that was parsed. *)
+
+%public separated_nonempty_list(separator, X):
+  x = X
+    { [ x ] }
+| x = X; separator; xs = separated_nonempty_list(separator, X)
+    { x :: xs }
+
+%%
+
diff --git a/bundles/menhirLib/menhir-20120123/src/stretch.mli b/bundles/menhirLib/menhir-20120123/src/stretch.mli
new file mode 100644 (file)
index 0000000..ebe1e92
--- /dev/null
@@ -0,0 +1,41 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* $Id: stretch.mli,v 1.4 2005/12/01 16:20:07 regisgia Exp $ *)
+
+(* A stretch is a fragment of a source file. It holds the file name,
+   the line number, and the line count (that is, the length) of the
+   fragment. These are used for generating #line directives when the
+   fragment is copied to an output file. It also holds the textual
+   content of the fragment, as a string. The [raw_content] field holds
+   the text that was found in the source file, while the [content]
+   field holds the same text after transformation by the lexer (which
+   substitutes keywords, inserts padding, etc.). *)
+
+type t = {
+    stretch_filename   : string;
+    stretch_linenum    : int;
+    stretch_linecount  : int;
+    stretch_raw_content        : string;
+    stretch_content    : string;
+    stretch_keywords   : Keyword.keyword Positions.located list
+  } 
+
+(* An Objective Caml type is either a stretch (if it was found in some
+   source file) or a string (if it was inferred via [Infer]). *)
+
+type ocamltype =
+  | Declared of t
+  | Inferred of string
+
diff --git a/bundles/menhirLib/menhir-20120123/src/stringMap.ml b/bundles/menhirLib/menhir-20120123/src/stringMap.ml
new file mode 100644 (file)
index 0000000..b500c87
--- /dev/null
@@ -0,0 +1,31 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+include Map.Make (String)
+
+let cardinal s =
+  fold (fun _ _ x -> x + 1) s 0 
+
+let filter pred map =
+  fold (fun key value map ->
+         if pred key value then 
+           add key value map
+         else 
+           map) map empty
+
+let restrict domain map =
+  filter (fun k _ -> StringSet.mem k domain) map
+
+let domain map = 
+  fold (fun key _ acu -> StringSet.add key acu) map StringSet.empty
diff --git a/bundles/menhirLib/menhir-20120123/src/stringMap.mli b/bundles/menhirLib/menhir-20120123/src/stringMap.mli
new file mode 100644 (file)
index 0000000..08f039e
--- /dev/null
@@ -0,0 +1,30 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+include Map.S with type key = string
+
+val cardinal : 'a t -> int 
+
+(* [restrict s m] restricts the domain of the map [m] to (its
+   intersection with) the set [s]. *)
+
+val restrict: StringSet.t -> 'a t -> 'a t 
+
+(* [filter pred m] restricts the domain of the map [m] to 
+   (key, value) couples that verify [pred]. *)
+
+val filter: (string -> 'a -> bool) -> 'a t -> 'a t
+
+(* [domain m] returns the domain of the map [m]. *)
+val domain: 'a t -> StringSet.t
diff --git a/bundles/menhirLib/menhir-20120123/src/stringSet.ml b/bundles/menhirLib/menhir-20120123/src/stringSet.ml
new file mode 100644 (file)
index 0000000..5fc523e
--- /dev/null
@@ -0,0 +1,19 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+include Set.Make (String)
+
+let of_list xs =
+  List.fold_right add xs empty
+
diff --git a/bundles/menhirLib/menhir-20120123/src/stringSet.mli b/bundles/menhirLib/menhir-20120123/src/stringSet.mli
new file mode 100644 (file)
index 0000000..962d5d2
--- /dev/null
@@ -0,0 +1,18 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+include Set.S with type elt = string
+
+val of_list: elt list -> t
+
diff --git a/bundles/menhirLib/menhir-20120123/src/syntax.mli b/bundles/menhirLib/menhir-20120123/src/syntax.mli
new file mode 100644 (file)
index 0000000..d756530
--- /dev/null
@@ -0,0 +1,130 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* Terminals and nonterminal symbols are strings. Identifiers
+   (which are used to refer to a symbol's semantic value) are
+   strings. A file name is a string. *)
+
+type terminal =
+    string
+
+type nonterminal =
+    string 
+
+type symbol =
+    string 
+
+type identifier = 
+    string 
+
+type filename = 
+    string
+
+(* A trailer is also a source file fragment. It is represented
+   simply as a string. *)
+
+type trailer =
+    string
+
+(* Objective Caml semantic actions are represented as stretches. *)
+
+type action =
+    Action.t
+
+type token_associativity = 
+    LeftAssoc 
+  | RightAssoc
+  | NonAssoc
+  | UndefinedAssoc
+
+type precedence_level = 
+    UndefinedPrecedence 
+
+  (* Items are incomparable when they originate in different files. A
+     brand of type [Mark.t] is used to record an item's origin. The
+     positions allow locating certain warnings. *)
+
+  | PrecedenceLevel of Mark.t * int * Lexing.position * Lexing.position
+                                    
+type token_properties =
+    {
+              tk_filename      : filename;
+              tk_ocamltype     : Stretch.ocamltype option;
+              tk_position      : Positions.t;
+      mutable  tk_associativity : token_associativity;
+      mutable  tk_priority      : precedence_level; (* TEMPORARY terminologie toujours pas coherente *)
+      mutable  tk_is_declared   : bool; 
+    }
+
+type parameter = 
+  | ParameterVar of symbol Positions.located
+  | ParameterApp of symbol Positions.located * parameters
+
+and parameters = 
+    parameter list
+
+type declaration =
+
+    (* Raw Objective Caml code. *)
+
+  | DCode of Stretch.t
+
+    (* Raw Objective Caml functor parameter. *)
+
+  | DParameter of Stretch.ocamltype (* really a stretch *)
+
+    (* Terminal symbol (token) declaration. *)
+
+  | DToken of Stretch.ocamltype option * terminal
+
+    (* Start symbol declaration. *)
+
+  | DStart of nonterminal 
+
+    (* Priority and associativity declaration. *)
+
+  | DTokenProperties of terminal * token_associativity * precedence_level
+
+    (* Type declaration. *)
+
+  | DType of Stretch.ocamltype * parameter
+
+type branch_shift_precedence =
+    symbol Positions.located option
+
+type branch_reduce_precedence =
+    precedence_level
+
+type producer =
+    identifier Positions.located option * parameter
+
+type parameterized_branch =
+    { 
+      pr_branch_position          : Positions.t;
+      pr_producers                : producer list;
+      pr_action                           : action; 
+      pr_branch_shift_precedence   : branch_shift_precedence;
+      pr_branch_reduce_precedence  : branch_reduce_precedence
+    }
+
+type parameterized_rule =
+    {
+      pr_public_flag      : bool;
+      pr_inline_flag      : bool;
+      pr_nt               : nonterminal;
+      pr_positions        : Positions.t list;
+      pr_parameters       : symbol list;
+      pr_branches         : parameterized_branch list;
+    }
+
diff --git a/bundles/menhirLib/menhir-20120123/src/tableBackend.ml b/bundles/menhirLib/menhir-20120123/src/tableBackend.ml
new file mode 100644 (file)
index 0000000..6065e34
--- /dev/null
@@ -0,0 +1,795 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+open CodeBits
+open Grammar
+open IL
+open Interface
+open PreFront
+open Printf
+open TokenType
+open CodePieces
+
+module Run (T : sig end) = struct
+
+(* ------------------------------------------------------------------------ *)
+
+(* Conventional names for modules, exceptions, record fields, functions. *)
+
+let menhirlib =
+  "MenhirLib"
+
+let tableInterpreter =
+  menhirlib ^ ".TableInterpreter"
+
+let make =
+  tableInterpreter ^ ".Make"
+
+let accept =
+  tableInterpreter ^ ".Accept"
+
+let engineTypes =
+  menhirlib ^ ".EngineTypes"
+
+let field x =
+  engineTypes ^ "." ^ x
+
+let fstate =
+  field "state"
+
+let fsemv =
+  field "semv"
+
+let fstartp =
+  field "startp"
+
+let fendp =
+  field "endp"
+
+let fnext =
+  field "next"
+
+let fstack =
+  field "stack"
+
+let fcurrent =
+  field "current"
+
+let flexbuf =
+  field "lexbuf"
+
+let fpreviouserror =
+  field "previouserror"
+
+let flex_start_p =
+  "Lexing.lex_start_p"
+
+let interpreter =
+  "MenhirInterpreter"
+
+let entry =
+  interpreter ^ ".entry"
+
+(* ------------------------------------------------------------------------ *)
+
+(* Code generation for semantic actions. *)
+
+(* The functions [reducecellparams] and [reducebody] are adpated from
+   [CodeBackend]. *)
+
+(* Things are slightly more regular here than in the code-based
+   back-end, since there is no optimization: every stack cell has the
+   same structure and holds a state, a semantic value, and a pair of
+   positions. Because every semantic value is represented, we do not
+   have a separate [unitbindings]. *)
+
+(* [reducecellparams] constructs a pattern that describes the contents
+   of a stack cell. If this is the bottom cell, the variable [state]
+   is bound to the state found in the cell. If [ids.(i)] is used in
+   the semantic action, then it is bound to the semantic value. The
+   position variables are always bound. *)
+
+let reducecellparams prod i symbol (next : pattern) : pattern =
+
+  let ids = Production.identifiers prod
+  and used = Production.used prod in
+
+  PRecord [
+    fstate, (if i = 0 then PVar state else PWildcard);
+    fsemv, (if used.(i) then PVar ids.(i) else PWildcard);
+    fstartp, PVar (Printf.sprintf "_startpos_%s_" ids.(i));
+    fendp, PVar (Printf.sprintf "_endpos_%s_" ids.(i));
+    fnext, next;
+  ]
+
+(* The semantic values bound in [reducecellparams] have type [Obj.t].
+   They should now be cast to their real type. If we had [PMagic] in
+   the syntax of patterns, we could do that in one swoop; since we don't,
+   we have to issue a series of casts a posteriori. *)
+
+let reducecellcasts prod i symbol casts =
+
+  let ids = Production.identifiers prod
+  and used = Production.used prod in
+
+  if used.(i) then
+    let id = ids.(i) in
+    let t : typ =
+      match semvtype symbol with
+      | [] ->
+         tunit
+      | [ t ] ->
+         t
+      | _ ->
+         assert false
+    in
+    (* Cast: [let id = ((Obj.magic id) : t) in ...]. *)
+    (
+      PVar id,
+      EAnnot (EMagic (EVar id), type2scheme t)
+    ) :: casts
+  else
+    casts
+
+(* This is the body of the [reduce] function associated with
+   production [prod]. It assumes that the variables [env] and [stack]
+   have been bound. *)
+
+let reducebody prod =
+
+  let nt, rhs = Production.def prod
+  and ids = Production.identifiers prod
+  and length = Production.length prod in
+
+  (* Build a pattern that represents the shape of the stack. Out of
+     the stack, we extract a state (except when the production is an
+     epsilon production) and a number of semantic values. *)
+
+  (* At the same time, build a series of casts. *)
+
+  let (_ : int), pat, casts =
+    Invariant.fold (fun (i, pat, casts) (_ : bool) symbol _ ->
+      i + 1,
+      reducecellparams prod i symbol pat,
+      reducecellcasts prod i symbol casts
+    ) (0, PVar stack, []) (Invariant.prodstack prod)
+  in
+
+  (* Determine start and end positions for the left-hand side of the
+     production. *)
+
+  let posbindings =
+    ( PVar startp,
+      if length > 0 then
+       EVar (Printf.sprintf "_startpos_%s_" ids.(0))
+      else
+       ERecordAccess(ERecordAccess (EVar env, flexbuf), flex_start_p)
+    ) ::
+    ( PVar endp,
+      if length > 0 then
+       EVar (Printf.sprintf "_endpos_%s_" ids.(length - 1))
+      else
+       EVar startp
+    ) :: []
+  in
+
+  (* Is this is one of the start productions? *)
+
+  match Production.classify prod with
+  | Some nt ->
+
+      (* This is a start production. Raise [Accept]. *)
+
+      EComment (
+        sprintf "Accepting %s" (Nonterminal.print false nt),
+        blet (
+         [ pat, EVar stack ],
+         ERaise (EData (accept, [ EVar ids.(0) ]))
+       )
+      )
+
+  | None ->
+
+      (* This is a regular production. Perform a reduction. *)
+
+      let action =
+       Production.action prod
+      in
+      let act =
+       EAnnot (Action.to_il_expr action, type2scheme (semvtypent nt))
+      in
+
+      EComment (
+        Production.print prod,
+        blet (
+         (pat, EVar stack) ::                  (* destructure the stack *)
+         casts @                               (* perform type casts *)
+         posbindings @                         (* bind [startp] and [endp] *)
+         extrabindings fpreviouserror action @ (* add bindings for the weird keywords *)
+         [ PVar semv, act ],                   (* run the user's code and bind [semv] *)
+
+         ERecordWrite (
+           EVar env, fstack,                   (* update the stack with ... *)
+           ERecord [                           (* ... a new stack cell *)
+             fstate, EVar state;               (* the current state after popping; it will be updated by [goto] *)
+             fsemv, ERepr (EVar semv);         (* the newly computed semantic value *)
+             fstartp, EVar startp;             (* the newly computed start and end positions *)
+             fendp, EVar endp;
+             fnext, EVar stack;                (* this is the stack after popping *)
+           ]
+         )
+
+       )
+      )
+
+let semantic_action prod =
+  EFun (
+    [ PVar env ],
+
+    if Invariant.ever_reduced prod then
+
+      (* Access the stack and current state via the environment. *)
+
+      (* In fact, the current state needs be bound here only if this is
+        an epsilon production. Otherwise, the variable [state] will be
+        bound by the pattern produced by [reducecellparams] above. *)
+
+      ELet (
+
+       [ PVar stack, ERecordAccess (EVar env, fstack) ] @
+         (if Production.length prod = 0 then [ PVar state, ERecordAccess (EVar env, fcurrent) ] else []),
+
+       (* Then, *)
+
+       reducebody prod
+
+      )
+
+    else
+
+      (* For productions that are never reduced, generate no code. *)
+
+      (* We do this mainly because [Invariant.prodstack] does not
+        support productions that are never reduced. *)
+      
+      EComment (
+       "a production never reduced",
+       EApp (EVar "assert", [ EData ("false", []) ])
+      )
+
+  )
+
+(* ------------------------------------------------------------------------ *)
+
+(* Table encodings. *)
+
+(* Encodings of entries in the default reduction table. *)
+
+let encode_DefRed prod =            (* 1 + prod *)
+  1 + Production.p2i prod
+
+let encode_NoDefRed =               (* 0 *)
+  0
+
+(* Encodings of entries in the action table. *)
+
+let encode_Reduce prod =            (* prod | 01 *)
+  (Production.p2i prod lsl 2) lor 1
+
+let encode_ShiftDiscard s =         (*    s | 10 *)
+  ((Lr1.number s) lsl 2) lor 0b10
+
+let encode_ShiftNoDiscard s =       (*    s | 11 *)
+  ((Lr1.number s) lsl 2) lor 0b11
+
+let encode_Fail =                   (*        00 *)
+  0
+
+(* Encodings of entries in the goto table. *)
+
+let encode_Goto node =              (* 1 + node *)
+  1 + Lr1.number node
+
+let encode_NoGoto =                 (* 0 *)
+  0
+
+(* Encodings of the hole in the action and goto tables. *)
+
+let hole =
+  assert (encode_Fail = 0);
+  assert (encode_NoGoto = 0);
+  0
+
+(* Encodings of entries in the error bitmap. *)
+
+let encode_Error =                  (* 0 *)
+  0
+
+let encode_NoError =                (* 1 *)
+  1
+
+(* ------------------------------------------------------------------------ *)
+
+(* Statistics. *)
+
+(* Integer division, rounded up. *)
+
+let div a b =
+  if a mod b = 0 then a / b else a / b + 1
+
+(* [size] provides a rough measure of the size of its argument, in words.
+   The [unboxed] parameter is true if we have already counted 1 for the
+   pointer to the object. *)
+
+let rec size unboxed = function
+  | EIntConst _
+  | ETuple []
+  | EData (_, []) ->
+      if unboxed then 0 else 1
+  | EStringConst s ->
+      1 + div (String.length s * 8) Sys.word_size
+  | ETuple es
+  | EData (_, es)
+  | EArray es ->
+      1 + List.length es + List.fold_left (fun s e -> s + size true e) 0 es
+  | _ ->
+      assert false (* not implemented *)
+
+let size =
+  size false
+
+(* Optionally, print a measure of each of the tables that we are defining. *)
+
+let define (name, expr) = {
+  valpublic = true;
+  valpat = PVar name;
+  valval = expr
+}
+
+let define_and_measure (x, e) =
+  Error.logC 1 (fun f ->
+    fprintf f
+      "The %s table occupies roughly %d bytes.\n"
+      x
+      (size e * (Sys.word_size / 8))
+  );
+  define (x, e)
+
+
+(* ------------------------------------------------------------------------ *)
+
+(* Table compression. *)
+
+(* Our sparse, two-dimensional tables are turned into one-dimensional tables
+   via [RowDisplacement]. *)
+
+(* The error bitmap, which is two-dimensional but not sparse, is made
+   one-dimensional by simple flattening. *)
+
+(* Every one-dimensional table is then packed via [PackedIntArray]. *)
+
+(* Optionally, we print some information about the compression ratio. *)
+
+(* [population] counts the number of significant entries in a
+   two-dimensional matrix. *)
+
+let population (matrix : int array array) =
+  Array.fold_left (fun population row ->
+    Array.fold_left (fun population entry ->
+      if entry = hole then population else population + 1
+    ) population row
+  ) 0 matrix
+
+(* [marshal1] marshals a one-dimensional array. *)
+
+let marshal1 (table : int array) =
+  let (bits : int), (text : string) = MenhirLib.PackedIntArray.pack table in
+  ETuple [ EIntConst bits; EStringConst text ]
+
+(* [marshal11] marshals a one-dimensional array whose bit width is
+   statically known to be [1]. *)
+
+let marshal11 (table : int array) =
+  let (bits : int), (text : string) = MenhirLib.PackedIntArray.pack table in
+  assert (bits = 1);
+  EStringConst text
+
+(* [marshal2] marshals a two-dimensional table. *)
+
+let marshal2 name m n (matrix : int list list) =
+  let matrix : int array array =
+    Array.of_list (List.map Array.of_list matrix)
+  in
+  let (displacement : int array), (data : int array) =
+    MenhirLib.RowDisplacement.compress
+      (=)
+      (fun x -> x = hole)
+      hole
+      m
+      n
+      matrix
+  in
+  Error.logC 1 (fun f ->
+    fprintf f
+      "The %s table is %d entries; %d non-zero; %d compressed.\n"
+      name
+      (m * n)
+      (population matrix)
+      (Array.length displacement + Array.length data)
+  );
+  ETuple [
+    marshal1 displacement;
+    marshal1 data;
+  ]
+
+let marshal1 (table : int list) =
+  marshal1 (Array.of_list table)
+
+let marshal11 (table : int list) =
+  marshal11 (Array.of_list table)
+
+(* ------------------------------------------------------------------------ *)
+
+(* Table generation. *)
+
+(* The action table. *)
+
+let action node t =
+  match Invariant.has_default_reduction node with
+  | Some _ ->
+
+      (* [node] has a default reduction; in that case, the action
+        table is never looked up. *)
+
+      hole
+
+  | None ->
+
+      try
+       let target = SymbolMap.find (Symbol.T t) (Lr1.transitions node) in
+
+       (* [node] has a transition to [target]. If [target] has a default
+          reduction on [#], use [ShiftNoDiscard], otherwise [ShiftDiscard]. *)
+
+       match Invariant.has_default_reduction target with
+       | Some (_, toks) when TerminalSet.mem Terminal.sharp toks ->
+           assert (TerminalSet.cardinal toks = 1);
+           encode_ShiftNoDiscard target
+       | _ ->
+           encode_ShiftDiscard target
+
+      with Not_found ->
+       try
+
+         (* [node] has a reduction. *)
+
+         let prod = Misc.single (TerminalMap.find t (Lr1.reductions node)) in
+         encode_Reduce prod
+
+       with Not_found ->
+
+         (* [node] has no action. *)
+
+         encode_Fail
+
+(* In the error bitmap and in the action table, the row that corresponds to the
+   [#] pseudo-terminal is never accessed. Thus, we do not create this row. This
+   does not create a gap in the table, because this is the right-most row. For
+   sanity, we check this fact here. *)
+
+let () =
+  assert (Terminal.t2i Terminal.sharp = Terminal.n - 1)
+
+(* The goto table. *)
+
+let goto node nt =
+  try
+    let target = SymbolMap.find (Symbol.N nt) (Lr1.transitions node) in
+    encode_Goto target
+  with Not_found ->
+    encode_NoGoto
+
+(* The error bitmap reflects which entries in the action table are
+   [Fail]. Like the action table, it is not accessed when [node] has a
+   default reduction. *)
+
+let error node t =
+  if action node t = encode_Fail then
+    encode_Error
+  else
+    encode_NoError
+
+(* The default reductions table. *)
+
+let default_reduction node =
+  match Invariant.has_default_reduction node with
+  | Some (prod, _) ->
+      encode_DefRed prod
+  | None ->
+      encode_NoDefRed
+
+(* Generate the table definitions. *)
+
+let action =
+  define_and_measure (
+    "action",
+    marshal2 "action" Lr1.n (Terminal.n - 1) (
+      Lr1.map (fun node ->
+       Terminal.mapx (fun t ->
+         action node t
+       )
+      )
+    )
+  )
+
+let goto =
+  define_and_measure (
+    "goto",
+    marshal2 "goto" Lr1.n Nonterminal.n (
+      Lr1.map (fun node ->
+       Nonterminal.map (fun nt ->
+         goto node nt
+       )
+      )
+    )
+  )
+
+let error =
+  define_and_measure (
+    "error",
+    ETuple [
+      EIntConst (Terminal.n - 1);
+      marshal11 (
+       List.flatten (
+         Lr1.map (fun node ->
+           Terminal.mapx (fun t ->
+             error node t
+           )
+         )
+       )
+      )
+    ]
+  )
+
+let default_reduction =
+  define_and_measure (
+    "default_reduction",
+    marshal1 (
+      Lr1.map (fun node ->
+       default_reduction node
+      )
+    )
+  )
+
+let lhs =
+  define_and_measure (
+    "lhs",
+    marshal1 (
+      Production.map (fun prod ->
+       Nonterminal.n2i (Production.nt prod)
+      )
+    )
+  )
+
+let semantic_action =
+  define (
+    "semantic_action",
+    EArray (Production.map semantic_action)
+  )
+
+(* ------------------------------------------------------------------------ *)
+
+(* When [--trace] is enabled, we need tables that map terminals and
+   productions to strings. *)
+
+let stringwrap f x =
+  EStringConst (f x)
+
+let reduce_or_accept prod =
+  match Production.classify prod with
+  | Some _ ->
+      "Accepting"
+  | None ->
+      "Reducing production " ^ (Production.print prod)
+
+let trace =
+  define_and_measure (
+    "trace",
+    if Settings.trace then
+      EData ("Some", [
+       ETuple [
+         EArray (Terminal.map (stringwrap Terminal.print));
+         EArray (Production.map (stringwrap reduce_or_accept));
+       ]
+      ])
+    else
+      EData ("None", [])
+  )
+
+(* ------------------------------------------------------------------------ *)
+
+(* Generate the two functions that map a token to its integer code and to
+   its semantic value, respectively. *)
+
+let token2terminal =
+  destructuretokendef
+    "token2terminal"
+    tint
+    false
+    (fun tok -> EIntConst (Terminal.t2i tok))
+
+let token2value =
+  destructuretokendef
+    "token2value"
+    tobj
+    true
+    (fun tok ->
+      ERepr (
+       match Terminal.ocamltype tok with
+       | None ->
+           EUnit
+       | Some _ ->
+           EVar semv
+      )
+    )
+
+(* ------------------------------------------------------------------------ *)
+
+(* We are now ready to apply the functor [TableInterpreter.Make]. *)
+
+(* The type [token], which was defined at toplevel, must be defined again
+   in the functor argument. We would like to write [type token = token], but
+   that is not valid ocaml. The usual workaround involves a dummy type. *)
+
+let jeton =
+  prefix "jeton"
+
+let tokendef1 = {
+  typename = jeton;
+  typeparams = [];
+  typerhs = TAbbrev ttoken;
+  typeconstraint = None;
+}
+
+let tokendef2 = {
+  typename = "token"; (* not [TokenType.tctoken], as it might carry an undesired prefix *)
+  typeparams = [];
+  typerhs = TAbbrev (TypApp (jeton, []));
+  typeconstraint = None;
+}
+
+(* Here is the application of [TableInterpreter.Make]. Note that the
+   exception [Error], which is defined at toplevel, is re-defined
+   within the functor argument: [exception Error = Error]. *)
+
+let application = {
+
+  modulename =
+    interpreter;
+
+  modulerhs =
+    MApp (
+      MVar make,
+      MStruct {
+       struct_excdefs = [
+         excredef;
+       ];
+       struct_typedefs = [
+         tokendef2;
+       ];
+       struct_nonrecvaldefs = [
+         token2terminal;
+         define ("error_terminal", EIntConst (Terminal.t2i Terminal.error));
+         token2value;
+         default_reduction;
+         error;
+         action;
+         lhs;
+         goto;
+         semantic_action;
+         define ("recovery", eboolconst Settings.recovery);
+         trace;
+       ];
+      }
+    );
+
+}
+
+(* ------------------------------------------------------------------------ *)
+
+(* The client API invokes the interpreter with an appropriate start state. *)
+
+let api : IL.valdef list =
+
+  let lexer = "lexer"
+  and lexbuf = "lexbuf" in
+
+  ProductionMap.fold (fun prod state api ->
+
+    let nt : Nonterminal.t =
+      match Production.classify prod with
+      | Some nt ->
+         nt
+      | None ->
+         assert false (* this is a start production *)
+    in
+
+    let t : typ =
+      match Nonterminal.ocamltype nt with
+      | Some t ->
+         TypTextual t
+      | None ->
+         assert false (* every start symbol should carry a type *)
+    in
+    
+    define (
+      Nonterminal.print true nt,
+      EFun (
+       [ PVar lexer; PVar lexbuf ],
+       EAnnot (
+         EMagic (
+           EApp (
+             EVar entry, [
+               EIntConst (Lr1.number state);
+               EVar lexer;
+               EVar lexbuf
+             ]
+           )
+         ),
+         type2scheme t
+       )
+      )
+    ) ::
+    api
+
+  ) Lr1.entry []
+
+(* ------------------------------------------------------------------------ *)
+
+(* Let's put everything together. *)
+
+let program = {
+
+  paramdefs =
+    Front.grammar.UnparameterizedSyntax.parameters;
+
+  prologue =
+    Front.grammar.UnparameterizedSyntax.preludes;
+
+  excdefs =
+    [ excdef ];
+
+  typedefs =
+    tokentypedef @
+    [ tokendef1 ];
+
+  nonrecvaldefs =
+    [ excvaldef ];
+
+  moduledefs =
+    [ application ];
+
+  valdefs =
+    api;
+
+  postlogue =
+    Front.grammar.UnparameterizedSyntax.postludes
+
+}
+
+let () =
+  Time.tick "Producing abstract syntax"
+
+end
+
diff --git a/bundles/menhirLib/menhir-20120123/src/tableBackend.mli b/bundles/menhirLib/menhir-20120123/src/tableBackend.mli
new file mode 100644 (file)
index 0000000..1d218cb
--- /dev/null
@@ -0,0 +1,22 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* The (table-based) code generator. *)
+
+module Run (T : sig end) : sig
+
+  val program: IL.program
+
+end
+
diff --git a/bundles/menhirLib/menhir-20120123/src/tableFormat.ml b/bundles/menhirLib/menhir-20120123/src/tableFormat.ml
new file mode 100644 (file)
index 0000000..8e94d5b
--- /dev/null
@@ -0,0 +1,134 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the GNU Library General Public License, with the   *)
+(*  special exception on linking described in file LICENSE.               *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* This signature defines the format of the parse tables. It is used as
+   an argument to [TableInterpreter]. *)
+
+module type TABLES = sig
+
+  (* This is the parser's type of tokens. *)
+    
+  type token
+
+  (* This maps a token to its internal (generation-time) integer code. *)
+
+  val token2terminal: token -> int
+
+  (* This is the integer code for the error pseudo-token. *)
+
+  val error_terminal: int
+
+  (* This maps a token to its semantic value. *)
+
+  val token2value: token -> Obj.t
+
+  (* Traditionally, an LR automaton is described by two tables, namely, an
+     action table and a goto table. See, for instance, the Dragon book.
+
+     The action table is a two-dimensional matrix that maps a state and a
+     lookahead token to an action. An action is one of: shift to a certain
+     state, reduce a certain production, accept, or fail.
+
+     The goto table is a two-dimensional matrix that maps a state and a
+     non-terminal symbol to either a state or undefined. By construction, this
+     table is sparse: its undefined entries are never looked up. A compression
+     technique is free to overlap them with other entries.
+
+     In Menhir, things are slightly different. If a state has a default
+     reduction on token [#], then that reduction must be performed without
+     consulting the lookahead token. As a result, we must first determine
+     whether that is the case, before we can obtain a lookahead token and use it
+     as an index in the action table.
+
+     Thus, Menhir's tables are as follows.
+
+     A one-dimensional default reduction table maps a state to either ``no
+     default reduction'' (encoded as: 0) or ``by default, reduce prod''
+     (encoded as: 1 + prod). The action table is looked up only when there
+     is no default reduction. *)
+
+  val default_reduction: PackedIntArray.t
+
+  (* Menhir follows Dencker, Dürre and Heuft, who point out that, although the
+     action table is not sparse by nature (i.e., the error entries are
+     significant), it can be made sparse by first factoring out a binary error
+     matrix, then replacing the error entries in the action table with undefined
+     entries. Thus:
+
+     A two-dimensional error bitmap maps a state and a terminal to either
+     ``fail'' (encoded as: 0) or ``do not fail'' (encoded as: 1). The action
+     table, which is now sparse, is looked up only in the latter case. *)
+
+  (* The error bitmap is flattened into a one-dimensional table; its width is
+     recorded so as to allow indexing. The table is then compressed via
+     [PackedIntArray]. The bit width of the resulting packed array must be
+     [1], so it is not explicitly recorded. *)
+
+  (* The error bitmap does not contain a column for the [#] pseudo-terminal.
+     Thus, its width is [Terminal.n - 1]. We exploit the fact that the integer
+     code assigned to [#] is greatest: the fact that the right-most column
+     in the bitmap is missing does not affect the code for accessing it. *)
+
+  val error: int (* width of the bitmap *) * string (* second component of [PackedIntArray.t] *)
+
+  (* A two-dimensional action table maps a state and a terminal to one of
+     ``shift to state s and discard the current token'' (encoded as: s | 10),
+     ``shift to state s without discarding the current token'' (encoded as: s |
+     11), or ``reduce prod'' (encoded as: prod | 01). *)
+
+  (* The action table is first compressed via [RowDisplacement], then packed
+     via [PackedIntArray]. *)
+
+  (* Like the error bitmap, the action table does not contain a column for the
+     [#] pseudo-terminal. *)
+
+  val action: PackedIntArray.t * PackedIntArray.t
+
+  (* A one-dimensional lhs table maps a production to its left-hand side (a
+     non-terminal symbol). *)
+
+  val lhs: PackedIntArray.t
+
+  (* A two-dimensional goto table maps a state and a non-terminal symbol to
+     either undefined (encoded as: 0) or a new state s (encoded as: 1 + s). *)
+
+  (* The goto table is first compressed via [RowDisplacement], then packed
+     via [PackedIntArray]. *)
+
+  val goto: PackedIntArray.t * PackedIntArray.t
+
+  (* A one-dimensional semantic action table maps productions to semantic
+     actions. The calling convention for semantic actions is described in
+     [EngineTypes]. *)
+    
+  val semantic_action: ((int, Obj.t, token) EngineTypes.env -> unit) array
+
+  (* The parser defines its own [Error] exception. This exception can be
+     raised by semantic actions and caught by the engine, and raised by the
+     engine towards the final user. *)
+
+  exception Error
+
+  (* The parser indicates whether to perform error recovery. *)
+
+  val recovery: bool
+
+  (* The parser indicates whether to generate a trace. Generating a
+     trace requires two extra tables, which respectively map a
+     terminal symbol and a production to a string. *)
+
+  val trace: (string array * string array) option
+
+end
+
diff --git a/bundles/menhirLib/menhir-20120123/src/tableInterpreter.ml b/bundles/menhirLib/menhir-20120123/src/tableInterpreter.ml
new file mode 100644 (file)
index 0000000..3dae3aa
--- /dev/null
@@ -0,0 +1,186 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the GNU Library General Public License, with the   *)
+(*  special exception on linking described in file LICENSE.               *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* This module instantiates the generic [Engine] with a thin decoding layer
+   for the generated tables. Like [Engine], it is part of [MenhirLib]. *)
+
+(* The exception [Accept] is pre-declared here: this obviates the need
+   for generating its definition. The exception [Error] is declared
+   within the generated parser. This is preferable to pre-declaring it
+   here, as it ensures that each parser gets its own, distinct [Error]
+   exception. This is consistent with the code-based back-end. *)
+
+exception Accept of Obj.t
+
+(* This functor is invoked by the generated parser. *)
+
+module Make (T : TableFormat.TABLES)
+
+= Engine.Make (struct
+
+  type state =
+      int
+
+  type token =
+      T.token
+
+  type terminal =
+      int
+
+  type semantic_value =
+      Obj.t
+         
+  let token2terminal =
+    T.token2terminal
+       
+  let token2value =
+    T.token2value
+       
+  let error_terminal =
+    T.error_terminal
+
+  let error_value =
+    Obj.repr ()
+  
+  type production =
+      int
+  
+  let default_reduction state defred nodefred env =
+    let code = PackedIntArray.get T.default_reduction state in
+    if code = 0 then
+      nodefred env
+    else
+      defred env (code - 1)
+  
+  (* This auxiliary function helps access a compressed, two-dimensional
+     matrix, like the action and goto tables. *)
+
+  let unmarshal2 table i j =
+    RowDisplacement.getget
+      PackedIntArray.get
+      PackedIntArray.get
+      table
+      i j
+
+  (* This auxiliary function helps access a flattened, two-dimensional
+     matrix, like the error bitmap. *)
+
+  let unflatten (n, data) i j =
+    PackedIntArray.get1 data (n * i + j)
+
+  let action state terminal value shift reduce fail env =
+    match unflatten T.error state terminal with
+    | 1 ->
+       let action = unmarshal2 T.action state terminal in
+       let opcode = action land 0b11
+       and param = action lsr 2 in
+       if opcode >= 0b10 then
+         (* 0b10 : shift/discard *)
+         (* 0b11 : shift/nodiscard *)
+         let please_discard = (opcode = 0b10) in
+         shift env please_discard terminal value param
+       else
+         (* 0b01 : reduce *)
+         (* 0b00 : cannot happen *)
+         reduce env param
+    | c ->
+       assert (c = 0);
+       fail env
+  
+  let goto state prod =
+    let code = unmarshal2 T.goto state (PackedIntArray.get T.lhs prod) in
+    (* code = 1 + state *)
+    code - 1
+
+  exception Accept =
+       Accept
+
+  exception Error =
+       T.Error
+
+  type semantic_action =
+      (state, semantic_value, token) EngineTypes.env -> unit
+       
+  let semantic_action prod =
+    T.semantic_action.(prod)
+  
+  let recovery =
+    T.recovery
+  
+  module Log = struct
+    
+    open Printf
+    
+    let state state =
+      match T.trace with
+      | Some _ ->
+          fprintf stderr "State %d:\n%!" state
+      | None ->
+         ()
+    
+    let shift terminal state =
+      match T.trace with
+      | Some (terminals, _) ->
+          fprintf stderr "Shifting (%s) to state %d\n%!" terminals.(terminal) state
+      | None ->
+         ()
+    
+    let reduce_or_accept prod =
+      match T.trace with
+      | Some (_, productions) ->
+          fprintf stderr "%s\n%!" productions.(prod)
+      | None ->
+         ()
+    
+    let lookahead_token lexbuf token =
+      match T.trace with
+      | Some (terminals, _) ->
+          fprintf stderr "Lookahead token is now %s (%d-%d)\n%!"
+            terminals.(token)
+            lexbuf.Lexing.lex_start_p.Lexing.pos_cnum
+            lexbuf.Lexing.lex_curr_p.Lexing.pos_cnum
+      | None ->
+         ()
+    
+    let initiating_error_handling () =
+      match T.trace with
+      | Some _ ->
+          fprintf stderr "Initiating error handling\n%!"
+      | None ->
+         ()
+    
+    let resuming_error_handling () =
+      match T.trace with
+      | Some _ ->
+          fprintf stderr "Resuming error handling\n%!"
+      | None ->
+         ()
+    
+    let handling_error state =
+      match T.trace with
+      | Some _ ->
+          fprintf stderr "Handling error in state %d\n%!" state
+      | None ->
+         ()
+    
+    let discarding_last_token token =
+      match T.trace with
+      | Some (terminals, _) ->
+          fprintf stderr "Discarding last token read (%s)\n%!" terminals.(token)
+      | None ->
+         ()
+
+  end
+  
+end)
diff --git a/bundles/menhirLib/menhir-20120123/src/tableInterpreter.mli b/bundles/menhirLib/menhir-20120123/src/tableInterpreter.mli
new file mode 100644 (file)
index 0000000..0571656
--- /dev/null
@@ -0,0 +1,33 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the GNU Library General Public License, with the   *)
+(*  special exception on linking described in file LICENSE.               *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* This module instantiates the generic [Engine] with a thin decoding layer
+   for the generated tables. Like [Engine], it is part of [MenhirLib]. *)
+
+(* The exception [Accept] is pre-declared here: this obviates the need
+   for generating its definition. The exception [Error] is declared
+   within the generated parser. This is preferable to pre-declaring it
+   here, as it ensures that each parser gets its own, distinct [Error]
+   exception. This is consistent with the code-based back-end. *)
+
+exception Accept of Obj.t
+
+(* This functor is invoked by the generated parser. *)
+
+module Make (T : TableFormat.TABLES)
+
+: EngineTypes.ENGINE with type state = int
+                           and type token = T.token
+                          and type semantic_value = Obj.t
+
diff --git a/bundles/menhirLib/menhir-20120123/src/tarjan.ml b/bundles/menhirLib/menhir-20120123/src/tarjan.ml
new file mode 100644 (file)
index 0000000..db0cb65
--- /dev/null
@@ -0,0 +1,228 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* This module provides an implementation of Tarjan's algorithm for
+   finding the strongly connected components of a graph.
+
+   The algorithm runs when the functor is applied. Its complexity is
+   $O(V+E)$, where $V$ is the number of vertices in the graph $G$, and
+   $E$ is the number of edges. *)
+
+module Run (G : sig
+
+  type node
+
+  (* We assume each node has a unique index. Indices must range from
+     $0$ to $n-1$, where $n$ is the number of nodes in the graph. *)
+
+  val n: int
+  val index: node -> int
+
+  (* Iterating over a node's immediate successors. *)
+
+  val successors: (node -> unit) -> node -> unit
+
+  (* Iterating over all nodes. *)
+
+  val iter: (node -> unit) -> unit
+
+end) = struct
+
+  (* Define the internal data structure associated with each node. *)
+
+  type data = {
+
+      (* Each node carries a flag which tells whether it appears
+        within the SCC stack (which is defined below). *)
+
+      mutable stacked: bool;
+
+      (* Each node carries a number. Numbers represent the order in
+        which nodes were discovered. *)
+
+      mutable number: int;
+
+      (* Each node [x] records the lowest number associated to a node
+        already detected within [x]'s SCC. *)
+
+      mutable low: int;
+
+      (* Each node carries a pointer to a representative element of
+        its SCC. This field is used by the algorithm to store its
+        results. *)
+
+      mutable representative: G.node;
+
+      (* Each representative node carries a list of the nodes in
+        its SCC. This field is used by the algorithm to store its
+        results. *)
+
+      mutable scc: G.node list
+
+    } 
+
+  (* Define a mapping from external nodes to internal ones. Here, we
+     simply use each node's index as an entry into a global array. *)
+
+  let table =
+
+    (* Create the array. We initially fill it with [None], of type
+       [data option], because we have no meaningful initial value of
+       type [data] at hand. *)
+
+    let table = Array.create G.n None in
+
+    (* Initialize the array. *)
+
+    G.iter (fun x ->
+      table.(G.index x) <- Some {
+       stacked = false;
+       number = 0;
+       low = 0;
+       representative = x;
+        scc = []
+      }
+    );
+
+    (* Define a function which gives easy access to the array. It maps
+       each node to its associated piece of internal data. *)
+
+    function x ->
+      match table.(G.index x) with
+      |        Some dx ->
+         dx
+      |        None ->
+         assert false (* Indices do not cover the range $0\ldots n$, as expected. *)
+
+  (* Create an empty stack, used to record all nodes which belong to
+     the current SCC. *)
+
+  let scc_stack = Stack.create()
+
+  (* Initialize a function which allocates numbers for (internal)
+     nodes. A new number is assigned to each node the first time it is
+     visited. Numbers returned by this function start at 1 and
+     increase. Initially, all nodes have number 0, so they are
+     considered unvisited. *)
+
+  let mark =
+    let counter = ref 0 in
+    fun dx ->
+      incr counter;
+      dx.number <- !counter;
+      dx.low <- !counter
+
+  (* This reference will hold a list of all representative nodes. *)
+
+  let representatives =
+    ref []
+
+  (* Look at all nodes of the graph, one after the other. Any
+     unvisited nodes become roots of the search forest. *)
+
+  let () = G.iter (fun root ->
+    let droot = table root in
+
+    if droot.number = 0 then begin
+
+      (* This node hasn't been visited yet. Start a depth-first walk
+        from it. *)
+
+      mark droot;
+      droot.stacked <- true;
+      Stack.push droot scc_stack;
+
+      let rec walk x =
+       let dx = table x in
+
+       G.successors (fun y ->
+         let dy = table y in
+
+         if dy.number = 0 then begin
+
+           (* $y$ hasn't been visited yet, so $(x,y)$ is a regular
+              edge, part of the search forest. *)
+
+           mark dy;
+           dy.stacked <- true;
+           Stack.push dy scc_stack;
+
+           (* Continue walking, depth-first. *)
+
+           walk y;
+           if dy.low < dx.low then
+             dx.low <- dy.low
+
+         end
+         else if (dy.low < dx.low) & dy.stacked then begin
+
+           (* The first condition above indicates that $y$ has been
+              visited before $x$, so $(x, y)$ is a backwards or
+              transverse edge. The second condition indicates that
+              $y$ is inside the same SCC as $x$; indeed, if it
+              belongs to another SCC, then the latter has already
+              been identified and moved out of [scc_stack]. *)
+
+           if dy.number < dx.low then
+             dx.low <- dy.number
+
+         end
+
+       ) x;
+
+       (* We are done visiting $x$'s neighbors. *)
+
+       if dx.low = dx.number then begin
+
+         (* $x$ is the entry point of a SCC. The whole SCC is now
+            available; move it out of the stack. We pop elements out
+            of the SCC stack until $x$ itself is found. *)
+
+         let rec loop () =
+           let element = Stack.pop scc_stack in
+           element.stacked <- false;
+            dx.scc <- element.representative :: dx.scc;
+           element.representative <- x;
+           if element != dx then
+             loop() in
+
+         loop();
+         representatives := x :: !representatives
+
+       end in
+
+      walk root
+
+    end
+  )
+
+  (* There only remains to make our results accessible to the
+     outside. *)
+
+  let representative x =
+    (table x).representative
+
+  let scc x =
+    (table x).scc
+
+  let iter action =
+    List.iter (fun x ->
+      let data = table x in
+      assert (data.representative == x); (* a sanity check *)
+      assert (data.scc <> []); (* a sanity check *)
+      action x data.scc
+    ) !representatives
+
+end
+
diff --git a/bundles/menhirLib/menhir-20120123/src/tarjan.mli b/bundles/menhirLib/menhir-20120123/src/tarjan.mli
new file mode 100644 (file)
index 0000000..1196f84
--- /dev/null
@@ -0,0 +1,62 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* This module provides an implementation of Tarjan's algorithm for
+   finding the strongly connected components of a graph.
+
+   The algorithm runs when the functor is applied. Its complexity is
+   $O(V+E)$, where $V$ is the number of vertices in the graph $G$, and
+   $E$ is the number of edges. *)
+
+module Run (G : sig
+
+  type node
+
+  (* We assume each node has a unique index. Indices must range from
+     $0$ to $n-1$, where $n$ is the number of nodes in the graph. *)
+
+  val n: int
+  val index: node -> int
+
+  (* Iterating over a node's immediate successors. *)
+
+  val successors: (node -> unit) -> node -> unit
+
+  (* Iterating over all nodes. *)
+
+  val iter: (node -> unit) -> unit
+
+end) : sig
+
+  open G
+
+  (* This function maps each node to a representative element of its strongly connected component. *)
+
+  val representative: node -> node
+
+  (* This function maps each representative element to a list of all
+     members of its strongly connected component. Non-representative
+     elements are mapped to an empty list. *)
+
+  val scc: node -> node list
+
+  (* [iter action] allows iterating over all strongly connected
+     components. For each component, the [action] function is applied
+     to the representative element and to a (non-empty) list of all
+     elements. *)
+
+  val iter: (node -> node list -> unit) -> unit
+
+end
+
diff --git a/bundles/menhirLib/menhir-20120123/src/time.ml b/bundles/menhirLib/menhir-20120123/src/time.ml
new file mode 100644 (file)
index 0000000..2b9a0fb
--- /dev/null
@@ -0,0 +1,55 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+let channel =
+  stderr
+
+open Unix
+open Printf
+
+let clock =
+  ref (times())
+
+let tick msg =
+  if Settings.timings then
+    let times1 = !clock in
+    let times2 = times() in
+    fprintf channel "%s: %.02fs\n"
+      msg
+      (times2.tms_utime -. times1.tms_utime);
+    clock := times()
+
+type chrono =
+    float ref
+
+let fresh () =
+  ref 0.
+
+let chrono (chrono : float ref) (task : unit -> 'a) : 'a =
+  if Settings.timings then begin
+    let times1 = times() in
+    let result = task() in
+    let times2 = times() in
+    chrono := !chrono +. times2.tms_utime -. times1.tms_utime;
+    result
+  end
+  else
+    task()
+
+let display (chrono : float ref) msg =
+  if Settings.timings then
+    fprintf channel "%s: %.02fs\n"
+      msg
+      !chrono
+
diff --git a/bundles/menhirLib/menhir-20120123/src/time.mli b/bundles/menhirLib/menhir-20120123/src/time.mli
new file mode 100644 (file)
index 0000000..1bd9287
--- /dev/null
@@ -0,0 +1,32 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* Call [tick msg] to stop timing a task and start timing the next
+   task.  A message is displayed. The message includes [msg] as well
+   as timing information.  The very first task is deemed to begin when
+   this module is initialized. *)
+
+val tick: string -> unit
+
+(* Another timing method, with separate chronometers; useful for more
+   precise profiling. *)
+
+type chrono
+
+val fresh: unit -> chrono
+
+val chrono: chrono -> (unit -> 'a) -> 'a
+
+val display: chrono -> string -> unit
+
diff --git a/bundles/menhirLib/menhir-20120123/src/tokenType.ml b/bundles/menhirLib/menhir-20120123/src/tokenType.ml
new file mode 100644 (file)
index 0000000..893e3e0
--- /dev/null
@@ -0,0 +1,129 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* This module deals with a few details regarding the definition of
+   the [token] type. In particular, if [--only-tokens] was specified,
+   it emits the type definition and exits. *)
+
+open Syntax
+open UnparameterizedSyntax
+open IL
+open CodeBits
+
+(* This is the conventional name of the [token] type, with no
+   prefix. A prefix is possibly appended to it below, where
+   [tctoken] is redefined before being exported. *)
+
+let tctoken =
+  "token"
+
+(* This is the definition of the type of tokens. *)
+
+let tokentypedef =
+  let datadefs =
+    StringMap.fold (fun token properties defs ->
+
+      (* Pseudo-tokens (used in %prec declarations, but never
+        declared using %token) are filtered out. *)
+
+      if properties.tk_is_declared then
+       let params =
+         match properties.tk_ocamltype with
+         | None ->
+             []
+         | Some t ->
+             [ TypTextual t ]
+       in
+       {
+         dataname = token;
+         datavalparams = params;
+         datatypeparams = None
+       } :: defs
+      else
+       defs
+    ) PreFront.grammar.tokens []
+  in
+  {
+    typename = tctoken;
+    typeparams = [];
+    typerhs = TDefSum datadefs;
+    typeconstraint = None
+  }
+
+(* Consult the command line options to determine what to do.
+   If we were asked to only produce a type definition, then
+   do so and stop. Otherwise, tell the code generator whether
+   it should produce a type definition as part of the code. *)
+
+let tokentypedef, tokenprefix =
+  match Settings.token_type_mode with
+  | Settings.TokenTypeOnly ->
+
+      (* Create both an .mli file and an .ml file. This is made
+        necessary by the fact that the two can be different
+        when there are functor parameters. *)
+
+      let module P = 
+       Printer.Make (struct 
+                       let f = open_out (Settings.base ^ ".mli")
+                       let raw_stretch_action = false
+                       let locate_stretches = None 
+                       let parenthesize_let_lhs = false
+                     end) 
+      in
+      P.interface {
+        paramdecls = PreFront.grammar.parameters;
+        excdecls = [];
+       typedecls = [ tokentypedef ];
+       valdecls = []
+      };
+      let module P = 
+       Printer.Make (struct 
+                       let f = open_out (Settings.base ^ ".ml")
+                       let raw_stretch_action = false
+                       let locate_stretches = None 
+                     end) 
+      in
+      P.program {
+        paramdefs = PreFront.grammar.parameters;
+        prologue = [];
+        excdefs = [];
+       typedefs = [ tokentypedef ];
+        nonrecvaldefs = [];
+       valdefs = [];
+       moduledefs = [];
+        postlogue = [];
+      };
+      exit 0
+  | Settings.CodeOnly m ->
+      [],
+      (fun id -> m ^ "." ^ id)
+  | Settings.TokenTypeAndCode ->
+      [ tokentypedef ],
+      (fun id -> id)
+
+(* Redefine the name of the [token] type to take a possible
+   prefix into account. *)
+
+let tctoken =
+  tokenprefix tctoken
+
+let ttoken =
+  TypApp (tctoken, [])
+
+(* The type of lexers. *)
+
+let tlexer =
+  TypArrow (tlexbuf, ttoken)
+
diff --git a/bundles/menhirLib/menhir-20120123/src/tokenType.mli b/bundles/menhirLib/menhir-20120123/src/tokenType.mli
new file mode 100644 (file)
index 0000000..59a15de
--- /dev/null
@@ -0,0 +1,41 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* This module deals with a few details regarding the definition of
+   the [token] type. In particular, if [--only-tokens] was specified,
+   it emits the type definition and exits. *)
+
+open Grammar
+
+(* This is the conventional name of the [token] type, for use by
+   the code generator. *)
+
+val tctoken: string
+val ttoken: IL.typ
+
+(* This is the type of lexers. It refers to the [token] type,
+   which is why it is defined here. *)
+
+val tlexer: IL.typ
+
+(* This is the definition of the type of tokens, for use by the
+   code generator. *)
+
+val tokentypedef: IL.typedef list
+
+(* This function prefixes the name of a token with an appropriate
+   Objective Caml module name, if necessary. *)
+
+val tokenprefix: string -> string
+
diff --git a/bundles/menhirLib/menhir-20120123/src/traverse.ml b/bundles/menhirLib/menhir-20120123/src/traverse.ml
new file mode 100644 (file)
index 0000000..a117e82
--- /dev/null
@@ -0,0 +1,550 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* Code for traversing or transforming [IL] terms. *)
+
+open IL
+open CodeBits
+
+(* This turns a list of value definitions into a hash table. It also
+counts and numbers the definitions. We assume that the left-hand
+side of every definition is a variable. *)
+
+let tabulate_defs (defs : valdef list) : int * (string, int * valdef) Hashtbl.t =
+  let count = ref 0 in
+  let table = Hashtbl.create 1023 in
+  List.iter (fun def ->
+          let k = !count in
+          count := k + 1;
+          Hashtbl.add table (pat2var def.valpat) (k, def)
+    ) defs;
+  !count, table
+
+(* This mixin class, used by [map] and [fold] below, helps maintain
+   environments, which can be used to keep track of local variable
+   bindings. *)
+
+class virtual ['env] env = object(self)
+
+  (* The virtual method [pvar] records a local variable binding in
+     the environment. *)
+
+  method virtual pvar: 'env -> string -> 'env
+
+  method pat env = function
+    | PWildcard
+    | PUnit ->
+       env
+    | PVar id ->
+       self#pvar env id
+    | PTuple ps
+    | POr ps
+    | PData (_, ps) ->
+       self#pats env ps
+    | PAnnot (p, _) ->
+        self#pat env p
+    | PRecord fps ->
+       self#fpats env fps
+
+  method pats env ps =
+    List.fold_left self#pat env ps
+
+  method fpats env fps =
+    List.fold_left self#fpat env fps
+
+  method fpat env (_, p) =
+    self#pat env p
+
+end
+
+(* A class that helps transform expressions. The environment [env] can be
+   used to keep track of local variable bindings. *)
+
+exception NoChange
+
+class virtual ['env] map = object (self)
+
+  inherit ['env] env
+  
+  method expr (env : 'env) e =
+    try
+      match e with
+      | EVar x ->
+          self#evar env x
+      | EFun (ps, e) ->
+          self#efun env ps e
+      | EApp (e, es) ->
+          self#eapp env e es
+      | ELet (bs, e) ->
+          self#elet env bs e
+      | EMatch (e, bs) ->
+          self#ematch env e bs
+      | EIfThen (e, e1) ->
+          self#eifthen env e e1
+      | EIfThenElse (e, e1, e2) ->
+          self#eifthenelse env e e1 e2
+      | ERaise e ->
+          self#eraise env e
+      | ETry (e, bs) ->
+          self#etry env e bs
+      | EUnit ->
+          self#eunit env
+      | EIntConst k ->
+          self#eintconst env k
+      | EStringConst s ->
+          self#estringconst env s
+      | EData (d, es) ->
+          self#edata env d es
+      | ETuple es ->
+          self#etuple env es
+      | EAnnot (e, t) ->
+          self#eannot env e t
+      | EMagic e ->
+          self#emagic env e
+      | ERepr _ ->
+          self#erepr env e
+      | ERecord fs ->
+          self#erecord env fs
+      | ERecordAccess (e, f) ->
+          self#erecordaccess env e f
+      | ERecordWrite (e, f, e1) ->
+          self#erecordwrite env e f e1
+      | ETextual action ->
+          self#etextual env action
+      | EComment (s, e) ->
+          self#ecomment env s e
+      | EPatComment (s, p, e) ->
+          self#epatcomment env s p e
+      | EArray es ->
+         self#earray env es
+      | EArrayAccess (e, i) ->
+         self#earrayaccess env e i
+    with NoChange ->
+      e
+  
+  method evar env x =
+    raise NoChange
+  
+  method efun env ps e =
+    let e' = self#expr (self#pats env ps) e in
+    if e == e' then
+      raise NoChange
+    else
+      EFun (ps, e')
+  
+  method eapp env e es =
+    let e' = self#expr env e
+    and es' = self#exprs env es in
+    if e == e' && es == es' then
+      raise NoChange
+    else
+      EApp (e', es')
+  
+  method elet env bs e =
+    let env, bs' = self#bindings env bs in
+    let e' = self#expr env e in
+    if bs == bs' && e == e' then
+      raise NoChange
+    else
+      ELet (bs', e')
+  
+  method ematch env e bs =
+    let e' = self#expr env e
+    and bs' = self#branches env bs in
+    if e == e' && bs == bs' then
+      raise NoChange
+    else
+      EMatch (e', bs')
+  
+  method eifthen env e e1 =
+    let e' = self#expr env e
+    and e1' = self#expr env e1 in
+    if e == e' && e1 == e1' then
+      raise NoChange
+    else
+      EIfThen (e', e1')
+  
+  method eifthenelse env e e1 e2 =
+    let e' = self#expr env e
+    and e1' = self#expr env e1
+    and e2' = self#expr env e2 in
+    if e == e' && e1 == e1' && e2 == e2' then
+      raise NoChange
+    else
+      EIfThenElse (e', e1', e2')
+  
+  method eraise env e =
+    let e' = self#expr env e in
+    if e == e' then
+      raise NoChange
+    else
+      ERaise e'
+  
+  method etry env e bs =
+    let e' = self#expr env e
+    and bs' = self#branches env bs in
+    if e == e' && bs == bs' then
+      raise NoChange
+    else
+      ETry (e', bs')
+  
+  method eunit env =
+    raise NoChange
+  
+  method eintconst env k =
+    raise NoChange
+  
+  method estringconst env s =
+    raise NoChange
+  
+  method edata env d es =
+    let es' = self#exprs env es in
+    if es == es' then
+      raise NoChange
+    else
+      EData (d, es')
+  
+  method etuple env es =
+    let es' = self#exprs env es in
+    if es == es' then
+      raise NoChange
+    else
+      ETuple es'
+  
+  method eannot env e t =
+    let e' = self#expr env e in
+    if e == e' then
+      raise NoChange
+    else
+      EAnnot (e', t)
+  
+  method emagic env e =
+    let e' = self#expr env e in
+    if e == e' then
+      raise NoChange
+    else
+      EMagic e'
+  
+  method erepr env e =
+    let e' = self#expr env e in
+    if e == e' then
+      raise NoChange
+    else
+      ERepr e'
+  
+  method erecord env fs =
+    let fs' = self#fields env fs in
+    if fs == fs' then
+      raise NoChange
+    else
+      ERecord fs'
+  
+  method erecordaccess env e f =
+    let e' = self#expr env e in
+    if e == e' then
+      raise NoChange
+    else
+      ERecordAccess (e', f)
+  
+  method erecordwrite env e f e1 =
+    let e' = self#expr env e
+    and e1' = self#expr env e1 in
+    if e == e' && e1 == e1' then
+      raise NoChange
+    else
+      ERecordWrite (e', f, e1')
+  
+  method earray env es =
+    let es' = self#exprs env es in
+    if es == es' then
+      raise NoChange
+    else
+      EArray es'
+  
+  method earrayaccess env e i =
+    let e' = self#expr env e in
+    if e == e' then
+      raise NoChange
+    else
+      EArrayAccess (e', i)
+  
+  method etextual env action =
+    raise NoChange
+  
+  method ecomment env s e =
+    let e' = self#expr env e in
+    if e == e' then
+      raise NoChange
+    else
+      EComment (s, e')
+  
+  method epatcomment env s p e =
+    let e' = self#expr env e in
+    if e == e' then
+      raise NoChange
+    else
+      EPatComment (s, p, e')
+  
+  method exprs env es =
+    Misc.smap (self#expr env) es
+  
+  method fields env fs =
+    Misc.smap (self#field env) fs
+  
+  method field env ((f, e) as field) =
+    let e' = self#expr env e in
+    if e == e' then
+      field
+    else
+      (f, e')
+  
+  method branches env bs =
+    Misc.smap (self#branch env) bs
+  
+  method branch env b =
+    let e = b.branchbody in
+    let e' = self#expr (self#pat env b.branchpat) e in
+    if e == e' then
+      b
+    else
+      { b with branchbody = e' }
+
+  (* The method [binding] produces a pair of an updated environment
+     and a transformed binding. *)
+  
+  method binding env ((p, e) as b) =
+    let e' = self#expr env e in
+    self#pat env p,
+    if e == e' then
+      b
+    else
+      (p, e')
+  
+  (* For nested non-recursive bindings, the environment produced by
+     each binding is used to traverse the following bindings. The
+     method [binding] produces a pair of an updated environment
+     and a transformed list of bindings. *)
+  
+  method bindings env bs =
+    Misc.smapa self#binding env bs
+
+  method valdef env def =
+    let e = def.valval in
+    let e' = self#expr env e in
+    if e == e' then
+      def
+    else
+      { def with valval = e' }
+  
+  method valdefs env defs =
+    Misc.smap (self#valdef env) defs
+
+end
+
+(* A class that helps iterate, or fold, over expressions. *)
+
+class virtual ['env, 'a] fold = object (self)
+
+  inherit ['env] env
+  
+  method expr (env : 'env) (accu : 'a) e =
+    match e with
+    | EVar x ->
+        self#evar env accu x
+    | EFun (ps, e) ->
+        self#efun env accu ps e
+    | EApp (e, es) ->
+        self#eapp env accu e es
+    | ELet (bs, e) ->
+        self#elet env accu bs e
+    | EMatch (e, bs) ->
+        self#ematch env accu e bs
+    | EIfThen (e, e1) ->
+        self#eifthen env accu e e1
+    | EIfThenElse (e, e1, e2) ->
+        self#eifthenelse env accu e e1 e2
+    | ERaise e ->
+        self#eraise env accu e
+    | ETry (e, bs) ->
+        self#etry env accu e bs
+    | EUnit ->
+        self#eunit env accu
+    | EIntConst k ->
+        self#eintconst env accu k
+    | EStringConst s ->
+        self#estringconst env accu s
+    | EData (d, es) ->
+        self#edata env accu d es
+    | ETuple es ->
+        self#etuple env accu es
+    | EAnnot (e, t) ->
+        self#eannot env accu e t
+    | EMagic e ->
+        self#emagic env accu e
+    | ERepr _ ->
+        self#erepr env accu e
+    | ERecord fs ->
+        self#erecord env accu fs
+    | ERecordAccess (e, f) ->
+        self#erecordaccess env accu e f
+    | ERecordWrite (e, f, e1) ->
+        self#erecordwrite env accu e f e1
+    | ETextual action ->
+        self#etextual env accu action
+    | EComment (s, e) ->
+        self#ecomment env accu s e
+    | EPatComment (s, p, e) ->
+        self#epatcomment env accu s p e
+    | EArray es ->
+       self#earray env accu es
+    | EArrayAccess (e, i) ->
+       self#earrayaccess env accu e i
+
+  method evar (env : 'env) (accu : 'a) x =
+    accu
+  
+  method efun (env : 'env) (accu : 'a) ps e =
+    let accu = self#expr (self#pats env ps) accu e in
+    accu
+  
+  method eapp (env : 'env) (accu : 'a) e es =
+    let accu = self#expr env accu e in
+    let accu = self#exprs env accu es in
+    accu
+  
+  method elet (env : 'env) (accu : 'a) bs e =
+    let env, accu = self#bindings env accu bs in
+    let accu = self#expr env accu e in
+    accu
+  
+  method ematch (env : 'env) (accu : 'a) e bs =
+    let accu = self#expr env accu e in
+    let accu = self#branches env accu bs in
+    accu
+  
+  method eifthen (env : 'env) (accu : 'a) e e1 =
+    let accu = self#expr env accu e in
+    let accu = self#expr env accu e1 in
+    accu
+  
+  method eifthenelse (env : 'env) (accu : 'a) e e1 e2 =
+    let accu = self#expr env accu e in
+    let accu = self#expr env accu e1 in
+    let accu = self#expr env accu e2 in
+    accu
+  
+  method eraise (env : 'env) (accu : 'a) e =
+    let accu = self#expr env accu e in
+    accu
+  
+  method etry (env : 'env) (accu : 'a) e bs =
+    let accu = self#expr env accu e in
+    let accu = self#branches env accu bs in
+    accu
+  
+  method eunit (env : 'env) (accu : 'a) =
+    accu
+  
+  method eintconst (env : 'env) (accu : 'a) k =
+    accu
+  
+  method estringconst (env : 'env) (accu : 'a) s =
+    accu
+  
+  method edata (env : 'env) (accu : 'a) d es =
+    let accu = self#exprs env accu es in
+    accu
+  
+  method etuple (env : 'env) (accu : 'a) es =
+    let accu = self#exprs env accu es in
+    accu
+  
+  method eannot (env : 'env) (accu : 'a) e t =
+    let accu = self#expr env accu e in
+    accu
+  
+  method emagic (env : 'env) (accu : 'a) e =
+    let accu = self#expr env accu e in
+    accu
+  
+  method erepr (env : 'env) (accu : 'a) e =
+    let accu = self#expr env accu e in
+    accu
+  
+  method erecord (env : 'env) (accu : 'a) fs =
+    let accu = self#fields env accu fs in
+    accu
+  
+  method erecordaccess (env : 'env) (accu : 'a) e f =
+    let accu = self#expr env accu e in
+    accu
+  
+  method erecordwrite (env : 'env) (accu : 'a) e f e1 =
+    let accu = self#expr env accu e in
+    let accu = self#expr env accu e1 in
+    accu
+  
+  method earray (env : 'env) (accu : 'a) es =
+    let accu = self#exprs env accu es in
+    accu
+  
+  method earrayaccess (env : 'env) (accu : 'a) e i =
+    let accu = self#expr env accu e in
+    accu
+  
+  method etextual (env : 'env) (accu : 'a) action =
+    accu
+  
+  method ecomment (env : 'env) (accu : 'a) s e =
+    let accu = self#expr env accu e in
+    accu
+  
+  method epatcomment (env : 'env) (accu : 'a) s p e =
+    let accu = self#expr env accu e in
+    accu
+  
+  method exprs (env : 'env) (accu : 'a) es =
+    List.fold_left (self#expr env) accu es
+  
+  method fields (env : 'env) (accu : 'a) fs =
+    List.fold_left (self#field env) accu fs
+  
+  method field (env : 'env) (accu : 'a) (f, e) =
+    let accu = self#expr env accu e in
+    accu
+  
+  method branches (env : 'env) (accu : 'a) bs =
+    List.fold_left (self#branch env) accu bs
+  
+  method branch (env : 'env) (accu : 'a) b =
+    let accu = self#expr (self#pat env b.branchpat) accu b.branchbody in
+    accu
+  
+  method binding ((env, accu) : 'env * 'a) (p, e) =
+    let accu = self#expr env accu e in
+    self#pat env p,
+    accu
+  
+  method bindings (env : 'env) (accu : 'a) bs =
+    List.fold_left self#binding (env, accu) bs
+  
+  method valdef (env : 'env) (accu : 'a) def =
+    let accu = self#expr env accu def.valval in
+    accu
+  
+  method valdefs (env : 'env) (accu : 'a) defs =
+    List.fold_left (self#valdef env) accu defs
+  
+end
+
diff --git a/bundles/menhirLib/menhir-20120123/src/unionFind.ml b/bundles/menhirLib/menhir-20120123/src/unionFind.ml
new file mode 100644 (file)
index 0000000..7d1c1d6
--- /dev/null
@@ -0,0 +1,149 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* $Id: unionFind.ml,v 1.5 2005/12/01 16:20:07 regisgia Exp $ *)
+
+(** This module implements a simple and efficient union/find algorithm.
+    See Robert E. Tarjan, ``Efficiency of a Good But Not Linear Set
+    Union Algorithm'', JACM 22(2), 1975. *)
+
+(** The abstraction defined by this module is a set of points,
+    partitioned into equivalence classes. With each equivalence class,
+    a piece of information, of abstract type ['a], is associated; we
+    call it a descriptor.
+
+    A point is implemented as a cell, whose (mutable) contents consist
+    of a single link to either information about the equivalence class,
+    or another point. Thus, points form a graph, which must be acyclic,
+    and whose connected components are the equivalence classes. In
+    every equivalence class, exactly one point has no outgoing edge,
+    and carries information about the class instead. It is the class's
+    representative element.
+
+    Information about a class consists of an integer weight (the number
+    of elements in the class) and of the class's descriptor. *)
+type 'a point = {
+    mutable link: 'a link
+  } 
+
+and 'a link =
+  | Info of 'a info
+  | Link of 'a point
+
+and 'a info = {
+    mutable weight: int;
+    mutable descriptor: 'a
+  } 
+
+(** [fresh desc] creates a fresh point and returns it. It forms an
+    equivalence class of its own, whose descriptor is [desc]. *)
+let fresh desc = {
+  link = Info { weight = 1; descriptor = desc }
+} 
+
+(** [repr point] returns the representative element of [point]'s
+    equivalence class. It is found by starting at [point] and following
+    the links. For efficiency, the function performs path compression
+    at the same time. *)
+let rec repr point =
+  match point.link with
+  | Link point' ->
+      let point'' = repr point' in
+      if point'' != point' then
+
+       (* [point''] is [point']'s representative element. Because we
+          just invoked [repr point'], [point'.link] must be [Link
+          point'']. We write this value into [point.link], thus
+          performing path compression. Note that this function never
+          performs memory allocation. *)
+
+       point.link <- point'.link;
+      point''
+  | Info _ ->
+      point
+
+(** [find point] returns the descriptor associated with [point]'s
+    equivalence class. *)
+let rec find point =
+
+  (* By not calling [repr] immediately, we optimize the common cases
+     where the path starting at [point] has length 0 or 1, at the
+     expense of the general case. *)
+
+  match point.link with
+  | Info info
+  | Link { link = Info info } ->
+      info.descriptor
+  | Link { link = Link _ } ->
+      find (repr point)
+
+let rec change point v = 
+  match point.link with
+  | Info info
+  | Link { link = Info info } ->
+      info.descriptor <- v
+  | Link { link = Link _ } ->
+      change (repr point) v
+
+(** [union point1 point2] merges the equivalence classes associated
+    with [point1] and [point2] (which must be distinct) into a single
+    class whose descriptor is that originally associated with [point2].
+
+    The fact that [point1] and [point2] do not originally belong to the
+    same class guarantees that we do not create a cycle in the graph.
+
+    The weights are used to determine whether [point1] should be made
+    to point to [point2], or vice-versa. By making the representative
+    of the smaller class point to that of the larger class, we
+    guarantee that paths remain of logarithmic length (not accounting
+    for path compression, which makes them yet smaller). *)
+let union point1 point2 =
+  let point1 = repr point1
+  and point2 = repr point2 in
+  assert (point1 != point2);
+  match point1.link, point2.link with
+  | Info info1, Info info2 ->
+      let weight1 = info1.weight
+      and weight2 = info2.weight in
+      if weight1 >= weight2 then begin
+       point2.link <- Link point1;
+       info1.weight <- weight1 + weight2;
+       info1.descriptor <- info2.descriptor
+      end
+      else begin
+       point1.link <- Link point2;
+       info2.weight <- weight1 + weight2
+      end
+  | _, _ ->
+      assert false (* [repr] guarantees that [link] matches [Info _]. *)
+
+(** [equivalent point1 point2] tells whether [point1] and [point2]
+    belong to the same equivalence class. *)
+let equivalent point1 point2 =
+  repr point1 == repr point2
+
+(** [eunion point1 point2] is identical to [union], except it does
+    nothing if [point1] and [point2] are already equivalent. *)
+let eunion point1 point2 =
+  if not (equivalent point1 point2) then
+    union point1 point2
+
+(** [redundant] maps all members of an equivalence class, but one, to
+    [true]. *)
+let redundant = function
+  | { link = Link _ } ->
+      true
+  | { link = Info _ } ->
+      false
+
diff --git a/bundles/menhirLib/menhir-20120123/src/unionFind.mli b/bundles/menhirLib/menhir-20120123/src/unionFind.mli
new file mode 100644 (file)
index 0000000..a6432ff
--- /dev/null
@@ -0,0 +1,53 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* $Id: unionFind.mli,v 1.5 2005/12/01 16:20:07 regisgia Exp $ *)
+
+(** This module implements a simple and efficient union/find algorithm.
+    See Robert E. Tarjan, ``Efficiency of a Good But Not Linear Set
+    Union Algorithm'', JACM 22(2), 1975. *)
+
+(** The abstraction defined by this module is a set of points,
+    partitioned into equivalence classes. With each equivalence class,
+    a piece of information, of abstract type ['a], is associated; we
+    call it a descriptor. *)
+type 'a point
+
+(** [fresh desc] creates a fresh point and returns it. It forms an
+    equivalence class of its own, whose descriptor is [desc]. *)
+val fresh: 'a -> 'a point
+
+(** [find point] returns the descriptor associated with [point]'s
+    equivalence class. *)
+val find: 'a point -> 'a
+
+(** [union point1 point2] merges the equivalence classes associated
+    with [point1] and [point2] (which must be distinct) into a single
+    class whose descriptor is that originally associated with [point2]. *)
+val union: 'a point -> 'a point -> unit
+
+(** [equivalent point1 point2] tells whether [point1] and [point2]
+    belong to the same equivalence class. *)
+val equivalent: 'a point -> 'a point -> bool
+
+(** [eunion point1 point2] is identical to [union], except it does
+    nothing if [point1] and [point2] are already equivalent. *)
+val eunion: 'a point -> 'a point -> unit
+
+(** [redundant] maps all members of an equivalence class, but one, to
+    [true]. *)
+val redundant: 'a point -> bool
+
+(** [change p d] updates the descriptor of [p] to [d]. *)
+val change: 'a point -> 'a -> unit
diff --git a/bundles/menhirLib/menhir-20120123/src/unparameterizedPrinter.ml b/bundles/menhirLib/menhir-20120123/src/unparameterizedPrinter.ml
new file mode 100644 (file)
index 0000000..330f62f
--- /dev/null
@@ -0,0 +1,230 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+open Positions
+open Misc
+open Syntax
+open Stretch
+open UnparameterizedSyntax
+open Settings
+
+let print_preludes f g =
+  List.iter (fun prelude ->
+    Printf.fprintf f "%%{%s%%}\n" prelude.stretch_raw_content
+  ) g.preludes
+
+let print_start_symbols b g = 
+  StringSet.iter (fun symbol ->
+    Printf.fprintf b "%%start %s\n" (Misc.normalize symbol)
+  ) g.start_symbols
+    
+let rec insert_in_partitions item m = function
+  | [] -> 
+      [ (m, [ item ]) ]
+       
+  | (m', items) :: partitions when Mark.same m m' -> 
+      (m', item :: items) :: partitions
+       
+  | t :: partitions ->
+      t :: (insert_in_partitions item m partitions)
+     
+let insert (undefined, partitions) = function
+  | (item, UndefinedPrecedence) ->
+      ((item, 0) :: undefined, partitions)
+       
+  | (item, PrecedenceLevel (m, v, _, _)) ->
+      (undefined, insert_in_partitions (item, v) m partitions)
+
+let print_ocamltype ocamltype =
+  Printf.sprintf " <%s>" (
+    match ocamltype with
+    | Declared stretch ->
+       stretch.stretch_raw_content
+    | Inferred t ->
+       t
+    )
+
+let print_assoc = function
+  | LeftAssoc ->
+      Printf.sprintf "%%left"
+  | RightAssoc ->
+      Printf.sprintf "%%right"
+  | NonAssoc ->
+      Printf.sprintf "%%nonassoc"
+  | UndefinedAssoc ->
+      ""
+
+let print_tokens mode b g = 
+  (* Sort tokens wrt precedence. *)
+  let undefined, partition_tokens = 
+    StringMap.fold (fun token prop acu ->
+      insert acu (token, prop.tk_priority)
+    ) g.tokens ([], [])
+  in
+  let ordered_tokens =
+    List.fold_left (fun acu (_, ms) -> 
+      acu @ List.sort (fun (_, v) (_, v') -> compare v v') ms
+    ) undefined partition_tokens
+  in
+  List.iter (fun (token, _) ->
+    let prop = StringMap.find token g.tokens in
+    if prop.tk_is_declared then
+      Printf.fprintf b "%%token%s %s\n"
+       begin match mode with
+       | PrintNormal
+       | PrintUnitActions ->
+           Misc.o2s prop.tk_ocamltype print_ocamltype
+       | PrintUnitActionsUnitTokens ->
+           "" (* omitted ocamltype after %token means <unit> *)
+       end
+       token
+  ) ordered_tokens;
+
+  ignore (List.fold_left 
+           (fun last_prop (token, v) -> 
+              let prop = StringMap.find token g.tokens in 
+                match last_prop with
+
+                  | None ->
+                      if prop.tk_associativity = UndefinedAssoc then
+                        None
+                      else (
+                        Printf.fprintf b "%s %s "
+                          (print_assoc prop.tk_associativity) token;
+                        Some v)
+                        
+                  | Some v' when v <> v' -> 
+                      if prop.tk_associativity = UndefinedAssoc then
+                        None
+                      else (
+                        Printf.fprintf b "\n%s %s "
+                          (print_assoc prop.tk_associativity) token;
+                        Some v)
+                        
+                  | Some v' -> 
+                      Printf.fprintf b "%s " token;
+                      last_prop
+                        
+           ) None ordered_tokens);
+  Printf.fprintf b "\n"
+
+let print_types mode b g = 
+  StringMap.iter (fun symbol ty ->
+    Printf.fprintf b "%%type%s %s\n" 
+      begin match mode with
+      | PrintNormal ->
+         print_ocamltype ty
+      | PrintUnitActions
+      | PrintUnitActionsUnitTokens ->
+         " <unit>"
+      end
+      (Misc.normalize symbol)
+  ) g.types
+
+let binding mode id =
+  match mode with
+  | PrintNormal ->
+      id ^ " = "
+  | PrintUnitActions
+  | PrintUnitActionsUnitTokens ->
+      ""
+
+let string_of_producer mode (symbol, ido) =
+  Misc.o2s ido (binding mode) ^ (Misc.normalize symbol)
+
+let print_branch mode f branch = 
+  Printf.fprintf f "%s%s\n    {"
+    (String.concat " " (List.map (string_of_producer mode) branch.producers))
+    (Misc.o2s branch.branch_shift_precedence (fun x -> " %prec "^x.value));
+  begin match mode with
+  | PrintNormal ->
+      Action.print f branch.action  
+  | PrintUnitActions
+  | PrintUnitActionsUnitTokens ->
+      Printf.fprintf f "()"
+  end;
+  Printf.fprintf f "}\n"
+
+let print_trailers b g =
+  List.iter (Printf.fprintf b "%s\n") g.postludes
+
+let branches_order r r' = 
+  let branch_order b b' = 
+    match b.branch_reduce_precedence, b'.branch_reduce_precedence with
+      | UndefinedPrecedence, _ | _, UndefinedPrecedence ->
+         0
+      | PrecedenceLevel (m, l, _, _), PrecedenceLevel (m', l', _, _) ->
+         if Mark.same m m' then
+           if l < l' then
+             -1
+           else if l > l' then
+             1
+           else 
+             0
+         else 0
+  in
+  let rec lexical_order bs bs' = 
+    match bs, bs' with
+      | [], [] ->
+         0
+      | [], _ ->
+         -1
+      | _, [] ->
+         1
+      | b :: bs, b' :: bs' ->
+         match branch_order b b' with
+           | 0 -> 
+               lexical_order bs bs'
+           | x -> 
+               x
+  in
+    lexical_order r.branches r'.branches
+
+let print_rules mode b g = 
+  let rules_as_list =
+    StringMap.fold (fun nt r acu -> (nt, r) :: acu) g.rules []
+  in
+  let ordered_rules =
+    List.sort (fun (nt, r) (nt', r') -> branches_order r r') rules_as_list
+  in
+  List.iter (fun (nt, r) ->
+    Printf.fprintf b "\n%s:\n" (Misc.normalize nt);
+    List.iter (fun br -> 
+      Printf.fprintf b "| ";
+      print_branch mode b br
+    ) r.branches
+  ) ordered_rules
+
+let print mode f g =
+  begin match mode with
+  | PrintNormal ->
+      print_preludes f g
+  | PrintUnitActions
+  | PrintUnitActionsUnitTokens ->
+      ()
+  end;
+  print_start_symbols f g;
+  print_tokens mode f g;
+  print_types mode f g;
+  Printf.fprintf f "%%%%\n";
+  print_rules mode f g;
+  Printf.fprintf f "\n%%%%\n";
+  begin match mode with
+  | PrintNormal ->
+      print_trailers f g
+  | PrintUnitActions
+  | PrintUnitActionsUnitTokens ->
+      ()
+  end
+
diff --git a/bundles/menhirLib/menhir-20120123/src/unparameterizedPrinter.mli b/bundles/menhirLib/menhir-20120123/src/unparameterizedPrinter.mli
new file mode 100644 (file)
index 0000000..3a3de2b
--- /dev/null
@@ -0,0 +1,27 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* This is a pretty-printer for grammars. *)
+
+(* If the [mode] parameter requests ``unit actions'', then semantic actions
+   are dropped: that is, they are replaced with trivial semantic actions that
+   return unit. Accordingly, all [%type] declarations are changed to unit. The
+   prologue and epilogue are dropped. All bindings for semantic values are
+   suppressed.
+
+   If, furthermore, the [mode] parameter requests ``unit tokens'', then the
+   types carried by tokens are changed to unit. *)
+
+val print: Settings.print_mode -> out_channel -> UnparameterizedSyntax.grammar -> unit
+
diff --git a/bundles/menhirLib/menhir-20120123/src/unparameterizedSyntax.mli b/bundles/menhirLib/menhir-20120123/src/unparameterizedSyntax.mli
new file mode 100644 (file)
index 0000000..3e125c8
--- /dev/null
@@ -0,0 +1,59 @@
+(**************************************************************************)
+(*                                                                        *)
+(*  Menhir                                                                *)
+(*                                                                        *)
+(*  François Pottier, INRIA Rocquencourt                                  *)
+(*  Yann Régis-Gianas, PPS, Université Paris Diderot                      *)
+(*                                                                        *)
+(*  Copyright 2005-2008 Institut National de Recherche en Informatique    *)
+(*  et en Automatique. All rights reserved. This file is distributed      *)
+(*  under the terms of the Q Public License version 1.0, with the change  *)
+(*  described in file LICENSE.                                            *)
+(*                                                                        *)
+(**************************************************************************)
+
+(* A parameterized branch may instantiate parameterized non terminals. 
+   If the parameterized branch contributes to the definition of a 
+   parameterized terminal, then the instantiation of parameterized 
+   non terminals that are defined simultaneously must only be done with
+   formal parameters.
+   Furthermore, all the parameterized non terminals that are in a common
+   mutual recursive definition must have the same arity.
+   These conditions are sufficient to ensure termination of expansion.
+   For example:
+   C[x] : ...            // This definition does not involve A or B.
+   A[x,y] : B[x,y] C[Y]  // This mutual recursive definition is ok.
+   B[x,y] : A[x,y]
+   D[x] : E[D[x]]        // This one is incorrect.
+   E[y] : D[y]
+*)
+open Syntax
+
+type branch =
+    {
+      branch_position           : Positions.t;
+      producers                        : (symbol * identifier option) list; (* TEMPORARY convention renversée
+                                    par rapport Ã  syntax.mli; faire un type record au lieu d'une paire? *)
+      action                   : action;
+      branch_shift_precedence  : branch_shift_precedence;
+      branch_reduce_precedence  : branch_reduce_precedence
+    }
+
+type rule = 
+    {
+      branches            : branch list;
+      positions            : Positions.t list;
+      (* This flag is not relevant after the NonTerminalInlining.inline pass. *)
+      inline_flag          : bool;
+    }
+
+type grammar = 
+    {
+      preludes            : Stretch.t list;
+      postludes                   : Syntax.trailer list;
+      parameters           : Stretch.t list;
+      start_symbols        : StringSet.t;
+      types                : Stretch.ocamltype StringMap.t;
+      tokens              : Syntax.token_properties StringMap.t;
+      rules               : rule StringMap.t;
+    }
diff --git a/bundles/menhirLib/menhir-20120123/src/version.ml b/bundles/menhirLib/menhir-20120123/src/version.ml
new file mode 100644 (file)
index 0000000..fbb303e
--- /dev/null
@@ -0,0 +1 @@
+let version = "20120123"
index 88e8937..d797d7a 100644 (file)
@@ -5,30 +5,41 @@ ifneq ($(MAKECMDGOALS),distclean)
 include ../../Makefile.config
 endif
 
-SHARE_FLAGS=-shared -fpic
-OCAMLC_CMD=$(OCAMLC) -thread -ccopt "${PCRE_CFLAGS}" -cclib "${PCRE_LIBS}" -cc "${CC} ${CFLAGS} ${SHARE_FLAGS}"
-OCAMLOPT_CMD=$(OCAMLOPT) -thread -ccopt "${PCRE_CFLAGS}" -cclib "${PCRE_LIBS}"
-OCAMLMKLIB_CMD=$(OCAMLMKLIB)
+OCAMLCFLAGS ?= -g -dtypes
+OPTFLAGS ?= -g -dtypes
+
+# note: the extra linker flags are needed so that the produced shared
+# library gets dynamically linked to libpcre.
+EXTRACFLAGS=$(PCRE_CFLAGS:%=-ccopt %) $(PCRE_LIBS:%=-ccopt %)
+EXTRALNKFLAGS=$(PCRE_LIBS:%=-ldopt %)
+
+OCAMLC_CMD=$(OCAMLC) $(OCAMLCFLAGS) -thread $(EXTRACFLAGS) -cc "${CC} ${CFLAGS}"
+OCAMLOPT_CMD=$(OCAMLOPT) $(OPTFLAGS) -thread $(EXTRACFLAGS)
+OCAMLMKLIB_CMD=$(OCAMLMKLIB) $(EXTRALNKFLAGS)
 
 PCRE_VERSION=6.2.5
 PCRE_DIR=pcre-ocaml-release-$(PCRE_VERSION)
 PCRE_LIB=$(PCRE_DIR)/lib
 PCRE_MARKER=$(PCRE_DIR)/.marker
 
-all: depend pcre.cma META
-all.opt: depend pcre.cmxa META
+all: $(PCRE_MARKER)
+       @$(MAKE) all-build
+all-build: $(PCRE_MARKER) pcre.cma META
+all.opt: $(PCRE_MARKER)
+       @$(MAKE) all-opt-build
+all-opt-build: $(PCRE_MARKER) pcre.cmxa META
 
 clean:
        rm -f dllpcre_stubs.so libpcre_stubs.a pcre_stubs.o \
                pcre.cma pcre.cmi pcre.cmo META \
-               pcre.a pcre.cmx pcre.cmxa pcre.o
+               pcre.a pcre.cmx pcre.cmxa pcre.o pcre.annot
 
 distclean: clean
        rm -rf $(PCRE_DIR)
 
 depend: $(PCRE_MARKER)
 
-.PHONEY: all all.opt clean distclean depend
+.PHONEY: all all.opt clean distclean depend all-build all-opt-build
 
 # prepare the pcre directory
 $(PCRE_MARKER): $(PCRE_DIR).tar.gz
@@ -48,19 +59,21 @@ pcre.cmo: $(PCRE_LIB)/pcre.ml pcre.cmi
        $(OCAMLC_CMD) -c -o $@ $<
 
 pcre.cma: pcre.cmo dllpcre_stubs.so
-       $(OCAMLC_CMD) -a -custom -linkall -dllib -lpcre_stubs -o $@ $<
+       $(OCAMLC_CMD) -a -o $@ $<
 
 pcre.cmx: $(PCRE_LIB)/pcre.ml pcre.cmi
        $(OCAMLOPT_CMD) -c -o $@ $<
 
 pcre.cmxa: pcre.cmx dllpcre_stubs.so
-       $(OCAMLOPT_CMD) -a -cclib -lpcre_stubs -o pcre.cmxa $<
+       $(OCAMLOPT_CMD) -a -o pcre.cmxa $<
 
 pcre_stubs.o: $(PCRE_LIB)/pcre_stubs.c
-       $(OCAMLC_CMD) $<
+       $(OCAMLC_CMD) -ccopt -shared -ccopt -fPIC $<
 
 dllpcre_stubs.so: pcre_stubs.o
        $(OCAMLMKLIB_CMD) -o pcre_stubs $<
 
 META: $(PCRE_LIB)/META
        cp "${PCRE_LIB}/META" ./META
+
+include ../../Makefile.common
dissimilarity index 63%
index a5c9a51..0f4b876 100644 (file)
@@ -1,78 +1,83 @@
-ifneq ($(MAKECMDGOALS),distclean)
-include ../../Makefile.config
-endif
-
-PYCAMLFILE=pycaml_0.82.orig.tar.gz
-DEBIANFILE=pycaml_0.82-14.debian.tar.gz
-
-PYCAMLDIR=pycaml
-PYCAMLMARKER=$(PYCAMLDIR)/.marker
-DEBIANDIR=debian
-DEBIANMARKER=$(DEBIANDIR)/.marker
-
-SHARE_FLAGS=-shared -fpic
-OCAMLC_CMD=$(OCAMLC) -thread -ccopt "${PYTHON_CFLAGS}" -cclib "${PYTHON_LIBS}" -cc "${CC} ${CFLAGS} ${SHARE_FLAGS}" -I $(PYCAMLDIR)
-OCAMLOPT_CMD=$(OCAMLOPT) -thread -ccopt "${PYTHON_CFLAGS}" -cclib "${PYTHON_LIBS}" -I $(PYCAMLDIR)
-OCAMLMKLIB_CMD=$(OCAMLMKLIB)
-
-
-all: depend pycaml.cmi pycaml.cma
-
-$(PYCAMLDIR)/pycaml.mli: $(PYCAMLDIR)/pycaml.ml
-       $(OCAMLC_CMD) -i $< > $(PYCAMLDIR)/pycaml.mli
-
-$(PYCAMLDIR)/pycaml.cmo: $(PYCAMLDIR)/pycaml.ml $(PYCAMLDIR)/pycaml.cmi
-       $(OCAMLC_CMD) -c $< -o $@
-
-$(PYCAMLDIR)/pycaml.cmi: $(PYCAMLDIR)/pycaml.mli
-       $(OCAMLC_CMD) -c $< -o $@
-
-# local copy of the interface
-pycaml.cmi: $(PYCAMLDIR)/pycaml.cmi
-       cp $< $@
-
-pycaml_ml.o: $(PYCAMLDIR)/pycaml_ml.c
-       $(OCAMLC_CMD) $< -o $@
-
-dllpycaml_stubs.so: pycaml_ml.o
-       $(OCAMLMKLIB_CMD) -o pycaml_stubs $<
-
-pycaml.cma: dllpycaml_stubs.so pycaml.cmi $(PYCAMLDIR)/pycaml.cmo
-       $(OCAMLC_CMD) -a -custom -linkall -o pycaml.cma pycaml.cmo -dllib -lpycaml_stubs
-
-all.opt: depend pycaml.cmi pycaml.cmxa
-
-$(PYCAMLDIR)/pycaml.cmx: $(PYCAMLDIR)/pycaml.ml $(PYCAMLDIR)/pycaml.cmi
-       $(OCAMLOPT_CMD) -c $<
-
-pycaml.cmxa: dllpycaml_stubs.so $(PYCAMLDIR)/pycaml.cmx
-       $(OCAMLOPT_CMD) -a -o pycaml.cmxa pycaml.cmx -cclib -lpycaml_stubs
-
-clean:
-       rm -f $(PYCAMLDIR)/pycaml.mli pycaml.cm[aixo] $(PYCAMLDIR)/pycaml.cm[aixo] \
-               pycaml.[ao] libpycaml_stubs.a dllpycaml_stubs.o dllpycaml_stubs.so \
-               pycaml_ml.o pycaml.cmxa
-
-distclean: clean
-       rm -rf $(PYCAMLDIR) $(DEBIANDIR)
-
-
-# construct the directories
-depend: $(PYCAMLMARKER) $(DEBIANMARKER)
-
-$(PYCAMLMARKER): $(PYCAMLFILE) $(DEBIANMARKER)
-       $(TAR) xfvz $<
-       set -e; for PATCH in $(shell cat debian/patches/series); do $(PATCH) -d "${PYCAMLDIR}" -p1 < "./debian/patches/$${PATCH}"; done
-       touch $@
-
-$(PYCAMLFILE):
-       @echo "$@ not found. Please download it and drop it in this directory ($(pwd))."
-       @false
-
-$(DEBIANMARKER): $(DEBIANFILE)
-       $(TAR) xfvz $<
-       touch $@
-
-$(DEBIANFILE):
-       @echo "$@ not found. Please download it and drop it in this directory ($(pwd))."
-       @false
+ifneq ($(MAKECMDGOALS),distclean)
+include ../../Makefile.config
+endif
+
+OCAMLCFLAGS ?= -g -dtypes
+OPTFLAGS ?= -g -dtypes
+
+PYCAMLDIR=chemoelectric-pycaml-8614105
+PYCAMLFILE=$(PYCAMLDIR).tar.gz
+PYCAMLMARKER=$(PYCAMLDIR)/.marker
+
+# note: the extra linker flags are needed so that the produced shared
+# library gets linked against libpython.
+EXTRACFLAGS=$(PYTHON_CFLAGS:%=-ccopt %) $(PYTHON_LIBS:%=-cclib %)
+EXTRALNKFLAGS=$(PYTHON_LIBS:%=-ldopt %)
+
+export PYMAJOR=$(shell echo ${PYTHON_VERSION} | sed -e 's/\..*//')
+OCAMLFLAGS = -pp "camlp4o -parser Camlp4MacroParser -D PYMAJOR${PYMAJOR}"
+OCAMLC_CMD=$(OCAMLC) $(OCAMLCFLAGS) $(OCAMLFLAGS) -g -thread $(EXTRACFLAGS) -cc "${CC} ${CFLAGS}" -I $(PYCAMLDIR)
+OCAMLOPT_CMD=$(OCAMLOPT) $(OPTFLAGS) $(OCAMLFLAGS) -g -thread $(EXTRACFLAGS)  -I $(PYCAMLDIR)
+OCAMLMKLIB_CMD=$(OCAMLMKLIB) -linkall $(EXTRALNKFLAGS)
+OCAMLDEP_CMD=$(OCAMLDEP) $(OCAMLFLAGS)
+
+
+all: $(PYCAMLMARKER)
+       @$(MAKE) all-build
+all-build: $(PYCAMLMARKER) pycaml.cmi pycaml.cma
+
+$(PYCAMLDIR)/pycaml.mli: $(PYCAMLDIR)/pycaml.ml
+       $(OCAMLC_CMD) -i $< > $(PYCAMLDIR)/pycaml.mli
+
+$(PYCAMLDIR)/pycaml.cmo: $(PYCAMLDIR)/pycaml.ml $(PYCAMLDIR)/pycaml.cmi
+       $(OCAMLC_CMD) -c $< -o $@
+
+$(PYCAMLDIR)/pycaml.cmi: $(PYCAMLDIR)/pycaml.mli
+       $(OCAMLC_CMD) -c $< -o $@
+
+# the cmi file apparently needs to be present next to the cma file
+pycaml.cmi: $(PYCAMLDIR)/pycaml.cmi
+       cp -f $< $@
+
+pycaml_stubs.o: $(PYCAMLDIR)/pycaml_stubs.c
+       $(OCAMLC_CMD) -ccopt -shared -ccopt -fPIC $< -o $@
+
+dllpycaml_stubs.so: pycaml_stubs.o
+       $(OCAMLMKLIB_CMD) -o pycaml_stubs $<
+
+pycaml.cma: $(PYCAMLDIR)/pycaml.cmo $(PYCAMLDIR)/pycaml.cmi dllpycaml_stubs.so
+       $(OCAMLC_CMD) -I $(PYCAMLDIR) -a -o pycaml.cma $<
+
+all.opt: $(PYCAMLMARKER)
+       @$(MAKE) all-opt-build
+all-opt-build: $(PYCAMLMARKER) pycaml.cmi pycaml.cmxa
+
+$(PYCAMLDIR)/pycaml.cmx: $(PYCAMLDIR)/pycaml.ml $(PYCAMLDIR)/pycaml.cmi
+       $(OCAMLOPT_CMD) -c $<
+
+pycaml.cmxa: $(PYCAMLDIR)/pycaml.cmx $(PYCAMLDIR)/pycaml.cmi dllpycaml_stubs.so
+       $(OCAMLOPT_CMD) -I $(PYCAMLDIR) -a -o pycaml.cmxa $<
+
+clean:
+       rm -f $(PYCAMLDIR)/pycaml.mli pycaml.cm[aixo] $(PYCAMLDIR)/pycaml.cm[aixo] \
+               pycaml.[ao] libpycaml_stubs.a pycaml_stubs.o dllpycaml_stubs.so libpycaml_stubs.so \
+               pycaml_ml.o pycaml.cmxa $(PYCAMLDIR)/pycaml.annot
+
+distclean: clean
+       rm -rf $(PYCAMLDIR)
+
+.PHONEY: all all.opt all-build all-opt-build distclean clean depend
+
+# construct the directories
+depend: $(PYCAMLMARKER)
+
+$(PYCAMLMARKER): $(PYCAMLFILE)
+       $(TAR) xfvz $<
+       $(PATCH) -d "${PYCAMLDIR}" -p1 < ./python3-compat-fix.patch
+       touch $@
+
+$(PYCAMLFILE):
+       @echo "$@ not found. Please download it and drop it in this directory ($(pwd))."
+       @false
+
+include ../../Makefile.common
similarity index 86%
copy from bundles/pycaml/Makefile
copy to bundles/pycaml/Makefile.debian
index a5c9a51..4524651 100644 (file)
@@ -1,3 +1,17 @@
+# !! This Makefile is OUTDATED
+# It shows how to incorporate
+# Debian's pycaml source package
+# into coccinelle. Howver, at the
+# time of writing, that source
+# package does not work for new
+# python versions. Hence, we switched
+# to another version.
+#
+# If in the future the pycaml
+# package in Debian is upgraded,
+# it may be worth switching to it
+# again.
+
 ifneq ($(MAKECMDGOALS),distclean)
 include ../../Makefile.config
 endif
diff --git a/bundles/pycaml/chemoelectric-pycaml-8614105.tar.gz b/bundles/pycaml/chemoelectric-pycaml-8614105.tar.gz
new file mode 100644 (file)
index 0000000..d050b48
Binary files /dev/null and b/bundles/pycaml/chemoelectric-pycaml-8614105.tar.gz differ
diff --git a/bundles/pycaml/chemoelectric-pycaml-8614105/.marker b/bundles/pycaml/chemoelectric-pycaml-8614105/.marker
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/bundles/pycaml/chemoelectric-pycaml-8614105/COPYING b/bundles/pycaml/chemoelectric-pycaml-8614105/COPYING
new file mode 100644 (file)
index 0000000..b1e3f5a
--- /dev/null
@@ -0,0 +1,504 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE
+                      Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+                           Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+  When we speak of free software, we are referring to freedom of use,
+not price.  Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+  To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+\f
+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
+
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+\f
+                 GNU LESSER GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+  
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+\f
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+\f
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+\f
+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+\f
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+\f
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+\f
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+                           NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+                    END OF TERMS AND CONDITIONS
+\f
+           How to Apply These Terms to Your New Libraries
+
+  If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change.  You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+  To apply these terms, attach the following notices to the library.  It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the library's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+  <signature of Ty Coon>, 1 April 1990
+  Ty Coon, President of Vice
+
+That's all there is to it!
+
+
diff --git a/bundles/pycaml/chemoelectric-pycaml-8614105/META.in b/bundles/pycaml/chemoelectric-pycaml-8614105/META.in
new file mode 100644 (file)
index 0000000..ddc4336
--- /dev/null
@@ -0,0 +1,9 @@
+# Specifications for the "pycaml" library:
+requires = "unix str"
+description = "Python - OCaml interface"
+version = "0.1"
+browse_interfaces = " Pycaml@PYVER_PACK@ "
+archive(byte) = "pycaml@PYVER_PACK@.cma"
+archive(native) = "pycaml@PYVER_PACK@.cmxa"
+#linkopts=""
+
diff --git a/bundles/pycaml/chemoelectric-pycaml-8614105/Makefile b/bundles/pycaml/chemoelectric-pycaml-8614105/Makefile
new file mode 100644 (file)
index 0000000..4bbb86c
--- /dev/null
@@ -0,0 +1,32 @@
+OCAMLMAKEFILE = /usr/include/OCamlMakefile
+
+PYTHON_INCLUDE_PATH = "/usr/include/python${PYVER}"
+PYTHON_LIBRARY_PATH = "/usr/$(get_libdir)/python${PYVER}"
+
+CLIBS   = $(PYCAML_CLIBS) "pthread" "dl" $(UTIL_CLIBS) "m" "c"
+PACKS   = unix str
+SOURCES = pycaml.ml pycaml.mli pycaml_stubs.c
+RESULT  = pycaml${PYVER_PACK}
+THREADS = yes
+LDFLAGS = -lpython${PYVER}
+CFLAGS  = -g -O2 -fPIC -Wall
+OCAMLFLAGS = -pp "camlp4o -parser Camlp4MacroParser -D PYMAJOR`echo ${PYVER} | sed -e 's/\\..*//'`"
+OCAMLDEP = ocamldep ${OCAMLFLAGS}
+
+INCDIRS=$(PYTHON_INCLUDE_PATH)
+LIBDIRS=$(PYTHON_LIBRARY_PATH)
+
+all: pycaml_stubs.h native-code-library byte-code-library META
+
+META: META.in
+       sed -e "s/@PYVER_PACK@/${PYVER_PACK}/g" < META.in > META
+
+mrproper: clean
+       rm -rf *~ *.cmi *.cmo *.a *.cma *.cmxa doc *.so deps
+
+deps: META.in pycaml.ml pycaml.mli pycaml_stubs.c pycaml_stubs.h
+       touch deps
+
+.PHONY: mrproper
+
+include $(OCAMLMAKEFILE)
diff --git a/bundles/pycaml/chemoelectric-pycaml-8614105/README b/bundles/pycaml/chemoelectric-pycaml-8614105/README
new file mode 100644 (file)
index 0000000..7ffafa9
--- /dev/null
@@ -0,0 +1,26 @@
+Bindings for Python and Objective Caml.
+Not thread-safe.
+
+Based on the work of:
+  * Art Yerkes: http://pycaml.sourceforge.net/
+  * Dr. Thomas Fischbacher and Dr. Hans Fangohr:
+       http://nmag.soton.ac.uk/tf/pycaml.html
+
+Doctors Fischbacher and Fangohr included the following acknowledgment:
+"This work has been supported by the EPSRC Grant GR/T09156/01 (UK)."
+(http://www.epsrc.ac.uk/)
+
+This version has been modified primarily for use with Kompostilo
+Typesetter: http://kompostilo.googlecode.com
+
+The author, Barry Schwartz, is disabled and so unable to provide much
+support. He encourages people to fork off their own versions and have
+a lot of fun. :)
+
+Distributed under the GNU Lesser General Public License, version 2.1.
+
+To build, use something like:
+
+  make PYVER=2.6
+
+An ebuild is included for the benefit of Gentoo users.
diff --git a/bundles/pycaml/chemoelectric-pycaml-8614105/examples/floatproduct.ml b/bundles/pycaml/chemoelectric-pycaml-8614105/examples/floatproduct.ml
new file mode 100644 (file)
index 0000000..93bd6c4
--- /dev/null
@@ -0,0 +1,25 @@
+#use "topfind";;
+#require "pycaml";;
+
+open Pycaml;;
+
+
+let _py_float_product =
+  python_pre_interfaced_function
+    ~doc:"Compute the Product of two floatingpoint numbers in OCaml"
+    [|FloatType;FloatType|]
+    (fun py_args ->
+       let x = pyfloat_asdouble py_args.(0)
+       and y = pyfloat_asdouble py_args.(1)
+       in pyfloat_fromdouble ( x*.y))
+in
+  register_pre_functions_for_python
+    [|("floatproduct", _py_float_product) |]
+;;
+
+Printf.printf "within python, try for example 'ocaml.floatproduct(3.0,4.0)'\n%!";;
+
+ipython();; 
+
+
+
diff --git a/bundles/pycaml/chemoelectric-pycaml-8614105/examples/log.ml b/bundles/pycaml/chemoelectric-pycaml-8614105/examples/log.ml
new file mode 100644 (file)
index 0000000..6916208
--- /dev/null
@@ -0,0 +1,161 @@
+#use "topfind";;
+#require "pycaml";;
+#require "snippets";;
+
+open Pycaml;;
+
+(* See http://docs.python.org/lib/module-logging.html for Level values *)
+type logging_levels = Notset | Debug | Info | Warn | Error | Critical | Level of int;;
+
+(* Set default logger *)
+let default_logger = (fun l m -> Printf.printf "ocaml-default log: %d %s%!\n%!" l m);;
+
+let loggers = Hashtbl.create 10;;
+Hashtbl.add loggers "default-ocaml" default_logger;;
+
+(* Translate level names into numerical values as used by Python 
+   See http://docs.python.org/lib/module-logging.html for Level values *)
+let int_of_level name =
+  match name with
+    | Notset   -> 0
+    | Debug    -> 10
+    | Info     -> 20 
+    | Warn     -> 30
+    | Error    -> 40
+    | Critical -> 50
+    | Level (n)-> n
+;;
+
+let find_logger name =
+  try
+    Hashtbl.find loggers name
+  with
+    | Not_found -> 
+       try 
+         Hashtbl.find loggers "default-ocaml"
+       with 
+         | Not_found -> failwith "Default logger missing -- internal problem";;
+
+
+(* Provide interface functions as in Python's logging module *)
+let debug name msg =
+  let log = find_logger name in
+    log (int_of_level Debug) msg;;
+
+let info name msg =
+  let log = find_logger name in
+    log (int_of_level Info) msg;;
+
+let warn name msg =
+  let log = find_logger name in
+    log (int_of_level Warn) msg;;
+
+let warning = warn;;
+
+let error name msg =
+  let log = find_logger name in
+    log (int_of_level Error) msg;;
+
+let critical name msg =
+  let log = find_logger name  in
+    log (int_of_level Critical) msg;;
+
+(* Function that takes a name, level integer (this is 'raw') and the message *)
+let lograw name level msg =
+  let logf = find_logger name in
+    logf level msg;;
+
+(* Function that takes a name, level and the message.
+   Presumably, this is what will be used most often. *)
+let log name level msg =
+  let lograw = find_logger name in
+    lograw (int_of_level level) msg;;
+
+
+(* Allowing to register loggers from Python *)
+
+let add_logger_if_new name logger = 
+  let loggername = 
+    try
+      let _ = Str.search_forward (Str.regexp "ocaml") name 0 in
+       name
+    with 
+      | Not_found -> Printf.sprintf "%s-ocaml" name
+  in
+  try
+    let _ = Hashtbl.find loggers loggername
+    in failwith (Printf.sprintf "Trying to register logger '%s' again. Why?" loggername)
+  with
+    | Not_found -> Printf.printf "Adding logger %s to hashtable\n%!" loggername;
+       Hashtbl.add loggers loggername logger;;
+
+let _py_register_logger =
+  python_pre_interfaced_function
+    ~doc:"Register a python-logger. \nArguments: Logger name (str) and callback function cb(). \nThe signature of cb() is cb( level: int, message:str). "
+    [|StringType;CallableType|]
+    (fun py_args ->
+       let name = pystring_asstring py_args.(0) in
+       let ocamllogger = (fun level msg -> 
+                           let callback_args =
+                             pytuple_fromarray
+                               [|pyint_fromint level;
+                                 pystring_fromstring msg|]
+                           in
+                           let _ = pyeval_callobject(py_args.(1),callback_args) in ()
+                        )
+       in let () = add_logger_if_new name ocamllogger 
+     in pynone() );;
+
+
+
+
+
+(* Debugging tools: *)
+
+(* getinfo returns an array of strings that contain the names of registered loggers. *)
+let getinfo loggers =
+    let loggerarray = Array.make (Hashtbl.length loggers) "empty" in
+    let () = Snippets.hashtbl_iteri (fun i key value -> (loggerarray.(i) <- key)) loggers in
+    loggerarray;;
+
+let print_loggers loggers = 
+  Array.iter (fun a -> Printf.printf "registered loggername=%s\n%!" a)  (getinfo loggers);;
+      
+let _py_ocaml_log  =
+  python_pre_interfaced_function
+    ~doc: "Function that calls the ocaml logger from Python (just for debugging useful) "
+    [|StringType;IntType;StringType|] ( fun py_args -> 
+                                         let name = pystring_asstring py_args.(0) in
+                                         let level = pyint_asint py_args.(1) in
+                                         let msg = pystring_asstring py_args.(2) in
+                                         let () =  lograw name level msg in
+                                           pynone() );;
+
+(* Register function for Python *)
+
+let () = register_pre_functions_for_python
+  [|  ("log", _py_ocaml_log);
+      ("register_logger", _py_register_logger) |]
+;;
+
+
+
+(* This needs to go into the documentation *)
+
+Printf.printf "About to start tests (Ocaml)\n";;
+
+let () = add_logger_if_new "Ocaml" (fun l m -> Printf.printf "Ocamllog, Lev=%d: %s\n" l m);  
+
+python_load "log.py";; 
+
+log "default" (Level 30) "Purely called from Ocaml";;
+
+info "ocaml" "This is information";;
+
+print_loggers loggers;;
+
+python_eval "logger.warn('Warning from Python')";; 
+
+let nmeshlog = log 
+(* ipython();; *)
+
diff --git a/bundles/pycaml/chemoelectric-pycaml-8614105/examples/log.py b/bundles/pycaml/chemoelectric-pycaml-8614105/examples/log.py
new file mode 100644 (file)
index 0000000..de92547
--- /dev/null
@@ -0,0 +1,48 @@
+
+#standard Python code
+import logging,sys
+print "(In Python code: log.py)"
+
+formatter = logging.Formatter('%(name)s :%(asctime)s %(filename)s %(lineno)s %(levelname)s  %(message)s')
+stdout_handler = logging.StreamHandler(sys.stdout)
+stdout_handler.setFormatter(formatter)
+logger=logging.getLogger('')
+logger.addHandler(stdout_handler)
+logger.setLevel(logging.DEBUG)
+
+def create_ocamllog( logger):
+    def ocamllog(level,msg):
+        """logging module will try to walk up the python stack (using sys._getframe) to
+        find details about the layer that called the logging module.
+        This fails for ocaml as there is no such information.
+        One can get around this by setting logging._srcfile to none (temporarily).
+        See /usr/lib/python2.3/logging/__init__.py
+
+        A hack (not thread safe I suppose). fangohr 3/9/2006"""
+        logging._srcfile_org = logging._srcfile
+        logging._srcfile = None
+        logger.log(level,msg)
+        logging._srcfile = logging._srcfile_org
+    return ocamllog
+    
+#now register logger with ocaml
+logger=logging.getLogger('nmesh-ocaml')
+ocaml.register_logger('nmesh',create_ocamllog(logger))
+logger=logging.getLogger('nfem-ocaml')
+ocaml.register_logger('nfem',create_ocamllog(logger))
+logger=logging.getLogger('root-ocaml')
+ocaml.register_logger('root',create_ocamllog(logger))
+
+
+ocaml.log("ocaml",30,'Message from ocaml logger sent from Python with level 30')
+
+#now call this logger from ocaml(!)
+if 1 == 1:
+
+    ocaml.log("ocaml",30,'Message from ocaml with level 30')
+    logger.setLevel(35)
+    ocaml.log("default",30,'Message from ocaml with level 30')
+    ocaml.log("default",40,'Message from ocaml with level 40')
+
+print "Done (python)"
+
diff --git a/bundles/pycaml/chemoelectric-pycaml-8614105/examples/ocamlpill.ml b/bundles/pycaml/chemoelectric-pycaml-8614105/examples/ocamlpill.ml
new file mode 100644 (file)
index 0000000..492269c
--- /dev/null
@@ -0,0 +1,155 @@
+(*
+
+The OCamlPill: how to pass data from OCaml to Python and give it back to OCaml. 
+
+Motivation (or What is this OCamlPill good for?):
+
+For example, a simulation data structure (such as the finite element
+mesh) could be set up in OCaml (because this is fast). We may then
+want to be able to control the simulation from Python, and we would
+need to pass this populated mesh data structure to another OCaml
+module that solves an equation on that mesh.
+
+This is exacly the situation where we wrap up that data structure
+(with in OCaml) into -- what is called -- an "OCamlPill". This
+essentially means that to Python it is a "pill" with unknown content
+where as OCaml can unwrap it and use the content if the pill is given
+back to it.
+
+Here are some simple examples to demonstrate this.
+
+
+*)
+
+
+(* load the pycaml module *)
+#use "topfind";;
+#require "pycaml";;
+
+(* and bring it into the current name space *)
+open Pycaml;;
+
+(* Register the 'type' of the OCaml pill we will use. For simplicity,
+we just call it example. However, we assign this to a variable
+'pysym_example' so that we can change the actual string later. *)
+let pysym_type = "example";;
+register_ocamlpill_types [|pysym_type|];;
+
+(* We also need an 'example' datum to teach the wrapping and
+unwrapping function about the type of our OCaml pill. *) 
+let ocamlpill_sample_example = [|1;2;3;4|];;
+
+(* Now generate a wrapper and unwrapper *)
+let (ocamlpill_from_content, content_from_ocamlpill) =
+  make_ocamlpill_wrapper_unwrapper pysym_type ocamlpill_sample_example;;
+
+
+
+(* Now we write the function that creates the data structure and gives it to Python as a OCamlPill:*)
+let _py_create_pill =
+  python_pre_interfaced_function 
+    ~doc:"Create my pill in OCaml and retrieve it from OCaml (to Python).\nFunction takes three integers."
+    [|IntType;IntType;IntType|]
+    (fun py_args ->
+      let x = pyint_asint py_args.(0) in
+      let y = pyint_asint py_args.(1) in 
+      let z = pyint_asint py_args.(2) in
+      let my_data_structure = [|x;y;z;99|]
+      in ocamlpill_from_content my_data_structure)
+(* and register this function for Python (so it appears in the OCaml-module in Python) *)
+in
+  register_pre_functions_for_python
+  [|("create_pill",_py_create_pill)|]
+;;
+
+(* Note: in Python, you can now create an OCamlpill using:
+
+>>>a=ocaml.create_pill(1,3,4)
+
+And then check its type using:
+>>>print ocaml.sys_ocamlpill_type(a) 
+
+*)
+
+
+(* The next part of this example shows how to use this OCamlPill
+again, i.e. we would like to be able to issue a command such as
+>>>result=ocaml.do_stuff(a)
+in Python, and we would like to write the content of the 'do_stuff'
+function in OCaml.
+*)
+
+(* We write the code that does the work, i.e. which can be called
+from Python with an OCamlpill as an argument. This function can work
+with the content of the pill, and has to return a Python Object (which
+here is just an int). *)
+let _py_do_stuff_with_pill =
+  python_pre_interfaced_function
+    ~doc:"Takes an ocaml pill of type 'example' and returns the first integer in that pill"
+    [|CamlpillType|]
+    (fun py_args -> 
+      let a = content_from_ocamlpill py_args.(0) in
+       pyint_fromint a.(0)        (* This is 'do_stuff' *)
+    )
+  
+in register_pre_functions_for_python [|"do_stuff",_py_do_stuff_with_pill|];; 
+
+
+(* At this point we could start Python (using "python();;"). However,
+we add another example below before we do this.
+
+The function defined above, could be used (from Python) as follows:
+
+First create an ocampill using:
+
+>>>A=Ocaml.Create_pill(1,3,4)
+
+And then check its type using:
+>>>print ocaml.sys_ocamlpill_type(a) 
+
+Finally, to feedback the 'pill' to OCaml, do something with it in OCaml, and 
+return a new Python object (here the first integer of the three), do this:
+>>>result=ocaml.do_stuff(a)
+
+The integer variable results should contain the first integer stored in the Ocaml Array.
+
+*)
+
+
+(* What now follows is a slighly more complicated example, where we pass 
+   an ocampill from Python to Ocaml AND another parameter (in this case
+   an integer).
+*)
+
+(* This function just computes the sum of a given integer array. *)
+let compute_sum data = Array.fold_left (fun a b -> a+b) 0 data;;
+
+(* Now we write the code that does the work, i.e. which can be called
+from Python with an OCamlpill as the first argument and an extra
+integer to be added to the sum as the second. As before, we return a
+Python Int object. *)
+
+let _py_do_stuff_with_pill2 = python_pre_interfaced_function
+    ~doc:"Takes an ocaml pill and an int, and returns the sum of all ints in the pill and the new int"
+    [|CamlpillType;IntType|]
+    (fun py_args -> 
+      let a = content_from_ocamlpill py_args.(0) in
+      let b = pyint_asint py_args.(1) in
+      let c = (compute_sum a) + b in
+       pyint_fromint c
+    )
+in register_pre_functions_for_python [|"compute_sum_offset",_py_do_stuff_with_pill2|];;
+
+(* This can be used in Python as follows:
+
+>>>a=ocaml.create_pill(1,3,4)
+>>>b=ocaml.compute_sum_offset(a,10)
+
+b should contain the sum of 1, 3, 4, 99 and 10.
+
+*)
+
+
+
+(* Finally, we call Python *)
+ipython()
diff --git a/bundles/pycaml/chemoelectric-pycaml-8614105/gentoo-support/pycaml-9999.ebuild b/bundles/pycaml/chemoelectric-pycaml-8614105/gentoo-support/pycaml-9999.ebuild
new file mode 100644 (file)
index 0000000..7e32d79
--- /dev/null
@@ -0,0 +1,87 @@
+# Copyright 1999-2008 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header$
+
+EAPI="2"
+SUPPORT_PYTHON_ABIS="1"
+
+inherit findlib python eutils git
+
+IUSE=""
+
+DESCRIPTION="Bindings for Python and OCaml"
+HOMEPAGE="http://github.com/chemoelectric/pycaml"
+SRC_URI=""
+EGIT_REPO_URI="git://github.com/chemoelectric/pycaml.git"
+
+LICENSE="LGPL-2.1"
+SLOT="0"
+KEYWORDS="~amd64 ppc x86"
+
+RDEPEND=">=dev-ml/ocaml-make-6.29.3"
+DEPEND=">=dev-lang/ocaml-3.11.1
+        >=dev-lang/python-2.6.4
+        ${RDEPEND}"
+
+S="${WORKDIR}/${PN}"
+
+
+pkg_setup() {
+       if ! built_with_use --missing true dev-lang/ocaml ocamlopt; then
+               eerror "${PN} needs to be built with native code support from ocaml"
+               eerror "You first need to have a native code ocaml compiler."
+               eerror "You need to install dev-lang/ocaml with ocamlopt useflag on."
+               die "Please install ocaml with ocamlopt useflag"
+       fi
+}
+
+src_compile() {
+       compile_abi_pycaml() {
+               abi=`echo "${PYTHON_ABI}" | sed -e 's/\./_/g'`
+               name="${PN}${abi}"
+               cd "${WORKDIR}"
+               cp -r "${PN}" "${name}"
+               cd "${name}"
+               emake -j1 PYVER="${PYTHON_ABI}" PYVER_PACK="${abi}" \
+                     get_libdir="$(get_libdir)" || die "emake failed"
+       }
+       python_execute_function compile_abi_pycaml
+
+       compile_pycaml() {
+               cd "${S}"
+               emake -j1 PYVER="${PYVER}" PYVER_PACK="" \
+                     get_libdir="$(get_libdir)" || die "emake failed"
+       }
+       python_version
+       compile_pycaml
+}
+
+src_install() {
+       python_need_rebuild
+
+       # Use findlib to install properly, especially to avoid
+       # the shared library mess
+       findlib_src_preinst
+
+       install_abi_pycaml() {
+               abi=`echo "${PYTHON_ABI}" | sed -e 's/\./_/g'`
+               name="${PN}${abi}"
+               cd "${WORKDIR}/${name}"
+               ocamlfind install "${name}" \
+                         dllpycaml"${abi}"_stubs.so* libpycaml"${abi}"_stubs.a \
+                         pycaml"${abi}".a  pycaml"${abi}".cma pycaml"${abi}".cmxa \
+                         pycaml.cmi pycaml.cmo pycaml.cmx pycaml.ml pycaml.mli \
+                         pycaml.o pycaml_stubs.c pycaml_stubs.h pycaml_stubs.o META
+       }
+       python_execute_function install_abi_pycaml
+
+       install_pycaml() {
+               cd "${S}"
+               ocamlfind install "${PN}" \
+                         dllpycaml_stubs.so* libpycaml_stubs.a pycaml.a pycaml.cma \
+                         pycaml.cmi pycaml.cmo pycaml.cmx pycaml.cmxa pycaml.ml pycaml.mli \
+                         pycaml.o pycaml_stubs.c pycaml_stubs.h pycaml_stubs.o META
+       }
+       python_version
+       install_pycaml
+}
diff --git a/bundles/pycaml/chemoelectric-pycaml-8614105/old-doc/pycaml.html b/bundles/pycaml/chemoelectric-pycaml-8614105/old-doc/pycaml.html
new file mode 100644 (file)
index 0000000..7330860
--- /dev/null
@@ -0,0 +1,315 @@
+<html>
+<head>
+<title>Module Pycaml</title>
+</head>
+<body>
+<table border=0 width="100%"><tr><td bgcolor="#c0c0c0">
+<h1>Pycaml</h1>
+</td></tr></table>
+<p>
+<h2>What is Pycaml</h2>
+A library written by <a href=mailto:arty@users.sourceforge.net>
+arty@users.sourceforge.net</a> which follows the Python/C API as
+closely as possible, while
+providing equivalent functionality for objective caml.  This is built
+against python 2.x and Ocaml 3.04.<p>  It is intended to allow users to
+build native ocaml libraries and use them from python, and alternately,
+in order to allow ocaml users to benefit from linkable libraries provided
+for python.<p>
+I created this library in order to take advantage of python binding for
+certain native libraries from ocaml.  While it is true that I could have
+written new interfaces specifically for ocaml, the python interface is
+sufficient for my needs, and this project was easier.<p>
+
+Please edit the <tt>Makefile</tt> to put in your system's libraries used for
+compiling programs embedded with python.  This library compiles on most
+linux boxes without modification.  The python interpreter is used to determine
+the path to the python library and must be in your path when you run make.
+<p>
+
+<b>Get the distribution here:</b><a href=pycaml.tar.gz>pycaml.tar.gz</a><p>
+
+Because these are made to closely mirror the python API, the user should
+become familiar with the python API.<p>
+Given Ocaml parameter passing convention, it was convenient to pass multiple
+arguments as members of a tuple, but single arguments without.  Consequently,
+functions with arity 1, such as pytuple_new are called as<p>
+<pre>
+  pytuple_new 3 ;;
+</pre><p>
+And functions with more arguments are called as<p>
+<pre>
+  pydict_getitemstring (dict,"keystring") ;;
+</pre>
+
+<h2>Module Pycaml</h2>
+
+<h3>Visible Types</h3>
+
+<table border=0>
+<tr bgcolor="#c0c0c0"><td>type</td><td width="100%">pyobject</td></tr>
+<tr><td colspan=2>
+The abstract type of python objects.
+</td></tr>
+<tr bgcolor="#c0c0c0"><td>type</td><td>pyobject_type =</td></tr>
+<tr><td align=right></td><td>TupleType</td></tr>
+<tr><td align=right>|</td><td>StringType</td></tr>
+<tr><td align=right>|</td><td>IntType</td></tr>
+<tr><td align=right>|</td><td>FloatType</td></tr>
+<tr><td align=right>|</td><td>ListType</td></tr>
+<tr><td align=right>|</td><td>NoneType</td></tr>
+<tr><td align=right>|</td><td>CallableType</td></tr>
+<tr><td align=right>|</td><td>ModuleType</td></tr>
+<tr><td align=right>|</td><td>ClassType</td></tr>
+<tr><td align=right>|</td><td>TypeType</td></tr>
+<tr><td align=right>|</td><td>OtherType</td></tr>
+<tr><td colspan=2>
+The type representing the range of types available to python programs.
+Values of this type are provided by the pytype function, and identify the
+python type of opaque pyobject objects.
+</td></tr></table>
+
+<h3>Supported Functions from the Python/C API</h3>
+In each case, the signature of the function is unchanged from the Python/C
+API except for the case of 'out' pointer to pointer parameters; 
+in the case of a single return, the returned value is copied, otherwise, 
+a tuple is created with copies of all output parameters.  In the case of
+zero parameter, or void return, unit is used.<p>
+In python API functions that take a FILE *, an int file descriptor is used
+instead such as those returned by the Unix library.<p>
+
+<h4>fun unit -> unit</h4>
+py_initialize, py_finalize, pyerr_print, pyerr_clear, pyimport_cleanup
+<h4>fun int -> unit</h4>
+py_exit, pyerr_printex
+<h4>fun string -> unit</h4>
+py_setprogramname, py_setpythonhome
+<h4>fun unit -> int</h4>
+py_isinitialized, pyeval_getrestricted
+<h4>fun string -> int</h4>
+pyrun_simplestring, pyimport_importfrozenmodule,
+<h4>fun (int * string) -> int</h4>
+pyrun_anyfile, pyrun_simplefile, pyrun_interactiveone, pyrun_interactiveloop,
+py_fdisinteractive
+<h4>fun (int * string * int) -> int</h4>
+pyrun_anyfileex, pyrun_simplefileex
+<h4>fun unit -> string</h4>
+py_getprogramname, py_getpthonhome, py_getprogramfullpath, py_getprefix,
+py_getexecprefix, py_getpath, py_getversion, py_getplatform, py_getcopyright,
+py_getcompiler, py_getbuildinfo
+<h4>fun (string * int * pyobject * pyobject) -> pyobject</h4>
+pyrun_string
+<h4>fun (int * string * int * pyobject * pyobject) -> pyobject</h4>
+pyrun_file
+<h4>fun (int * string * int * pyobject * pyobject * int) -> pyobject</h4>
+pyrun_fileex
+<h4>fun (string * string * int) -> pyobject</h4>
+py_compilestring
+<h4>fun (pyobject * int * int) -> int</h4>
+pyobject_print, pytuple_getslice, pysequence_getslice</h4>
+<h4>fun pyobject -> pyobject</h4>
+pyobject_repr, pyobject_str, pyobject_unicode, pydict_keys, pydict_values,
+pydict_items, pydict_copy, pymodule_getdict, pymethod_function, pymethod_self,
+pymethod_class, pymodule_getdict, pyimport_reloadmodule, pyobject_type, 
+pynumber_negative, pynumber_positive, pynumber_absolute, pynumber_invert,
+pynumber_int, pynumber_long, pynumber_float, pysequence_tuple, pysequence_list
+<h4>fun (pyobject * pyobject * int) -> pyobject</h4>
+pyobject_richcompare
+<h4>fun (pyobject * string) -> pyobject</h4>
+pyobject_getattrstring, pydict_getitemstring, pysequence_fast, 
+pymapping_haskeystring, pymapping_getitemstring
+<h4>fun (pyobject * pyobject) -> pyobject</h4>
+pyobject_getattr, pystring_format, pydict_getitem, pyinstance_newraw, 
+pyeval_callobject, pyobject_getitem, pyobject_delitem, pynumber_add,
+pynumber_subtract, pynumber_multiply, pynumber_divide, pynumber_remainder,
+pynumber_divmod, pynumber_lshift, pynumber_rshift, pynumber_and, pynumber_xor,
+pynumber_or, pynumber_inplaceadd, pynumber_inplacesubtract, pynumber_inplacemultiply, pynumber_inplacedivide, pynumber_inplaceremainder, pynumber_inplacelshift, pynumber_inplacershift, pynumber_inplaceand, pynumber_inplacexor, pynumber_inplaceor, pysequence_concat, pysequence_inplaceconcat
+<h4>fun pyobject -> int</h4>
+pyobject_istrue, pyobject_not, pycalable_check, pystring_size, pydict_size,
+pytuple_new, pyerr_exceptionmatches, pyobject_size, pynumber_check, 
+pysequence_check, pysequence_size, pysequence_length, pymapping_check,
+pymapping_size, pymapping_length, pyint_asint
+<h4>fun (pyobject * pyobject) -> int</h4>
+pyobject_compare, pyobject_hasattr, pydict_delitem, 
+pyerr_givenexceptionmatches, pysequence_count, pysequence_contains, 
+pysequence_in, pysequence_index, pymapping_haskey
+<h4>fun (pyobject * pyobject * int) -> int</h4>
+pyobject_richcomparebool, pysequence_delitem
+<h4>fun (pyobject * string * pyobject) -> int</h4>
+pyobject_setattrstring, pydict_setitemstring
+<h4>fun (pyobject * string) -> int</h4>
+pyobject_hasattrstring, pydict_delitemstring, pysequence_inplacerepeat
+<h4>fun (pyobject * pyobject) -> (pyobject * pyobject)</h4>
+pynumber_coerce, pynumber_coerceex
+<h4>fun (pyobject * pyobject * pyobject) -> int</h4>
+pyobject_setattr, pydict_setitem, pyobject_setitem
+<h4>fun pyobject -> int64</h4>
+pyobject_hash, pyint_aslong
+<h4>fun pyobject -> string</h4>
+pystring_asstring, pymodule_getname, pymodule_getfilename
+<h4>fun (pyobject * pyobject) -> pyobject</h4>
+pystring_concat, pystring_concatanddel
+<h4>fun string -> pyobject</h4>
+pystring_fromstring, pymodule_new, pyimport_addmodule, pyimport_importmodule,
+pyimport_import
+<h4>fun unit -> pyobject</h4>
+pydict_new, pyerr_occurred, pyimport_getmoduledict, pyeval_getbuiltins,
+pyeval_getglobals, pyeval_getlocals, pyeval_getframe
+<h4>fun pyobject -> unit</h4>
+pydict_clear, pyerr_setnone
+<h4>fun (pyobject * int) -> (pyobject * pyobject * int)</h4>
+pydict_next
+<h4>fun int64 -> pyobject</h4>
+pyint_fromlong
+<h4>fun unit -> int64</h4>
+pyint_getmax
+<h4>fun float -> pyobject</h4>
+pyfloat_fromdouble
+<h4>fun pyobject -> float</h4>
+pyfloat_asdouble
+<h4>fun int -> pyobject</h4>
+pytuple_new, pyint_fromint
+<h4>fun (pyobject * int) -> pyobject</h4>
+pytuple_getitem, pysequence_repeat, pysequence_getitem
+<h4>fun (pyobject * int * pyobject) -> int</h4>
+pytuple_setitem, pysequence_setitem, pymapping_setitem
+<h4>fun (pyobject * pyobject * pyobject) -> pyobject</h4>
+pyslice_new, pyclass_new, pyinstance_new, pymethod_new, 
+pyeval_callobjectwithkeywords, pynumber_power, pynumber_inplacepower
+<h4>fun (pyobject * int) -> (int * int * int)</h4>
+pyslice_getindices
+<h4>fun (int * int * int * int) -> pyobject</h4>
+pyrange_new
+<h4>fun (pyobject * pyobject) -> unit</h4>
+pyerr_setobject
+<h4>fun (pyobject * string) -> unit</h4>
+pyerr_setstring
+<h4>fun (pyobject * pyobject * pyobject) -> (pyobject * pyobject * pyobject)</h4>
+pyerr_fetch, pyerr_normalizeexception
+<h4>fun (pyobject * pyobject * pyobject) -> unit</h4>
+pyerr_restore
+<h4>fun (pyobject * string) -> pyobject</h4>
+pyimport_execcodemodule
+<h4>fun (string * pyobject * string) -> pyobject</h4>
+pyimport_execcodemoduleex
+<h4>fun (string * pyobject * pyobject * pyobject) -> pyobject</h4>
+pyimport_importmoduleex
+<h4>fun pyobject -> string</h4>
+pyobject_ascharbuffer, pyobject_asreadbuffer, pyobject_aswritebuffer
+<h4>fun (pyobject * int * int * pyobject) -> int</h4>
+pysequence_setslice
+<h4>fun (pyobject * int * int) -> int</h4>
+pysequence_delslice
+
+<h3>Unique Functions Needed for Ocaml</h3>
+In addition to the functions in the usual library, several new functions are
+provided which give specific support for ocaml.<p>
+
+<table border=0 width=100%>
+<tr bgcolor="#c0c0c0">
+<td><b>pytuple_toarray</b></td>
+<td>pyobject -> pyobject array</td></tr>
+<tr><td colspan=2>
+Convert a python tuple to an ocaml array containing the same items.
+</td></tr>
+<tr bgcolor="#c0c0c0">
+<td><b>pywrap_closure</b></td><td>(pyobject -> pyobject) -> pyobject</td></tr>
+<tr><td colspan=2>
+Create a python callable object from a closure.  The closure receives the
+argument tuple from the invocation and returns a pyobject.
+</td></tr>
+<tr bgcolor="#c0c0c0">
+<td><b>pywrap_value</b></td><td>'a -> pyobject</td></tr>
+<tr><td colspan=2>
+Create a simple void * style wrapping around an ocaml object.  The object
+may be retrieved with <tt>pyunwrap_value : pyobject -> 'a</tt>.  Use this
+to enclose an ocaml data structure in python to be used later.
+</td></tr>
+<tr bgcolor="#c0c0c0">
+<td><b>pynull</b></td><td>unit -> pyobject</td></tr>
+<tr><td colspan=2>
+Generate the null PyObject * and return it.  This may sound dangerous, but
+it is used by library calls to indicate errors to the python system.
+</td></tr>
+<tr bgcolor="#c0c0c0">
+<td><b>pynone</b></td><td>unit -> pyobject</td></tr>
+<tr><td colspan=2>
+Generate a reference to the Py_None object.
+</td></tr>
+<tr bgcolor="#c0c0c0">
+<td><b>pytuple_fromarray</b></td>
+<td>pyobject array -> pyobject</td></tr>
+<tr><td colspan=2>
+Create a pytuple (as would be used for a function call) from the given
+array.  This may be used to implement varargs calls on python functions,
+and for other purposes.
+</td></tr>
+<tr bgcolor="#c0c0c0">
+<td><b>pytuple_empty</b></td>
+<td>pyobject array -> pyobject</td></tr>
+<tr><td colspan=2>
+Shortcut for <tt>pytuple_new 0</tt>
+</td></tr>
+
+<tr bgcolor="#c0c0c0">
+<td><b>pytuple_fromsingle</b></td>
+<td>pyobject -> pyobject</tt></td></tr>
+<tr><td colspan=2>
+Create a tuple with the single given object inside.  Use this to create
+single element tuples as for a function call with one argument.
+</td></tr>
+
+<tr bgcolor="#c0c0c0">
+<td><b>pytuple<i>1-5</i></b></td>
+<td>(pyobject * ...) -> pyobject</tt></td></tr>
+<tr><td colspan=2>
+Create a python tuple that has the same contents as the given ocaml tuple.
+</td></tr>
+
+<tr bgcolor="#c0c0c0">
+<td><b>pytype</b></td>
+<td>pyobject -> pyobject_type</tt></td></tr>
+<tr><td colspan=2>
+Determine roughly which type family the given value belongs to.  For example,
+<tt>pytype (pystring_fromstring "hi")</tt> yields <tt>StringType</tt>.
+</td></tr>
+</table>
+
+<h3>Sample Application</h3>
+This is the sample application that I developed the library with.  It 
+illustrates a python function call, as well as a call back into ocaml.
+The first form is used in cases where python libraries are to be used
+from ocaml, and the second would be used to produce native libraries in
+ocaml.<p>
+
+<pre>
+open Pycaml ;;
+
+let colorsys = pyimport_importmodule "colorsys"
+let dict = pymodule_getdict colorsys
+
+let triplet = pytuple3 (pyfloat_fromdouble 1.0,
+                       pyfloat_fromdouble 0.5,
+                       pyfloat_fromdouble 0.2) ;;
+
+let rgbtoyiq = pydict_getitemstring (dict,"rgb_to_yiq")
+let triplet = pyeval_callobject (rgbtoyiq,triplet)
+
+let _ = print_endline ((string_of_float
+                         (pyfloat_asdouble (pytuple_getitem (triplet,0)))) ^ 
+                      " " ^
+                      (string_of_float
+                         (pyfloat_asdouble (pytuple_getitem (triplet,1)))) ^
+                      " " ^
+                      (string_of_float
+                         (pyfloat_asdouble (pytuple_getitem (triplet,2))))) ;;
+
+let x = pywrap_closure 
+    (fun x -> print_string (pystring_asstring (pytuple_getitem (x,0))) ; 
+      pynone ())
+
+let _ = pyeval_callobject 
+    (x,pytuple_fromsingle (pystring_fromstring "hi there"))
+</pre>
+</body>
+</html>
diff --git a/bundles/pycaml/chemoelectric-pycaml-8614105/pycaml.ml b/bundles/pycaml/chemoelectric-pycaml-8614105/pycaml.ml
new file mode 100644 (file)
index 0000000..8274663
--- /dev/null
@@ -0,0 +1,1507 @@
+(*
+ * (C) arty 2002
+
+ This library is free software; you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ USA
+
+ * Major Modifications (C) T. Fischbacher 2005,2006
+ * 
+ * NOTE: have to properly document the CamlType / ocamlpill mechanism!
+   
+ * More modifications are by Barry Schwartz.
+ * Copyright (C) 2009 Barry Schwartz.
+
+ * Note (T.F.): Should we incorporate auto-conversion of int to float?
+ * At present, we do not do this. (B.S.): Maybe we should, or maybe we
+ * shouldn't. But BytesType/UnicodeType/string conversion does seem
+ * called for; it's getting to be a big problem in kompostilo.
+ *)
+
+type funcptr 
+type pyobject 
+type funcent = (funcptr * int * int * bool)
+
+type pymodule_func = {
+  pyml_name : string ; 
+  pyml_func : (pyobject -> pyobject) ;
+  pyml_flags : int ;
+  pyml_doc : string;
+}
+
+type pyobject_type =
+  | TupleType
+  | BytesType
+  | UnicodeType
+  | BoolType
+  | IntType
+  | FloatType
+  | ListType
+  | NoneType
+  | CallableType
+  | ModuleType
+  | ClassType
+  | TypeType
+  | DictType
+  | NullType
+  | CamlpillType
+  | OtherType
+  | EitherStringType (* Signifies that either of BytesType or UnicodeType is allowed. *)
+  | CamlpillSubtype of string (* Signifies that only the particular Camlpill variety is allowed. *)
+  | AnyType                   (* Allow any python object. *)
+
+type pyerror_type =
+  | Pyerr_Exception
+  | Pyerr_StandardError
+  | Pyerr_ArithmeticError
+  | Pyerr_LookupError
+  | Pyerr_AssertionError
+  | Pyerr_AttributeError
+  | Pyerr_EOFError
+  | Pyerr_EnvironmentError
+  | Pyerr_FloatingPointError
+  | Pyerr_IOError
+  | Pyerr_ImportError
+  | Pyerr_IndexError
+  | Pyerr_KeyError
+  | Pyerr_KeyboardInterrupt
+  | Pyerr_MemoryError
+  | Pyerr_NameError
+  | Pyerr_NotImplementedError
+  | Pyerr_OSError
+  | Pyerr_OverflowError
+  | Pyerr_ReferenceError
+  | Pyerr_RuntimeError
+  | Pyerr_SyntaxError
+  | Pyerr_SystemExit
+  | Pyerr_TypeError
+  | Pyerr_ValueError
+  | Pyerr_ZeroDivisionError
+
+exception Pycaml_exn of (pyerror_type * string)
+
+      
+(* Function list *)
+      
+external pytype : pyobject -> pyobject_type = "pytype"
+
+external pycaml_seterror : pyerror_type -> string -> unit = "pycaml_seterror"
+
+external pynull : unit -> pyobject = "pynull"
+external pynone : unit -> pyobject = "pynone"
+external py_true : unit -> pyobject = "py_true"
+external py_false : unit -> pyobject = "py_false"
+
+(*-----------------------------------------------------------------------*)
+
+(* Type1 *)
+external py_initialize : unit -> unit = "Py_Initialize_wrapper"
+external py_finalize : unit -> unit = "Py_Finalize_wrapper"
+external pyerr_print : unit -> unit = "PyErr_Print_wrapper"
+external pyerr_clear : unit -> unit = "PyErr_Clear_wrapper"
+external pyimport_cleanup : unit -> unit = "PyImport_Cleanup_wrapper"
+
+(* Type2 *)
+external py_exit : int -> unit = "Py_Exit_wrapper"
+external pyerr_printex : int -> unit = "PyErr_PrintEx_wrapper"
+
+(* Type3 *)
+external py_setprogramname : string -> unit = "Py_SetProgramName_wrapper"
+external py_setpythonhome : string -> unit = "Py_SetPythonHome_wrapper"
+
+(* Type4 *)
+external py_isinitialized : unit -> int = "Py_IsInitialized_wrapper"
+IFDEF PYMAJOR2 THEN
+external pyeval_getrestricted : unit -> int = "PyEval_GetRestricted_wrapper"
+END
+
+(* Type5 *)
+external pyrun_simplestring : string -> int = "PyRun_SimpleString_wrapper"
+external pyimport_importfrozenmodule : string -> int = "PyImport_ImportFrozenModule_wrapper"
+
+(* Test6 *)
+external pyrun_anyfile : (int * string) -> int = "PyRun_AnyFile_wrapper"
+external pyrun_simplefile : (int * string) -> int = "PyRun_SimpleFile_wrapper"
+external pyrun_interactiveone : (int * string) -> int = "PyRun_InteractiveOne_wrapper"
+external pyrun_interactiveloop : (int * string) -> int = "PyRun_InteractiveLoop_wrapper"
+external py_fdisinteractive : (int * string) -> int = "Py_FdIsInteractive_wrapper"
+
+(* Type7 *)
+external pyrun_anyfileex : (int * string * int) -> int = "PyRun_AnyFileEx_wrapper"
+external pyrun_simplefileex : (int * string * int) -> int = "PyRun_SimpleFileEx_wrapper"
+
+(* Type8 *)
+external py_getprogramname : unit -> string = "Py_GetProgramName_wrapper"
+external py_getpythonhome : unit -> string = "Py_GetPythonHome_wrapper"
+external py_getprogramfullpath : unit -> string = "Py_GetProgramFullPath_wrapper"
+external py_getprefix : unit -> string = "Py_GetPrefix_wrapper"
+external py_getexecprefix : unit -> string = "Py_GetExecPrefix_wrapper"
+external py_getpath : unit -> string = "Py_GetPath_wrapper"
+external py_getversion : unit -> string = "Py_GetVersion_wrapper"
+external py_getplatform : unit -> string = "Py_GetPlatform_wrapper"
+external py_getcopyright : unit -> string = "Py_GetCopyright_wrapper"
+external py_getcompiler : unit -> string = "Py_GetCompiler_wrapper"
+external py_getbuildinfo : unit -> string = "Py_GetBuildInfo_wrapper"
+
+(* Type9 *)
+external pyrun_string : (string * int * pyobject * pyobject) -> pyobject = "PyRun_String_wrapper"
+
+(* Type10 *)
+external pyrun_file : (int * string * int * pyobject * pyobject) -> pyobject = "PyRun_File_wrapper"
+
+(* Type11 *)
+external pyrun_fileex : (int * string * int * pyobject * pyobject * int) -> pyobject = "PyRun_FileEx_wrapper"
+
+(* Type12 *)
+external py_compilestring : (string * string * int) -> pyobject = "Py_CompileString_wrapper"
+
+(* Type13 *)
+external pyobject_print : (pyobject * int * int) -> int = "PyObject_Print_wrapper"
+external pytuple_getslice : (pyobject * int * int) -> int = "PyTuple_GetSlice_wrapper"
+external pysequence_getslice : (pyobject * int * int) -> int = "PySequence_GetSlice_wrapper"
+
+(* Type14 *)
+external pymethod_function : pyobject -> pyobject = "PyMethod_Function_wrapper"
+external pymethod_self : pyobject -> pyobject = "PyMethod_Self_wrapper"
+IFDEF PYMAJOR2 THEN
+external pymethod_class : pyobject -> pyobject = "PyMethod_Class_wrapper"
+END
+external pymodule_getdict : pyobject -> pyobject = "PyModule_GetDict_wrapper"
+external pyunicode_asutf8string : pyobject -> pyobject = "PyUnicode_AsUTF8String_wrapper"
+external pyunicode_asutf16string : pyobject -> pyobject = "PyUnicode_AsUTF16String_wrapper"
+external pyunicode_asutf32string : pyobject -> pyobject = "PyUnicode_AsUTF32String_wrapper"
+external pyobject_repr : pyobject -> pyobject = "PyObject_Repr_wrapper"
+external pyimport_reloadmodule : pyobject -> pyobject = "PyImport_ReloadModule_wrapper"
+external pyimport_import : pyobject -> pyobject = "PyImport_Import_wrapper"
+external pyobject_str : pyobject -> pyobject = "PyObject_Str_wrapper"
+external pyobject_type : pyobject -> pyobject = "PyObject_Type_wrapper"
+external pyobject_unicode : pyobject -> pyobject = "PyObject_Unicode_wrapper"
+external pydict_keys : pyobject -> pyobject = "PyDict_Keys_wrapper"
+external pydict_values : pyobject -> pyobject = "PyDict_Values_wrapper"
+external pydict_items : pyobject -> pyobject = "PyDict_Items_wrapper"
+external pydict_copy : pyobject -> pyobject = "PyDict_Copy_wrapper"
+external pysequence_tuple : pyobject -> pyobject = "PySequence_Tuple_wrapper"
+external pysequence_list : pyobject -> pyobject = "PySequence_List_wrapper"
+IFDEF PYMAJOR2 THEN
+external pynumber_int : pyobject -> pyobject = "PyNumber_Int_wrapper"
+END
+external pynumber_long : pyobject -> pyobject = "PyNumber_Long_wrapper"
+external pynumber_float : pyobject -> pyobject = "PyNumber_Float_wrapper"
+external pynumber_negative : pyobject -> pyobject = "PyNumber_Negative_wrapper"
+external pynumber_positive : pyobject -> pyobject = "PyNumber_Positive_wrapper"
+external pynumber_absolute : pyobject -> pyobject = "PyNumber_Absolute_wrapper"
+external pynumber_invert : pyobject -> pyobject = "PyNumber_Invert_wrapper"
+external pyiter_next : pyobject -> pyobject = "PyIter_Next_wrapper"
+
+(* Type15 *)
+external pyobject_richcompare : (pyobject * pyobject * int) -> pyobject = "PyObject_RichCompare_wrapper"
+
+(* Type16 *)
+external pydict_getitemstring : (pyobject * string) -> pyobject = "PyDict_GetItemString_wrapper"
+external pyobject_getattrstring : (pyobject * string) -> pyobject = "PyObject_GetAttrString_wrapper"
+external pysequence_fast : (pyobject * string) -> pyobject = "PySequence_Fast_wrapper"
+external pymapping_getitemstring : (pyobject * string) -> pyobject = "PyMapping_GetItemString_wrapper"
+
+(* Type17 *)
+external pydict_getitem : pyobject * pyobject -> pyobject = "PyDict_GetItem_wrapper"
+external pyeval_callobject : pyobject * pyobject -> pyobject = "PyEval_CallObject_wrapper"
+external pyobject_getattr : pyobject * pyobject -> pyobject = "PyObject_GetAttr_wrapper"
+external pyobject_getitem : pyobject * pyobject -> pyobject = "PyObject_GetItem_wrapper"
+external pynumber_add : pyobject * pyobject -> pyobject = "PyNumber_Add_wrapper"
+external pynumber_subtract : pyobject * pyobject -> pyobject = "PyNumber_Subtract_wrapper"
+external pynumber_multiply : pyobject * pyobject -> pyobject = "PyNumber_Multiply_wrapper"
+IFDEF PYMAJOR2 THEN
+external pynumber_divide : pyobject * pyobject -> pyobject = "PyNumber_Divide_wrapper"
+END
+external pynumber_truedivide : pyobject * pyobject -> pyobject = "PyNumber_TrueDivide_wrapper"
+external pynumber_floordivide : pyobject * pyobject -> pyobject = "PyNumber_FloorDivide_wrapper"
+external pynumber_remainder : pyobject * pyobject -> pyobject = "PyNumber_Remainder_wrapper"
+external pynumber_divmod : pyobject * pyobject -> pyobject = "PyNumber_Divmod_wrapper"
+external pynumber_lshift : pyobject * pyobject -> pyobject = "PyNumber_Lshift_wrapper"
+external pynumber_rshift : pyobject * pyobject -> pyobject = "PyNumber_Rshift_wrapper"
+external pynumber_and : pyobject * pyobject -> pyobject = "PyNumber_And_wrapper"
+external pynumber_xor : pyobject * pyobject -> pyobject = "PyNumber_Xor_wrapper"
+external pynumber_or : pyobject * pyobject -> pyobject = "PyNumber_Or_wrapper"
+external pynumber_inplaceadd : pyobject * pyobject -> pyobject = "PyNumber_InPlaceAdd_wrapper"
+external pynumber_inplacesubtract : pyobject * pyobject -> pyobject = "PyNumber_InPlaceSubtract_wrapper"
+external pynumber_inplacemultiply : pyobject * pyobject -> pyobject = "PyNumber_InPlaceMultiply_wrapper"
+external pynumber_inplacetruedivide : pyobject * pyobject -> pyobject = "PyNumber_InPlaceTrueDivide_wrapper"
+external pynumber_inplacefloordivide : pyobject * pyobject -> pyobject = "PyNumber_InPlaceFloorDivide_wrapper"
+IFDEF PYMAJOR2 THEN
+external pynumber_inplacedivide : pyobject * pyobject -> pyobject = "PyNumber_InPlaceDivide_wrapper"
+END
+external pynumber_inplaceremainder : pyobject * pyobject -> pyobject = "PyNumber_InPlaceRemainder_wrapper"
+external pynumber_inplacelshift : pyobject * pyobject -> pyobject = "PyNumber_InPlaceLshift_wrapper"
+external pynumber_inplacershift : pyobject * pyobject -> pyobject = "PyNumber_InPlaceRshift_wrapper"
+external pynumber_inplaceand : pyobject * pyobject -> pyobject = "PyNumber_InPlaceAnd_wrapper"
+external pynumber_inplacexor : pyobject * pyobject -> pyobject = "PyNumber_InPlaceXor_wrapper"
+external pynumber_inplaceor : pyobject * pyobject -> pyobject = "PyNumber_InPlaceOr_wrapper"
+IFDEF PYMAJOR2 THEN
+external pybytes_format : pyobject * pyobject -> pyobject = "PyBytes_Format_wrapper"
+external pystring_format : pyobject * pyobject -> pyobject = "PyBytes_Format_wrapper" (* Legacy support *)
+external pyinstance_newraw : pyobject * pyobject -> pyobject = "PyInstance_NewRaw_wrapper"
+END
+external pysequence_concat : pyobject * pyobject -> pyobject = "PySequence_Concat_wrapper"
+external pysequence_inplaceconcat : pyobject * pyobject -> pyobject = "PySequence_InPlaceConcat_wrapper"
+
+(* Type18 *)
+external pyobject_istrue : pyobject -> int = "PyObject_IsTrue_wrapper"
+external pyobject_not : pyobject -> int = "PyObject_Not_wrapper"
+external pycallable_check : pyobject -> int = "PyCallable_Check_wrapper"
+external pybytes_size : pyobject -> int = "PyBytes_Size_wrapper"
+external pystring_size : pyobject -> int = "PyBytes_Size_wrapper" (* Legacy support *)
+external pydict_size : pyobject -> int = "PyDict_Size_wrapper"
+external pytuple_size : pyobject -> int = "PyTuple_Size_wrapper"
+external pyerr_exceptionmatches : pyobject -> int = "PyErr_ExceptionMatches_wrapper"
+external pyobject_size : pyobject -> int = "PyObject_Size_wrapper"
+external pynumber_check : pyobject -> int = "PyNumber_Check_wrapper"
+external pysequence_check : pyobject -> int = "PySequence_Check_wrapper"
+external pysequence_size : pyobject -> int = "PySequence_Size_wrapper"
+external pysequence_length : pyobject -> int = "PySequence_Length_wrapper"
+external pymapping_check : pyobject -> int = "PyMapping_Check_wrapper"
+external pymapping_size : pyobject -> int = "PyMapping_Size_wrapper"
+external pymapping_length : pyobject -> int = "PyMapping_Length_wrapper"
+external pyiter_check : pyobject -> int = "PyIter_Check_wrapper"
+external pyunicode_getsize : pyobject -> int = "PyUnicode_GetSize_wrapper"
+
+(* Type19 *)
+external pyobject_hasattr : (pyobject * pyobject) -> int = "PyObject_HasAttr_wrapper"
+external pyobject_delitem : (pyobject * pyobject) -> int = "PyObject_DelItem_wrapper"
+external pydict_delitem : (pyobject * pyobject) -> int = "PyDict_DelItem_wrapper"
+external pyerr_givenexceptionmatches : (pyobject * pyobject) -> int = "PyErr_GivenExceptionMatches_wrapper"
+external pysequence_count : (pyobject * pyobject) -> int = "PySequence_Count_wrapper"
+external pysequence_contains : (pyobject * pyobject) -> int = "PySequence_Contains_wrapper"
+external pysequence_in : (pyobject * pyobject) -> int = "PySequence_In_wrapper"
+external pysequence_index : (pyobject * pyobject) -> int = "PySequence_Index_wrapper"
+external pymapping_haskey : (pyobject * pyobject) -> int = "PyMapping_HasKey_wrapper"
+
+IFDEF PYCAML2 THEN
+external pyobject_compare : (pyobject * pyobject) -> int = "PyObject_Compare_wrapper"
+END
+
+(* Type20 *)
+external pyobject_richcomparebool : (pyobject * pyobject * int) -> int = "PyObject_RichCompareBool_wrapper"
+
+(* Type21 *)
+external pyobject_setattrstring : (pyobject * string * pyobject) -> int = "PyObject_SetAttrString_wrapper"
+external pydict_setitemstring : (pyobject * string * pyobject) -> int = "PyDict_SetItemString_wrapper"
+external pymapping_setitemstring : (pyobject * string * pyobject) -> int = "PyMapping_SetItemString_wrapper"
+
+(* Type22 *)
+external pymapping_haskeystring : (pyobject * string) -> int = "PyMapping_HasKeyString_wrapper"
+external pyobject_hasattrstring : (pyobject * string) -> int = "PyObject_HasAttrString_wrapper"
+external pydict_delitemstring : (pyobject * string) -> int = "PyDict_DelItemString_wrapper"
+
+(* Type23 -- currently not implemented.
+external pynumber_coerce : (pyobject * pyobject) -> (pyobject * pyobject) option = "PyNumber_Coerce_wrapper"
+external pynumber_coerceex : (pyobject * pyobject) -> (pyobject * pyobject) option = "PyNumber_CoerceEx_wrapper"
+*)
+
+(* Type24 *)
+external pyobject_setattr : (pyobject * pyobject * pyobject) -> int = "PyObject_SetAttr_wrapper"
+external pyobject_setitem : (pyobject * pyobject * pyobject) -> int = "PyObject_SetItem_wrapper"
+external pydict_setitem : (pyobject * pyobject * pyobject) -> int = "PyDict_SetItem_wrapper"
+
+(* Type25 *)
+external pyobject_hash : pyobject -> int64 = "PyObject_Hash_wrapper"
+external pyint_aslong : pyobject -> int64 = "PyInt_AsLong_wrapper"
+
+(* Type26 *)
+external pybytes_asstring : pyobject -> string = "PyBytes_AsString_wrapper"
+external pystring_asstring : pyobject -> string = "PyBytes_AsString_wrapper" (* Legacy support *)
+external pymodule_getfilename : pyobject -> string = "PyModule_GetFilename_wrapper"
+external pymodule_getname : pyobject -> string = "PyModule_GetName_wrapper"
+
+(* Type28 *)
+external pyimport_addmodule : string -> pyobject = "PyImport_AddModule_wrapper"
+external pybytes_fromstring : string -> pyobject = "PyBytes_FromString_wrapper"
+IFDEF PYMAJOR2 THEN
+external pystring_fromstring : string -> pyobject = "PyBytes_FromString_wrapper" (* Legacy support *)
+ELSE
+external pystring_fromstring : string -> pyobject = "PyUnicode_FromString_wrapper" (* Legacy support *)
+ENDIF
+external pymodule_new : string -> pyobject = "PyModule_New_wrapper"
+external pyimport_importmodule : string -> pyobject = "PyImport_ImportModule_wrapper"
+
+(* Type29 *)
+external pydict_new : unit -> pyobject = "PyDict_New_wrapper"
+external pyerr_occurred : unit -> pyobject = "PyErr_Occurred_wrapper"
+external pyimport_getmoduledict : unit -> pyobject = "PyImport_GetModuleDict_wrapper"
+external pyeval_getbuiltins : unit -> pyobject = "PyEval_GetBuiltins_wrapper"
+external pyeval_getglobals : unit -> pyobject = "PyEval_GetGlobals_wrapper"
+external pyeval_getlocals : unit -> pyobject = "PyEval_GetLocals_wrapper"
+(* external pyeval_getframe : unit -> pyobject = "PyEval_GetFrame_wrapper"  -- FIX: see note in stubs. *)
+
+(* Type30 *)
+external pydict_clear : pyobject -> unit = "PyDict_Clear_wrapper"
+external pyerr_setnone : pyobject -> unit = "PyErr_SetNone_wrapper"
+
+(* Type31  -- currently not implemented.
+external pydict_next : (pyobject * int) -> (pyobject * pyobject * int) option = "PyDict_Next_wrapper"
+*)
+
+(* Type34 *)
+external pyint_fromlong : int64 -> pyobject = "PyInt_FromLong_wrapper"
+
+(* Type35 *)
+IFDEF PYMAJOR2 THEN
+external pyint_getmax : unit -> int64 = "PyInt_GetMax_wrapper"
+END
+external pyimport_getmagicnumber : unit -> int64 = "PyImport_GetMagicNumber_wrapper"
+
+(* Type36 *)
+external pyfloat_fromdouble : float -> pyobject = "PyFloat_FromDouble_wrapper"
+
+(* Type37 *)
+external pyfloat_asdouble : pyobject -> float = "PyFloat_AsDouble_wrapper"
+
+(* Type39 *)
+external pytuple_new : int -> pyobject = "PyTuple_New_wrapper"
+
+(* Type40 *)
+external pysequence_inplacerepeat : (pyobject * int) -> pyobject = "PySequence_InPlaceRepeat_wrapper"
+external pytuple_getitem : (pyobject * int) -> pyobject = "PyTuple_GetItem_wrapper"
+external pysequence_repeat : (pyobject * int) -> pyobject = "PySequence_Repeat_wrapper"
+external pysequence_getitem : (pyobject * int) -> pyobject = "PySequence_GetItem_wrapper"
+
+(* Type40b *)
+external pysequence_delitem : (pyobject * pyobject * int) -> int = "PySequence_DelItem_wrapper"
+
+(* Type41 *)
+external pytuple_setitem : (pyobject * int * pyobject) -> int = "PyTuple_SetItem_wrapper"
+external pysequence_setitem : (pyobject * int * pyobject) -> int = "PySequence_SetItem_wrapper"
+
+(* Type42 *)
+external pyslice_new : (pyobject * pyobject * pyobject) -> pyobject = "PySlice_New_wrapper"
+external pyclass_new : (pyobject * pyobject * pyobject) -> pyobject = "PyClass_New_wrapper"
+IFDEF PYMAJOR2 THEN
+external pyinstance_new : (pyobject * pyobject * pyobject) -> pyobject = "PyInstance_New_wrapper"
+END
+external pymethod_new : (pyobject * pyobject * pyobject) -> pyobject = "PyMethod_New_wrapper"
+external pyeval_callobjectwithkeywords : (pyobject * pyobject * pyobject) -> pyobject = "PyEval_CallObjectWithKeywords_wrapper"
+external pynumber_power : (pyobject * pyobject * pyobject) -> pyobject = "PyNumber_Power_wrapper"
+external pynumber_inplacepower : (pyobject * pyobject * pyobject) -> pyobject = "PyNumber_InPlacePower_wrapper"
+
+(* Type43 *)
+(* external pyslice_getindices : (pyobject * int) -> (int * int * int) option = "PySlice_GetIndices_wrapper" <-- Currently not supported *)
+
+(* Type45 *)
+external pyerr_setobject : (pyobject * pyobject) -> unit = "PyErr_SetObject_wrapper"
+
+(* Type46 *)
+external pyerr_setstring : (pyobject * string) -> unit = "PyErr_SetString_wrapper"
+
+(* Type47 *)
+external pyerr_fetch : (pyobject * pyobject * pyobject) -> (pyobject * pyobject * pyobject) = "PyErr_Fetch_wrapper"
+external pyerr_normalizeexception : (pyobject * pyobject * pyobject) -> (pyobject * pyobject * pyobject) = "PyErr_NormalizeException_wrapper"
+
+(* Type48 *)
+external pyerr_restore : (pyobject * pyobject * pyobject) -> unit = "PyErr_Restore_wrapper"
+
+(* Type49 *)
+external pyimport_execcodemodule : (pyobject * string) -> pyobject = "PyImport_ExecCodeModule_wrapper"
+
+(* Type50 *)
+external pyimport_execcodemoduleex : (string * pyobject * string) -> pyobject = "PyImport_ExecCodeModuleEx_wrapper"
+
+(* Type51 *)
+external pyimport_importmoduleex : (string * pyobject * pyobject * pyobject) -> pyobject = "PyImport_ImportModuleEx_wrapper"
+
+(* Type52 *)
+external pybytes_asstringandsize : pyobject -> string = "PyBytes_AsStringAndSize_wrapper"
+external pystring_asstringandsize : pyobject -> string = "PyBytes_AsStringAndSize_wrapper" (* Legacy support *)
+external pyobject_ascharbuffer : pyobject -> string = "PyObject_AsCharBuffer_wrapper"
+external pyobject_asreadbuffer : pyobject -> string = "PyObject_AsReadBuffer_wrapper"
+external pyobject_aswritebuffer : pyobject -> string = "PyObject_AsWriteBuffer_wrapper"
+
+(* Type53 *)
+external pysequence_setslice : (pyobject * int * int * pyobject) -> int = "PySequence_SetSlice_wrapper"
+
+(* Type54 *)
+external pysequence_delslice : (pyobject * int * int) -> int = "PySequence_DelSlice_wrapper"
+
+(* TypeUTF8Decoder *)
+external pyunicode_decodeutf8 : (string * string option) -> pyobject = "PyUnicode_DecodeUTF8_wrapper"
+
+(* TypeUTF16Decoder *)
+external pyunicode_decodeutf16 : (string * string option * int option) -> pyobject = "PyUnicode_DecodeUTF16_wrapper"
+external pyunicode_decodeutf32 : (string * string option * int option) -> pyobject = "PyUnicode_DecodeUTF32_wrapper"
+
+(*-----------------------------------------------------------------------*)
+
+external pyunicode_fromunicode : (int -> int) -> int -> pyobject = "PyUnicode_FromUnicode_wrapper"
+external pyunicode_asunicode   : pyobject -> int array = "PyUnicode_AsUnicode_wrapper"
+
+(*-----------------------------------------------------------------------*)
+
+external pytuple_fromarray : pyobject array -> pyobject = "pytuple_fromarray"
+let pytuple_fromsingle elt = pytuple_fromarray [| elt |] 
+let pytuple_empty = pytuple_fromarray [| |] 
+external pytuple2 : (pyobject * pyobject) -> pyobject = "pytuple_fromarray"
+external pytuple3 : (pyobject * pyobject * pyobject) -> pyobject = "pytuple_fromarray"
+external pytuple4 : (pyobject * pyobject * pyobject * pyobject) -> pyobject = "pytuple_fromarray"
+external pytuple5 : (pyobject * pyobject * pyobject * pyobject * pyobject) -> pyobject = "pytuple_fromarray"
+
+let pyint_fromint i = pyint_fromlong (Int64.of_int i)
+let pyint_asint obj = Int64.to_int (pyint_aslong obj)
+    
+external pytuple_toarray : pyobject -> pyobject array = "pytuple_toarray"
+    
+external pywrap_closure : (pyobject -> pyobject) -> pyobject = "pywrap_closure"
+
+external pywrap_value : 'a -> pyobject = "pywrapvalue"
+external pywrap_value_pill : 'a -> pyobject = "pywrapvalue_pill"
+
+external pyunwrap_value : pyobject -> 'a = "pyunwrapvalue"
+(* ^ Note: this will just unwrap and not care about pills! *)
+
+(* -- T.F. extensions -- *)
+
+let py_repr x = pybytes_asstring (pyobject_repr x)
+
+external pywrap_closure_docstring :
+  string -> (pyobject -> pyobject) -> pyobject = "pywrap_closure_docstring"
+
+
+external pylist_fromarray : pyobject array -> pyobject = "pylist_fromarray"
+external pylist_toarray : pyobject -> pyobject array = "pylist_toarray"
+external pylist_set: pyobject -> int -> pyobject -> unit = "pylist_set"
+external pylist_get: pyobject -> int -> pyobject = "pylist_get"
+
+external python_prompt: unit -> unit = "pycaml_prompt"
+
+external pyrefcount: pyobject -> int = "pyrefcount"
+
+let _py_profile_hash = ((Hashtbl.create 100):(string, float array) Hashtbl.t)
+let _py_profiling_active=ref false
+(* The profiling hash and switch are strictly internal! *)
+
+let py_activate_profiling () =
+  let z = !_py_profiling_active in
+  let () = _py_profiling_active:=true in
+    z
+
+let py_deactivate_profiling () =
+  let z = !_py_profiling_active in
+  let () = _py_profiling_active:=false in
+    z
+
+
+let py_profile_reset () = Hashtbl.clear _py_profile_hash
+
+(* Needed below. Actually, we also have this in our "snippets" module,
+   but pycaml should not depend on anything not in the standard ocaml
+   distribution.
+*)
+
+let __hashtbl_arbitrary_element ht =
+  let have_it = ref None in
+  let () =
+    try
+      Hashtbl.iter
+       (fun k v ->
+          begin
+            have_it := Some (k,v);
+            raise Not_found; (* abused as a dummy exception here *)
+          end)
+       ht
+    with
+      | Not_found -> ()
+  in
+    !have_it
+
+let __map_hashtbl_to_array ?sorter mapper ht =
+  let nr_entries = Hashtbl.length ht in
+    if nr_entries = 0 
+    then [||]
+    else
+      let opt_kv = __hashtbl_arbitrary_element ht in
+      let result =
+       match opt_kv with
+         | None -> failwith "Impossible!"
+         | Some (k,v) -> Array.make nr_entries (mapper k v)
+      in
+      let ref_index = ref 0 in
+      let () = Hashtbl.iter
+       (fun k v ->
+          begin
+            result.(!ref_index) <- mapper k v;
+            ref_index := (1+ !ref_index);
+          end) ht
+      in
+       match sorter with
+         | Some s ->
+             let () = Array.sort s result in result
+         | _ -> result
+
+
+let py_profile_report () =
+  __map_hashtbl_to_array
+    ~sorter:(fun (_,time_a,_) (_,time_b,_) -> compare time_b time_a) (* sort by time consumed *)
+    (fun name time_and_calls -> (name,time_and_calls.(0),time_and_calls.(1)))
+    _py_profile_hash
+
+
+let pytype_name pt =
+  match pt with
+  | TupleType -> "Python-Tuple"
+  | BytesType -> "Python-Bytes"
+  | UnicodeType -> "Python-Unicode"
+  | BoolType -> "Python-Bool"
+  | IntType -> "Python-Int"
+  | FloatType -> "Python-Float"
+  | ListType -> "Python-List"
+  | NoneType -> "Python-None"
+  | CallableType -> "Python-Callable"
+  | ModuleType -> "Python-Module"
+  | ClassType -> "Python-Class"
+  | NullType -> "Python-Null"
+  | TypeType -> "Python-Type"
+  | DictType -> "Python-Dict"
+  | CamlpillType -> "Python-Camlpill"
+  | OtherType -> "Python-Other"
+  | EitherStringType -> "Python-EitherString"
+  | CamlpillSubtype sym -> "Python-Camlpill-" ^ sym
+  | AnyType -> "Python-Any"
+
+let set_python_argv argv =
+  let py_mod_sys_dict = pymodule_getdict (pyimport_importmodule "sys") in
+  let _ = pydict_setitem(py_mod_sys_dict,pybytes_fromstring "argv",
+                        pylist_fromarray (Array.map pybytes_fromstring argv))
+  in ()
+
+let python_eval str =
+  pyrun_simplestring str
+
+let python_load filename =
+  ignore(python_eval (Printf.sprintf "execfile(\"%s\")" filename))
+
+let python () =
+  let () = python_prompt() in 0
+
+let ipython () =
+  pyrun_simplestring
+(* This version starts ipython with its own name space -- one
+   can't see any objects created with earlier pycaml.* commands.
+
+   I have added a replacement below. (Delete this comment later if 
+   this generally works. (HF 23/09/05)
+ *)
+(* "import IPython       
+import sys
+sys.argv=['/usr/local/bin/ipython']
+IPython.Shell.start().mainloop()
+";;*)
+"from IPython.Shell import IPShellEmbed
+ipshell = IPShellEmbed(argv=[''])
+ipshell() # this call anywhere in your program will start IPython
+";;
+
+
+(* Note: we prepare Python in such a way that we have a module ocaml
+   within which the OCaml side will publish its own functions.
+
+   Convention: We will register some examples in ocaml.*
+   These will have names that start with "example_".
+*)
+
+let _ = py_initialize () (* Note that this must happen that early... *)
+
+let _py_sys_modules = pyimport_getmoduledict ()
+let _py_mod_ocaml = pymodule_new "ocaml"
+let _py_mod_ocaml_dict = pymodule_getdict _py_mod_ocaml
+
+(* Get the last value that was computed in the interactive REPL *)
+let python_last_value () =
+  let main = pyimport_importmodule "__main__" in
+  let main_dict = pymodule_getdict main in
+  let builtins = pydict_getitem (main_dict, pybytes_fromstring "__builtins__") in
+  let builtins_dict = pymodule_getdict builtins in
+  let pyname_lastvalue = pybytes_fromstring "_" in
+    pydict_getitem (builtins_dict, pyname_lastvalue)
+
+let py_is_true x = pyobject_istrue x <> 0 (* pyobject_istrue has return type int - which is quite insane... *)
+
+let register_for_python stuff =
+  Array.iter
+    (fun (python_name, value) ->
+       ignore(pydict_setitemstring
+               (_py_mod_ocaml_dict,
+                python_name, value)))
+    stuff
+
+let register_pre_functions_for_python stuff =
+  Array.iter
+    (fun (python_name, pre_fun) ->
+       ignore(pydict_setitemstring
+               (_py_mod_ocaml_dict,
+                python_name, pre_fun python_name)))
+    stuff
+
+
+let float_array_to_python farr =
+  pylist_fromarray (Array.map pyfloat_fromdouble farr)
+
+let int_array_to_python iarr =
+  pylist_fromarray (Array.map pyint_fromint iarr)
+
+
+let py_float_tensor ?(init=(fun _ -> 0.0)) index_ranges =
+  let nr_indices = Array.length index_ranges in
+  let v_indices = Array.make nr_indices 0 in
+    if nr_indices = 0
+    then (pyfloat_fromdouble (init v_indices), fun _ -> failwith "Cannot set rank-0 python float tensor!")
+    else
+      let rec build pos =
+       let range = index_ranges.(pos) in
+         if pos = nr_indices-1
+         then
+           pylist_fromarray 
+             (Array.init range
+                (fun ix_here ->
+                   let () = v_indices.(pos) <- ix_here in
+                     pyfloat_fromdouble (init v_indices)))
+         else
+           pylist_fromarray
+             (Array.init range
+                (fun ix_here ->
+                   let () = v_indices.(pos) <- ix_here in
+                     build (1+pos)))
+      in
+      let structure = build 0
+      in
+      let setter indices value =
+       let rec walk sub_structure pos =
+         if pos = nr_indices-1
+         then pylist_set sub_structure indices.(pos) value
+         else walk (pylist_get sub_structure indices.(pos)) (1+pos)
+       in walk structure 0
+      in (structure,setter)
+
+
+
+let py_homogeneous_list_as_array
+    ?error_label
+    ?length
+    type_name type_checker unwrapper
+    py_obj_arr
+    =
+  let array_first_not_to_satisfy p arr =
+    let len = Array.length arr in
+    let rec walk n =
+      if n = len then (-1)
+      else if p (arr.(n)) then walk (n+1)
+      else n
+    in walk 0
+  in
+  let the_error_label =
+    match error_label with
+      | None -> ""
+      | Some x -> Printf.sprintf "%s: " x
+  in
+    if pytype py_obj_arr <> ListType then 
+      raise 
+           (Pycaml_exn
+              (Pyerr_TypeError,
+               Printf.sprintf "%sExpected list, got: %s (%s)" the_error_label
+                 (pytype_name (pytype py_obj_arr))
+                 (py_repr py_obj_arr)
+              ))
+    else
+      let obj_arr = pylist_toarray py_obj_arr in
+        (* Doing the length check is slightly tricky... *)
+      let () =
+        match length with
+             | None -> ()
+             | Some len ->
+                 if Array.length obj_arr <> len then
+                   raise 
+                         (Pycaml_exn
+                            (Pyerr_TypeError,
+                             Printf.sprintf "%sExpected list of length %d, got length: %d"
+                               the_error_label
+                               len (Array.length obj_arr)))
+      in
+      let first_bad = array_first_not_to_satisfy type_checker obj_arr in
+        if first_bad <> (-1) then
+             raise 
+            (Pycaml_exn
+               (Pyerr_TypeError,
+                   Printf.sprintf "%sExpected homogeneous list of %s. Entry %d is of type %s (%s)!"
+                         the_error_label
+                         type_name
+                         (1 + first_bad)
+                         (pytype_name (pytype obj_arr.(first_bad)))
+                         (py_repr obj_arr.(first_bad))))
+        else
+             Array.map unwrapper obj_arr
+
+
+
+let py_float_list_as_array ?error_label ?length arr =
+  py_homogeneous_list_as_array
+    ?error_label ?length
+    "float" (fun x -> pytype x = FloatType) pyfloat_asdouble arr
+
+let py_int_list_as_array ?error_label ?length arr =
+  py_homogeneous_list_as_array
+    ?error_label ?length
+    "int" (fun x -> pytype x = IntType) pyint_asint arr
+
+let py_number_list_as_float_array ?error_label ?length arr =
+  py_homogeneous_list_as_array
+    ?error_label ?length
+    "number" 
+    (fun x -> let ty = pytype x in ty = FloatType || ty = IntType)
+    (fun x -> if pytype x = FloatType then pyfloat_asdouble x else float_of_int (pyint_asint x))
+    arr
+
+
+let py_string_list_as_array ?error_label ?length arr =
+  py_homogeneous_list_as_array
+    ?error_label ?length
+    "string" (fun x -> pytype x = BytesType) pybytes_asstring arr
+
+let py_list_list_as_array ?error_label ?length arr =
+  py_homogeneous_list_as_array
+    ?error_label ?length
+    "<Python List>" (fun x -> pytype x = ListType) (fun x -> x) arr
+
+let py_list_list_as_array2 ?error_label ?length arr =
+  py_homogeneous_list_as_array
+    ?error_label ?length
+    "<Python List>" (fun x -> pytype x = ListType) pylist_toarray arr
+
+
+let py_float_list_list_as_array ?error_label ?length_outer ?length_inner arr =
+  let arr_outer = py_list_list_as_array ?error_label ?length:length_outer arr in
+  Array.map (py_float_list_as_array ?error_label ?length:length_inner) arr_outer
+
+let py_number_list_list_as_float_array ?error_label ?length_outer ?length_inner arr =
+  let arr_outer = py_list_list_as_array ?error_label ?length:length_outer arr in
+  Array.map (py_number_list_as_float_array ?error_label ?length:length_inner) arr_outer
+
+
+let py_int_list_list_as_array ?error_label ?length_outer ?length_inner arr =
+  let arr_outer = py_list_list_as_array ?error_label ?length:length_outer arr in
+  Array.map (py_int_list_as_array ?error_label ?length:length_inner) arr_outer
+
+let py_string_list_list_as_array ?error_label ?length_outer ?length_inner arr =
+  let arr_outer = py_list_list_as_array ?error_label ?length:length_outer arr in
+  Array.map (py_string_list_as_array ?error_label ?length:length_inner) arr_outer
+
+
+(* When registering an OCaml function for Python, we should include
+   quite some extra run-time type checks. Rationale: Python users expect
+   programming errors to produce error messages, not crash the system.
+
+   So, not including these checks would violate the user's expectations.
+
+   The function below helps us wrapping up an OCaml function for
+   calling from python with arg conversion, typechecks, and optional
+   extra checks for individual parameters. Furthermore, we make sure
+   that OCaml exceptions are passed on properly to the Python level.
+*)
+
+(* Actually, this turned out to be not quite as useful as I hoped initially... *)
+let _caml_debug_exceptions () =
+  let ocamlrunparam =
+    try
+      Unix.getenv "OCAMLRUNPARAM"
+    with
+      | Not_found ->
+          try
+            Unix.getenv "CAMLRUNPARAM"
+          with
+            | Not_found -> ""
+  in
+  let pieces = Str.split (Str.regexp ",") ocamlrunparam in
+    try 
+      let _ = List.find (fun p -> p="b") pieces in
+        true
+    with
+      | Not_found -> false
+
+let type_mismatch_exception type_wanted type_here pos exn_name =
+  Pycaml_exn
+       (Pyerr_TypeError,
+        (Printf.sprintf "Argument %d: Type wanted: %s -- Type provided: %s%s."
+               (pos + 1) (* Humans like to start counting at 1. *)
+               (pytype_name type_wanted)
+               (pytype_name type_here)
+               exn_name))
+
+IFDEF PYMAJOR2 THEN
+let sym_match a b =
+  a == b                      (* Note the == for physical equality. *)
+ELSE
+let sym_match a b =
+  a = b
+ENDIF
+
+let pill_type_mismatch_exception ?position ?exn_name wanted gotten =
+  let arg_no =
+    match position with
+      | None -> ""
+      | Some p -> "Argument %d: "
+  in
+  let en =
+    match exn_name with
+      | None -> ""
+      | Some n -> n
+  in
+  Pycaml_exn (Pyerr_TypeError, 
+                         arg_no ^ (Printf.sprintf "Python-Ocaml Pill Type mismatch: wanted: '%s' - got: '%s'" wanted gotten) ^ en)
+
+let ocamlpill_type_of pill =
+  if pytype pill <> CamlpillType then
+    (* may happen if we e.g. look at list entries *)
+    raise (Pycaml_exn(Pyerr_TypeError,
+                        Printf.sprintf "Expected OCaml pill - got: %s (%s)"
+                          (pytype_name (pytype pill))
+                          (py_repr pill)))
+  else
+    let (type_name, _) = pyunwrap_value pill in
+      type_name
+
+let check_pill_type ?position ?exn_name wanted pill =
+  let gotten = ocamlpill_type_of pill in
+    if not (sym_match gotten wanted) then
+      raise (pill_type_mismatch_exception ?position:position ?exn_name:exn_name wanted gotten)
+
+let unpythonizing_function
+    ?name                        (* Will be used in error reporting *)
+    ?(catch_weird_exceptions = true)
+    ?extra_guards (* An array of functions mapping pyobject -> failure_string option *)
+    ?(expect_tuple = false)
+    wanted_types
+    function_body =
+  let exn_name =
+    match name with
+      | None -> ""
+      | Some s -> Printf.sprintf " (%s)" s
+  in
+  let work_fun python_args =
+    let body () =
+      let () =
+        if expect_tuple && pytype python_args <> TupleType then
+                 (* ^ This should never happen! *)
+          raise (Pycaml_exn(Pyerr_TypeError, Printf.sprintf "Weird situation: Non-Tuple function args encountered.%s" exn_name))
+      in
+      let nr_args_given =
+        if expect_tuple then
+          pytuple_size python_args
+        else
+          1
+      in
+      let nr_args_wanted = Array.length wanted_types in
+      let () =
+        if nr_args_given <> nr_args_wanted then
+          raise (Pycaml_exn(Pyerr_IndexError,
+                                           (Printf.sprintf "Args given: %d Wanted: %d%s" nr_args_given nr_args_wanted exn_name)))
+      in
+      let arr_args =
+        if expect_tuple then
+          pytuple_toarray python_args
+        else
+          [| python_args |]
+      in
+      let rec check_types pos =
+           if pos = nr_args_given then
+          function_body arr_args
+           else
+             let type_here = pytype arr_args.(pos) in
+             let type_wanted = wanted_types.(pos) in
+             let () =
+            match type_wanted with
+              | AnyType ->
+                  ()
+              | EitherStringType ->
+                  if type_here <> UnicodeType && type_here <> BytesType then
+                    raise (type_mismatch_exception type_wanted type_here pos exn_name)
+              | CamlpillSubtype sym ->
+                  check_pill_type ~position:pos ~exn_name:exn_name sym arr_args.(pos)
+              | _ ->
+                  if type_here <> type_wanted then
+                           raise (type_mismatch_exception type_wanted type_here pos exn_name)
+             in
+               (* Okay, typecheck succeeded.  Now, if extra guards have
+                  been provided, try those. *)
+               match extra_guards with
+                 | None -> check_types (pos + 1)
+                 | Some guards ->
+                         let guard = guards.(pos) in
+                         let guard_error = guard arr_args.(pos) in
+                           match guard_error with
+                             | None -> check_types (pos+1)
+                             | Some msg ->
+                                     raise (Pycaml_exn
+                                                  (Pyerr_TypeError,
+                                                   (Printf.sprintf "Check for argument %d failed: %s%s"
+                                                      (pos + 1)
+                                                      msg
+                                                      exn_name)))
+      in
+           check_types 0
+    in
+      body ()
+  in
+    work_fun
+
+(* OCaml string encoded in UTF-8 --> Python 3 string type (= Python 2 unicode type) *)
+let pythonize_string s =
+  pyunicode_decodeutf8(s, None)
+
+(* Python 3 string or bytes type --> OCaml string encoded in UTF-8 *)
+let unpythonize_string =
+  unpythonizing_function
+    [| EitherStringType |]
+    begin
+      fun py_args ->
+        let s = py_args.(0) in
+        let t = pytype s in
+          match t with
+            | UnicodeType -> pybytes_asstringandsize (pyunicode_asutf8string s)
+            | BytesType   -> pybytes_asstringandsize s
+            | _ -> assert false
+    end
+
+(* FIX: Maybe rewrite this as an unpythonizing_function. *)
+let python_interfaced_function
+    ?name     (* Will be used in both profiling and error reporting *)
+    ?(catch_weird_exceptions = true)
+    ?doc
+    ?extra_guards (* An array of functions mapping pyobject -> failure_string option *)
+    wanted_types
+    function_body =
+  let wrapper =
+    match doc with
+      | None -> pywrap_closure
+      | Some docstring -> (pywrap_closure_docstring docstring)
+  in
+  let exn_name =
+    match name with
+      | None -> ""
+      | Some s -> Printf.sprintf " (%s)" s
+  in
+  let work_fun python_args =
+    let body () =
+      let () =
+        if pytype python_args <> TupleType then
+                 (* ^ This should never happen! *)
+          raise (Pycaml_exn(Pyerr_TypeError, Printf.sprintf "Weird situation: Non-Tuple function args encountered.%s" exn_name))
+      in
+      let nr_args_given = pytuple_size python_args in
+      let nr_args_wanted = Array.length wanted_types in
+      let () =
+        if nr_args_given <> nr_args_wanted then
+          raise (Pycaml_exn(Pyerr_IndexError,
+                                           (Printf.sprintf "Args given: %d Wanted: %d%s" nr_args_given nr_args_wanted exn_name)))
+      in
+      let arr_args = pytuple_toarray python_args in
+      let rec check_types pos =
+           if pos = nr_args_given then
+          function_body arr_args
+           else
+             let type_here = pytype arr_args.(pos) in
+             let type_wanted = wanted_types.(pos) in
+             let () =
+            match type_wanted with
+              | AnyType ->
+                  ()
+              | EitherStringType ->
+                  if type_here <> UnicodeType && type_here <> BytesType then
+                    raise (type_mismatch_exception type_wanted type_here pos exn_name)
+              | CamlpillSubtype sym ->
+                  check_pill_type ~position:pos ~exn_name:exn_name sym arr_args.(pos)
+              | _ ->
+                  if type_here <> type_wanted then
+                           raise (type_mismatch_exception type_wanted type_here pos exn_name)
+             in
+               (* Okay, typecheck succeeded.  Now, if extra guards have
+                  been provided, try those. *)
+               match extra_guards with
+                 | None -> check_types (pos + 1)
+                 | Some guards ->
+                         let guard = guards.(pos) in
+                         let guard_error = guard arr_args.(pos) in
+                           match guard_error with
+                             | None -> check_types (pos+1)
+                             | Some msg ->
+                                     raise (Pycaml_exn
+                                                  (Pyerr_TypeError,
+                                                   (Printf.sprintf "Check for argument %d failed: %s%s"
+                                                      (pos + 1)
+                                                      msg
+                                                      exn_name)))
+      in
+           check_types 0
+    in
+      if _caml_debug_exceptions () then
+        body () 
+      else
+           try
+             body ()
+           with 
+             | Pycaml_exn (errtype, msg) ->
+                 pycaml_seterror errtype (Printf.sprintf "%s%s" msg exn_name); pynull()
+             | Not_found ->
+                 pycaml_seterror Pyerr_LookupError (Printf.sprintf "OCaml exception 'Not_found'%s" exn_name);
+                 pynull()
+             | Division_by_zero ->
+                 pycaml_seterror Pyerr_ZeroDivisionError (Printf.sprintf "OCaml exception 'Division_by_zero'%s" exn_name);
+                 pynull()
+             | Failure s ->
+                 pycaml_seterror Pyerr_StandardError (Printf.sprintf "OCaml exception 'Failure: %s'%s" s exn_name);
+                 pynull ()
+             | Invalid_argument s ->
+                 pycaml_seterror Pyerr_StandardError (Printf.sprintf "OCaml exception 'Invalid_argument: %s'%s" s exn_name);
+                 pynull()
+             | Out_of_memory ->
+                 pycaml_seterror Pyerr_StandardError (Printf.sprintf "OCaml exception 'Out_of_memory'%s" exn_name);
+                 pynull()
+             | Stack_overflow ->
+                 pycaml_seterror Pyerr_StandardError (Printf.sprintf "OCaml exception 'Stack_overflow'%s" exn_name);
+                 pynull()
+             | Sys_error s ->
+                 pycaml_seterror Pyerr_StandardError (Printf.sprintf "OCaml exception 'Sys_error %s'%s" s exn_name);
+                 pynull()
+             | End_of_file ->
+                 pycaml_seterror Pyerr_IOError (Printf.sprintf "OCaml exception 'End_of_file'%s" exn_name);
+                 pynull()
+             | Match_failure (filename,line,column) ->
+                 pycaml_seterror Pyerr_StandardError (Printf.sprintf "OCaml exception 'Match_failure file=%s line=%d(c. %d)'%s" filename line column exn_name);
+                 pynull()
+             | Assert_failure (filename,line,column) ->
+                 pycaml_seterror Pyerr_StandardError (Printf.sprintf "OCaml exception 'Assert_failure file=%s line=%d(c. %d)'%s" filename line column exn_name);
+                 pynull()
+                       
+             | something_else ->
+                 if catch_weird_exceptions then
+                       begin
+                         pycaml_seterror 
+                           Pyerr_StandardError 
+                           (Printf.sprintf "OCaml weird low-level exception (not resolved any further)%s" exn_name);
+                         pynull()
+                       end
+                 else raise something_else
+  in
+    match name with
+      | None -> wrapper work_fun
+      | Some pname ->
+             let profiling_work_fun args =
+               if not(!_py_profiling_active)
+               then work_fun args
+               else
+                 let t0 = Unix.gettimeofday () in
+                 let result = work_fun args in
+                 let t1 = Unix.gettimeofday () in
+                 let old_time_and_calls =
+                       try Hashtbl.find _py_profile_hash pname
+                       with | Not_found ->
+                         let x = [|0.0;0.0|] in
+                         let () = Hashtbl.add _py_profile_hash pname x in
+                           x
+                 in
+                       begin
+                         old_time_and_calls.(0) <- old_time_and_calls.(0) +.(t1-.t0);
+                         old_time_and_calls.(1) <- old_time_and_calls.(1) +.1.0;
+                         result
+                       end
+             in
+            wrapper profiling_work_fun
+
+(* python_interfaced_function takes a name argument,
+   and indeed it has to, because we want to be able to profile-register
+   also anonymously generated functions.
+
+   On the other hand, we eventually register many of these functions
+   under some particular name in the "ocaml" python module. So, it
+   would be nice to be able to just use the functions' name in the
+   ocaml package as its profiling name. So, what we need is a way to
+   "pre-register" a function, i.e.:
+*)
+
+let python_pre_interfaced_function
+    ?(catch_weird_exceptions=true)
+    ?doc
+    ?extra_guards (* An array of functions mapping pyobject -> failure_string option *)
+    wanted_types function_body =
+  fun name ->
+    python_interfaced_function
+      ~name ?doc ?extra_guards wanted_types function_body
+
+
+(* pywrap_value will wrap up OCaml values for Python in such a way
+   that Python can store this in containers, pass it around, and
+   eventually hand it back to OCaml.
+
+   As python is not statically typed in an OCaml-compatible way, this
+   means that Python may hand back stuff to OCaml which is not of the
+   expected type, without OCaml noticing.
+
+   Again, Python users expect to get errors - not crashes - from
+   programs, so we have to guard against this. How? By implementing
+   some own primitive dynamic type system for python-wrapped OCaml
+   values.
+
+   Note: the conventions here are TF's own. Pycaml users need not use
+   them, but they might be well advised to do so nevertheless.
+
+   Design decisions:
+
+   * OCaml will only provide opaque values of a manageable small
+   number of types to Python.
+
+   * We want to be able to register new types for Python encapsulation
+   at runtime.
+   
+   * We abuse OCaml strings as type tag symbols, which have been
+   uniq'd through an identity hash map.  (B.S.: In the PyCapsule
+   implementation, we use the capsule name field and don't uniq it.)
+
+   * The only values which are wrapped up for python are of the structure
+   (type_tag_string,ref value)
+
+   The ref in the second tuple slot may be a paranoid spurious indirection,
+   but will ensure that we will always have a non-immediate in the second
+   slot.
+
+   * Note: If we use this in conjunction with some other Python foreign-function
+   extension, then it might well happen that a mixup of opaque objects from us
+   and that other extension produces a crash. We MIGHT be able to fix this if we
+   extend the Python interpreter at low level with a new type for our purposes,
+   and do not use PyCObject anymore.
+
+   * It might sound ridiculous, but I consider it a major problem that
+   so far, I could not come up with a nice, catchy name for the
+   concept of python values that wrap up python-opaque ocaml
+   values. Evidently, it is very desirable to have one.
+
+   After a few failed attempts, the least bad name I can come up with is "ocamlpill".
+
+   (B.S.: Personally, I have always liked the name, and now the name
+   is especially good, because an ocamlpill has become a sort of
+   "capsule", PyCapsule.)
+
+   * ocamlpill type names are unique and considered as global. It is desirable
+   to provide a Python function that returns this name, so those names should not be 
+   considered "for internal use only".
+
+*)
+
+(* Mapping name => Unique name. Type names are e.g. "Mesh.mesh". *)
+let _known_ocamlpill_types = ((Hashtbl.create 10):((string, string) Hashtbl.t))
+
+let _ocamlpill_type_sym ocamlpill_type_name =
+  try 
+    Hashtbl.find _known_ocamlpill_types ocamlpill_type_name
+  with
+    | Not_found ->
+       failwith
+         (Printf.sprintf "Used ocamlpill_type '%s' without register_ocamlpill_type(\"%s\")"
+            ocamlpill_type_name ocamlpill_type_name)
+
+let register_ocamlpill_types type_names =
+  Array.iter
+    (fun type_name ->
+      if Hashtbl.mem _known_ocamlpill_types type_name
+      then () (* -- already known *)
+      else 
+       Hashtbl.add _known_ocamlpill_types type_name type_name)
+    type_names
+
+let make_pill_wrapping ocamlpill_type_name prototypical_object =
+  let ocamlpill_type_sym = _ocamlpill_type_sym ocamlpill_type_name in
+  let wrapper x =
+    pywrap_value_pill
+      (ocamlpill_type_sym,
+       if false then
+         prototypical_object (* Type inference uses this object's type. *)
+       else
+         x)
+  in
+  let unwrapper py_value =
+    let (ocamlpill_type_sym_provided, xval) = pyunwrap_value py_value in
+      if not (sym_match ocamlpill_type_sym_provided ocamlpill_type_sym) then
+           raise (pill_type_mismatch_exception ocamlpill_type_sym ocamlpill_type_sym_provided)
+      else
+           let _ =
+             if false then
+            prototypical_object (* Type inference uses this object's type. *)
+             else
+            xval
+           in
+          xval
+  in
+    (wrapper, unwrapper)
+
+let make_ocamlpill_wrapper_unwrapper = make_pill_wrapping
+
+let ocamlpill_hard_unwrap pill =
+  let (_, x) = pyunwrap_value pill in
+    x
+
+
+(* There are situations where we want to provide optional python
+   arguments. For the low-level interface, we use the convention to use a
+   0-element or 1-element list. In most cases, this low-level convention
+   will be wrapped up at a higher level python-wise so that the user of
+   a module just sees an optional argument.
+   
+   This is somewhat tricky: we want to treat optional string/float/int
+   args on the same footing as pill args. How do we do this? By a bit
+   of combinatorical magic! The proper abstraction is to use a
+   continuation function which will receive the unwrapped optional value,
+   and an applicator, which may be some ocamlpill_applicator_for_xyz,
+   or something like (fun py_x f -> f (pyint_asint py_x)), or just
+   evaluate_at.
+
+   Problem here: pyint_asint should also do an extra python typecheck
+   in the example above! Hence, we need certain special applicators
+   for python types...
+*)
+
+let py_optionally unwrapper py_value =
+  (* Usually, the optional thingy comes in as an argument,
+     and is checked in python_interfaced_function.
+     This is not necessarily so, as optional thingies may be
+     part of larger data structures, so we better check the type *)
+  if pytype py_value != ListType
+  then
+    raise
+      (Pycaml_exn
+        (Pyerr_TypeError, 
+         Printf.sprintf "Expected optional argument to be provided as an empty or 1-element list. Got: %s (%s)"
+           (pytype_name (pytype py_value)) (py_repr py_value)))
+  else
+    let a = pylist_toarray py_value in
+    if Array.length a > 1 then
+      raise
+       (Pycaml_exn
+          (Pyerr_TypeError, 
+           Printf.sprintf "Expected optional argument to be provided as an empty or 1-element list. Got: %d-element list (%s)."
+             (Array.length a) (py_repr py_value)))
+    else
+      if Array.length a = 0 then None else Some (unwrapper a.(0))
+
+(* There are a few functions which we may want to use in conjunction with py_optionally to get
+   optional integers, optional floats, etc., and not just optional pills
+*)
+
+let guarded_pyint_asint x =
+  if pytype x <> IntType
+  then raise
+    (Pycaml_exn(Pyerr_TypeError,
+               Printf.sprintf "Wanted: int, got: %s (%s)" (pytype_name (pytype x)) (py_repr x)))
+  else pyint_asint x
+
+let guarded_pyfloat_asfloat x =
+  if pytype x <> FloatType
+  then raise
+    (Pycaml_exn(Pyerr_TypeError,
+               Printf.sprintf "Wanted: float, got: %s (%s)" (pytype_name (pytype x)) (py_repr x)))
+  else pyfloat_asdouble x
+
+let guarded_pynumber_asfloat x =
+  match pytype x with
+    | FloatType -> pyfloat_asdouble x
+    | IntType -> float_of_int (pyint_asint x)
+    | _ ->
+       raise
+         (Pycaml_exn(Pyerr_TypeError,
+                     Printf.sprintf "Wanted: number, got: %s (%s)" (pytype_name (pytype x)) (py_repr x)))
+
+let guarded_pybytes_asstring x =
+  if pytype x <> BytesType
+  then raise
+    (Pycaml_exn(Pyerr_TypeError,
+               Printf.sprintf "Wanted: string, got: %s (%s)" (pytype_name (pytype x)) (py_repr x)))
+  else pybytes_asstring x
+
+let guarded_pylist_toarray x =
+  if pytype x <> ListType
+  then raise
+    (Pycaml_exn(Pyerr_TypeError,
+               Printf.sprintf "Wanted: list, got: %s (%s)" (pytype_name (pytype x)) (py_repr x)))
+  else pylist_toarray x
+
+let guarded_pytuple_toarray x =
+  if pytype x <> TupleType
+  then raise
+    (Pycaml_exn(Pyerr_TypeError,
+               Printf.sprintf "Wanted: tuple, got: %s (%s)" (pytype_name (pytype x)) (py_repr x)))
+  else pytuple_toarray x
+
+
+let pycallable_asfun py =
+  if pytype py <> CallableType 
+  then
+    raise
+      (Pycaml_exn
+        (Pyerr_TypeError, 
+         Printf.sprintf "Expected Python Callable - Got: %s (%s)" (pytype_name (pytype py)) (py_repr py)))
+  else
+    fun (args:(pyobject array)) ->
+      pyeval_callobject(py,pytuple_fromarray args)
+
+
+(* Note: we do not subject the example/low-level python functions we provide here
+   to profiling. Maybe we should.
+*)
+
+let _py_profiling =
+  python_interfaced_function
+    ~doc:"Control profiling of python<->ocaml functions. Usage:
+
+ocaml.sys_profiling(\"on\") -> turn on profiling, return previous on/off status (on=true)
+ocaml.sys_profiling(\"off\") -> turn off profiling, return previous on/off status (on=true)
+ocaml.sys_profiling(\"clear\") -> clear internal profiling tables
+ocaml.sys_profiling(\"report\") -> return profiling report
+
+Report format: list of (name,time,nr_calls), sorted by decreasing total time. 
+nr_calls is a floatingpoint number to overcome 32-bit integer limitations.
+"
+    [|BytesType|]
+    (fun arr ->
+       let s = pybytes_asstring arr.(0) in
+        match s with
+          | "on" ->
+              let z = py_activate_profiling() in
+                if z then py_true () else py_false ()
+          | "off" ->
+              let z = py_activate_profiling() in
+                if z then py_true () else py_false ()
+          | "clear" ->
+              let () = py_profile_reset() in pynone()
+          | "report" ->
+              let r = py_profile_report() in
+                pylist_fromarray
+                  (Array.map 
+                     (fun (name,time,calls) ->
+                        pytuple3 (pybytes_fromstring name,
+                                  pyfloat_fromdouble time,
+                                  pyfloat_fromdouble calls))
+                     r)
+          | _ -> pynone()
+    )
+
+(* We provide a function to python that allows to check the type
+   of an opaque OCaml object.
+*)
+
+let _py_ocamlpill_type =
+  python_interfaced_function [|CamlpillType|]
+    (fun arr ->
+       let (type_name, _) = pyunwrap_value arr.(0)
+       in pybytes_fromstring type_name)
+
+(* Note: using ocaml.sys_python() will return
+   the last value computed interactively.
+ *)
+let _py_python =
+  python_interfaced_function [||]
+    (fun arr ->
+      let _ = python() in
+      python_last_value())
+
+let _py_ipython =
+  python_interfaced_function [||]
+    (fun arr ->
+      let _ = ipython() in
+      python_last_value())
+
+let _py_check_heap =
+  python_interfaced_function
+    [||]
+    (fun arr -> let _ = Gc.full_major () in py_true ())
+
+
+(* -- init -- *)
+
+let _ =
+  begin
+    Callback.register_exception "ocaml_exn_pycaml" (Pycaml_exn (Pyerr_StandardError,""));
+    ignore(pydict_setitemstring (_py_sys_modules, "ocaml", _py_mod_ocaml));
+    ignore(python_eval "import ocaml");
+    register_for_python
+      [|
+       ("sys_profiling",_py_profiling);
+       (* -- This one is very important -- *)
+       ("sys_ocamlpill_type",_py_ocamlpill_type);
+       (* -- This may seem very strange, but actually comes in handy -- *)
+       ("sys_python",_py_python);
+       ("sys_ipython",_py_ipython);
+       ("sys_check_heap",_py_check_heap);
+       ("sys_refcount", 
+        pywrap_closure
+          (fun py_args ->
+             let args = pytuple_toarray py_args in
+               pyint_fromint (pyrefcount args.(0) )));
+
+       (* -- Examples below -- *)
+       ("example_test_interface", 
+        pywrap_closure
+          (fun _ ->
+             begin
+               Printf.printf "This is printed by OCaml, called from Python!\n%!" ;
+               pynone ()
+             end
+          ));
+       ("example_the_answer", pyint_fromint 42);
+      |];
+  end
+
+
+(* --- Example Code --- *)
+
+(* For demonstrative purposes, we include two functions
+   readily wrapped up here.
+*)
+
+(* 
+   Now, let's have fun with this:
+ *)
+
+let _py_make_powers =
+  python_interfaced_function
+    ~extra_guards:
+    [|(fun py_len ->
+            let len = pyint_asint py_len in
+              if len < 0 then
+             Some "Negative Length"
+              else
+             None);
+      (fun _ -> None); (* This check never fails *)
+    |]
+    [|IntType;FloatType|]
+    (fun py_args ->
+       let len = pyint_asint py_args.(0)
+       and pow = pyfloat_asdouble py_args.(1) in
+            float_array_to_python
+              (Array.init len (fun n -> let nn = float_of_int (n+1) in nn**pow)))
+
+let
+    _py_hypotenuse_2d =
+  python_interfaced_function
+    [|FloatType;FloatType|]
+    (fun py_args ->
+       let x = pyfloat_asdouble py_args.(0)
+       and y = pyfloat_asdouble py_args.(1) in
+         pyfloat_fromdouble (sqrt(x*.x+.y*.y)))
+in
+  register_for_python
+    [|("example_make_powers", _py_make_powers);
+      ("example_hypotenuse", _py_hypotenuse_2d);
+    |]
diff --git a/bundles/pycaml/chemoelectric-pycaml-8614105/pycaml_stubs.c b/bundles/pycaml/chemoelectric-pycaml-8614105/pycaml_stubs.c
new file mode 100644 (file)
index 0000000..3275bb1
--- /dev/null
@@ -0,0 +1,2059 @@
+/*
+ * (C) arty 2002
+
+ This library is free software; you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of the
+ License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ USA
+
+
+ Heavy modifications (Bugfixes!) done by T.F.
+
+ See
+
+ http://mail.python.org/pipermail/doc-sig/2001-July/001956.html
+
+ for a discussion of result value stealing and a list of functions where
+ this becomes relevant.
+
+ Further modifications by Barry Schwartz.
+ */
+
+#include <Python.h>
+#include <caml/mlvalues.h>
+#include <caml/memory.h>
+#include <caml/fail.h>
+#include <caml/callback.h>
+#include <caml/custom.h>
+#include <caml/alloc.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include "pycaml_stubs.h"
+
+#if 3 <= PY_MAJOR_VERSION
+#include <wchar.h>
+#if 4 <= PY_MAJOR_VERSION || (PY_MAJOR_VERSION == 3 && 1 <= PY_MINOR_VERSION)
+#define USE_PYCAPSULE 1
+#else
+#define USE_PYCAPSULE 0
+#endif
+#endif
+
+
+static void *xmalloc(size_t size)
+{
+    void *p = malloc(size);
+    if (p == NULL) {
+        fprintf(stderr, "Virtual memory exhausted\n");
+        exit(1);
+    }
+    return p;
+}
+
+#if 3 <= PY_MAJOR_VERSION
+
+static wchar_t *copy_to_wide_string(const char *s)
+{
+    size_t n;
+    wchar_t *ws;
+
+    ws = NULL;
+    n = mbstowcs(NULL, s, 0) + 1;
+    if (n != (size_t) -1) {
+        ws = xmalloc(n * sizeof (wchar_t));
+        mbstowcs(ws, s, n);
+    }
+    return ws;
+}
+
+static size_t multibyte_strlen(const wchar_t *ws)
+{
+    char buffer[MB_CUR_MAX];
+    int i;
+    size_t size;
+    size_t n;
+    mbstate_t ps;
+
+    n = wcrtomb(NULL, L'\0', &ps); /* Initialize the parse state. */
+    size = 0;
+    i = 0;
+    while (size != (size_t) -1 && ws[i] != L'\0') {
+        n = wcrtomb(buffer, ws[i], &ps);
+        if (n != (size_t) -1)
+            size += n;
+        else
+            size = (size_t) -1;
+        i++;
+    }
+    return size;
+}
+
+static char *copy_from_wide_string(const wchar_t *ws)
+{
+    char *s;
+    int i;
+    int j;
+    size_t size;
+    size_t n;
+    mbstate_t ps;
+
+    s = NULL;
+    size = multibyte_strlen(ws);
+    if (size != (size_t) -1) {
+        s = xmalloc((size + 1) * sizeof (char));
+        n = wcrtomb(NULL, L'\0', &ps); /* Initialize the parse state. */
+        j = 0;
+        i = 0;
+        while (ws[i] != L'\0') {
+            n = wcrtomb(s + j, ws[i], &ps);
+            j += n;
+            i++;
+        }
+        s[j] = '\0';
+    }        
+    return s;
+}
+
+#endif /* 3 <= PY_MAJOR_VERSION */
+
+static void *getcustom( value v )
+{
+    return *((void **)Data_custom_val(v));
+}
+
+static void pydecref( value v )
+{
+    if( getcustom(v) ) { 
+        /* printf("GC - pydecref obj 0x%08x to refcount=%d\nOBJ=",getcustom(v),((PyObject *)getcustom(v))->ob_refcnt-1);
+           PyObject_Print((PyObject *)getcustom(v),stdout,0);
+           printf("END OBJ\n");
+           fflush(stdout);
+        */
+        Py_DECREF((PyObject *)getcustom(v));
+    }
+}
+
+#if PY_MAJOR_VERSION <= 2
+
+static int pycompare( value v1, value v2 )
+{
+    int result;
+
+    if (getcustom(v1) && !getcustom(v2))
+        result = -1;
+    else if (getcustom(v2) && !getcustom(v1))
+        result = 1;
+    else if (!getcustom(v1) && !getcustom(v2))
+        result = 0;
+    else
+        PyObject_Cmp((PyObject *)getcustom(v1),
+                     (PyObject *)getcustom(v2), &result);
+    return result;
+}
+
+#else /* PY_MAJOR_VERSION <= 2 */
+
+static int pycompare(value v1, value v2)
+{
+    int result;
+
+    if (getcustom(v1) && !getcustom(v2))
+        result = -1;
+    else if (getcustom(v2) && !getcustom(v1))
+        result = 1;
+    else if (!getcustom(v1) && !getcustom(v2))
+        result = 0;
+    else if (1 == PyObject_RichCompareBool((PyObject *) getcustom(v1),
+                                      (PyObject *) getcustom(v2), Py_EQ))
+        result = 0;
+    else if (1 == PyObject_RichCompareBool((PyObject *) getcustom(v1),
+                                           (PyObject *) getcustom(v2), Py_LT))
+        result = -1;
+    else if (1 == PyObject_RichCompareBool((PyObject *) getcustom(v1),
+                                           (PyObject *) getcustom(v2), Py_GT))
+        result = 1;
+    else
+        result = -1;        /* Is there a better value to put here? */
+
+    return result;
+}
+
+#endif /* PY_MAJOR_VERSION <= 2 */
+
+static long pyhash( value v )
+{
+    if (getcustom(v))
+        return PyObject_Hash((PyObject *)getcustom(v));
+    else
+        return 0L;
+}
+
+static unsigned long pydeserialize( void *dst )
+{
+    return 0L;
+}
+
+struct custom_operations pyops =
+{
+    "PythonObject",
+    pydecref,
+    pycompare,
+    pyhash,
+    custom_serialize_default,
+    pydeserialize
+};
+
+struct custom_operations fnops =
+{
+    "FuncPointer",
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL
+};
+
+static value pywrap(PyObject *obj)
+{
+    CAMLparam0();
+    CAMLlocal1(v);
+
+    if (obj != NULL)
+        Py_INCREF(obj);
+
+    v = caml_alloc_custom( &pyops, sizeof( PyObject * ), 100, 30000000 );
+    *((PyObject **)Data_custom_val(v)) = obj;
+    CAMLreturn(v);
+}
+
+/* T.F.: we may want to pywrap in such a way that we steal the reference: */
+static value pywrap_steal( PyObject *obj )
+{
+    CAMLparam0();
+    CAMLlocal1(v);
+
+    v = caml_alloc_custom( &pyops, sizeof( PyObject * ), 100, 30000000 );
+    *((PyObject **)Data_custom_val(v)) = obj;
+    CAMLreturn(v);
+}
+
+static PyObject *
+pyunwrap( value v )
+{
+    return *((PyObject **)Data_custom_val(v));
+}
+
+#if USE_PYCAPSULE
+
+static void
+caml_destructor(PyObject *v, const char *capsule_name)
+{
+    value *valptr = (value *) PyCapsule_GetPointer(v, capsule_name);
+    caml_remove_global_root(valptr);
+    free(valptr);
+}
+
+static void
+camldestr(PyObject *v)
+{
+    caml_destructor(v, "caml-other");
+}
+
+static void
+camldestr_pill(PyObject *v)
+{
+    caml_destructor(v, "caml-pill");
+}
+
+#else /* USE_PYCAPSULE */
+
+static void
+camldestr(void *v)
+{
+    value *valptr = (value *) v;
+    /* printf("DDD camlwrap remove_global_root(0x%08x)\n",valptr);fflush(stdout); */
+    caml_remove_global_root(valptr);
+    free(v);
+}
+
+static void
+camldestr_pill(void *v, void *unused_dummy_receiving_ocamlpill_token)
+{
+    value *valptr = (value *) v;
+    /* printf("DDD camlwrap remove_global_root(0x%08x)\n",valptr);fflush(stdout); */
+    caml_remove_global_root(valptr);
+    free(v);
+}
+
+#endif /* USE_PYCAPSULE */
+
+/* T.F. Extension: the pill token is a subtle hack:
+
+   One problem is that, as it seems, there are
+   some python objects around which would be regarded as
+   being of OtherType in original PyCaml.
+
+   As these are opaque, we do not really have a good way
+   to discern them from OCaml pills, and passing such an
+   opaque value (which cannot be investigated systematically)
+   where an ocaml pill is expected is bound to result
+   in crashes (which we want to avoid).
+
+   How to get rid of this? We somehow have to be able to properly
+   identify OCaml Pills and extend the python types with CamlType.
+
+   We do this by using the PyCObject_Check to determine c-object type,
+   and abuse the closure parameter that is passed on to the destructor
+   (which can be queried independently, and actually is not used by our
+   destructor) as a token designating OCaml pills.
+
+   Barry Schwartz: PyCapsule has a name field that can be used for
+   identification, in place of the PyCObject hack described above.
+
+*/
+#if !USE_PYCAPSULE
+static const char *ocamlpill_token = "CAML";
+#endif
+
+static PyObject *
+camlwrap(value val, void *aux_str, int size)
+{
+    value *v = (value *) xmalloc(sizeof(value) + size);
+    *v = val;
+    memcpy((void *)v + sizeof(value), aux_str, size);
+    caml_register_global_root(v);
+    /* printf("DDD camlwrap caml_register_global_root(0x%08x)\n",v);fflush(stdout); */
+#if USE_PYCAPSULE
+    return PyCapsule_New(v, "caml-other", camldestr);
+#else
+    return PyCObject_FromVoidPtr(v, camldestr);
+#endif
+}
+
+static PyObject *
+camlwrap_pill(value val, void *aux_str, int size)
+{
+    value *v = (value *) xmalloc(sizeof(value) + size);
+    *v = val;
+    memcpy((void *)v + sizeof(value), aux_str, size);
+    caml_register_global_root(v);
+#if USE_PYCAPSULE
+    return PyCapsule_New(v, "caml-pill", camldestr_pill);
+#else
+    return PyCObject_FromVoidPtrAndDesc(v, (void*)ocamlpill_token, camldestr_pill);
+#endif
+}
+
+
+static void *
+caml_aux(PyObject *obj)
+{
+#if USE_PYCAPSULE
+    value *v = (value *) PyCapsule_GetPointer(obj, "caml-other");
+#else
+    value *v = (value *) PyCObject_AsVoidPtr(obj);
+#endif
+    return (void *) v + sizeof(value);
+}
+
+/*
+PyObject *pycall_callback_buggy( PyObject *obj, PyObject *args ) {
+    value out;
+    value *v;
+    
+    if( !PyCObject_Check(obj) ) {
+       Py_INCREF(Py_None);
+       return Py_None;
+    }
+    v = (value *)PyCObject_AsVoidPtr( obj );
+    out = caml_callback(*v,pywrap(args));
+    return pyunwrap(out);
+}
+*/
+
+/* T.F.: - I think the definition above is flawed...
+   Looking at the definitions of OCAML macros in memory.h,
+   this is how I suppose it should work:
+*/
+
+PyObject *pycall_callback( PyObject *obj, PyObject *args )
+{
+    CAMLparam0();
+    CAMLlocal3(ml_out, ml_func, ml_args);
+    PyObject *out;
+
+#if USE_PYCAPSULE
+    void *p = PyCapsule_GetPointer(obj, "caml-other");
+    if (p == NULL)
+        {
+          Py_INCREF(Py_None);
+          return Py_None;
+        }
+    ml_func = * (value *) p;
+#else
+    if (!PyCObject_Check(obj))
+        {
+          Py_INCREF(Py_None);
+          return Py_None;
+        }
+
+    ml_func = * (value *) PyCObject_AsVoidPtr(obj);
+#endif
+    ml_args = pywrap(args);
+    ml_out = caml_callback(ml_func, ml_args);
+    out = pyunwrap(ml_out);
+    /* T.F.:
+       The result which we have now is borrowed - most probably, 
+       there is only one reference to it which says
+       "I am reachable through the ML heap".
+       We have to properly transfer ownership, and hence
+       see that we own that reference:
+    */
+    Py_XINCREF(out);
+    CAMLreturnT(PyObject *, out);
+}
+
+/*-----------------------------------------------------------------------*/
+
+static FILE *make_FILE(int fd_int)
+{
+    int fd_duplicate;
+
+    fd_duplicate = dup(fd_int);
+    return fdopen(fd_duplicate, "r+");
+}
+
+/*-----------------------------------------------------------------------*/
+
+value pynull(value unit)
+{
+    CAMLparam1(unit);
+    CAMLreturn(pywrap(0));
+}
+
+value pynone(value unit)
+{
+    CAMLparam1(unit);
+    CAMLreturn(pywrap(Py_None));
+}
+
+value py_true(value unit)
+{
+    CAMLparam1(unit);
+    CAMLreturn(pywrap(Py_True));
+}
+
+value py_false(value unit)
+{
+    CAMLparam1(unit);
+    CAMLreturn(pywrap(Py_False));
+}
+
+/*-----------------------------------------------------------------------*/
+
+#define Type1(func)                                          \
+    CAMLprim value func##_wrapper(value unit)                \
+    {                                                        \
+        CAMLparam1(unit);                                    \
+        func();                                              \
+        CAMLreturn(Val_unit);                                \
+    }
+
+Type1(Py_Initialize)
+Type1(Py_Finalize)
+Type1(PyErr_Print)
+Type1(PyErr_Clear)
+Type1(PyImport_Cleanup)
+
+/*-----------------------------------------------------------------------*/
+
+#define Type2(func)                                          \
+    CAMLprim value func##_wrapper(value obj)                 \
+    {                                                        \
+        CAMLparam1(obj);                                     \
+                                                             \
+        func(Int_val(obj));                                  \
+        CAMLreturn(Val_unit);                                \
+    }
+
+Type2(Py_Exit)
+Type2(PyErr_PrintEx)
+
+/*-----------------------------------------------------------------------*/
+
+#if PY_MAJOR_VERSION <= 2
+    
+#define Type3(func)                                          \
+    CAMLprim value func##_wrapper(value obj)                 \
+    {                                                        \
+        CAMLparam1(obj);                                     \
+                                                             \
+        func(String_val(obj));                               \
+        CAMLreturn(Val_unit);                                \
+    }
+
+#else
+
+#define Type3(func)                                          \
+    CAMLprim value func##_wrapper(value obj)                 \
+    {                                                        \
+        CAMLparam1(obj);                                     \
+                                                             \
+        char *s = String_val(obj);                           \
+        wchar_t *ws = copy_to_wide_string(s);                \
+        func(ws);                                            \
+        free(ws);                                            \
+        CAMLreturn(Val_unit);                                \
+    }
+
+#endif
+
+Type3(Py_SetProgramName)
+Type3(Py_SetPythonHome)
+
+/*-----------------------------------------------------------------------*/
+
+#define Type4(func)                                          \
+    CAMLprim value func##_wrapper(value unit)                \
+    {                                                        \
+        CAMLparam1(unit);                                    \
+                                                             \
+        int result = func();                                 \
+        CAMLreturn(Val_int(result));                         \
+    }
+
+Type4(Py_IsInitialized)
+
+#if PY_MAJOR_VERSION <= 2
+Type4(PyEval_GetRestricted)
+#endif
+
+/*-----------------------------------------------------------------------*/
+
+#define Type5(func)                                          \
+    CAMLprim value func##_wrapper(value obj)                 \
+    {                                                        \
+        CAMLparam1(obj);                                     \
+                                                             \
+        int result = func(String_val(obj));                  \
+        CAMLreturn(Val_int(result));                         \
+    }
+
+Type5(PyRun_SimpleString)
+Type5(PyImport_ImportFrozenModule)
+
+/*-----------------------------------------------------------------------*/
+
+/* Perhaps these should take a wrapped (FILE*) as argument instead of
+ * an integer file descriptor. */
+    
+#define Type6(func)                                          \
+    CAMLprim value func##_wrapper(value py_args)             \
+    {                                                        \
+        CAMLparam1(py_args);                                 \
+                                                             \
+        FILE *f = make_FILE(Int_val(Field(py_args, 0)));     \
+        int result = func(f, String_val(Field(py_args, 1))); \
+        fclose(f);                                           \
+        CAMLreturn(Val_int(result));                         \
+    }
+
+Type6(PyRun_AnyFile)
+Type6(PyRun_SimpleFile)
+Type6(PyRun_InteractiveOne)
+Type6(PyRun_InteractiveLoop)
+Type6(Py_FdIsInteractive)
+
+/*-----------------------------------------------------------------------*/
+
+/* Perhaps these should take a wrapped (FILE*) as argument instead of
+ * an integer file descriptor. */
+    
+#define Type7(func)                                             \
+    CAMLprim value func##_wrapper(value py_args)                \
+    {                                                           \
+        CAMLparam1(py_args);                                    \
+                                                                \
+        FILE *f = make_FILE(Int_val(Field(py_args, 0)));        \
+        int result = func(f,                                    \
+                          String_val(Field(py_args, 1)),        \
+                          Int_val(Field(py_args, 2)));          \
+        fclose(f);                                              \
+        CAMLreturn(Val_int(result));                            \
+    }
+
+Type7(PyRun_AnyFileEx)
+Type7(PyRun_SimpleFileEx)
+
+/*-----------------------------------------------------------------------*/
+
+#define Type8(func)                                          \
+    CAMLprim value func##_wrapper(value unit)                \
+    {                                                        \
+        CAMLparam1(unit);                                    \
+        CAMLreturn(caml_copy_string(func()));                \
+    }
+
+#if PY_MAJOR_VERSION <= 2
+#define Type8a Type8
+#else
+#define Type8a(func)                                           \
+    CAMLprim value func##_wrapper(value unit)                  \
+    {                                                          \
+        CAMLparam1(unit);                                      \
+        CAMLlocal1(string);                                    \
+        wchar_t *ws;                                           \
+        char *s;                                               \
+                                                               \
+        ws = func();                                           \
+        if (ws == NULL)                                        \
+            string = pynull(Val_unit);                         \
+        else                                                   \
+            {                                                  \
+                s = copy_from_wide_string(ws);                 \
+                if (s == NULL)                                 \
+                    string = pynull(Val_unit);                 \
+                else                                           \
+                    string = caml_copy_string(s);              \
+            }                                                  \
+        CAMLreturn(string);                                    \
+    }
+#endif
+
+Type8(Py_GetVersion)
+Type8(Py_GetPlatform)
+Type8(Py_GetCopyright)
+Type8(Py_GetCompiler)
+Type8(Py_GetBuildInfo)
+
+Type8a(Py_GetProgramName)
+Type8a(Py_GetPythonHome)
+Type8a(Py_GetProgramFullPath)
+Type8a(Py_GetPrefix)
+Type8a(Py_GetExecPrefix)
+Type8a(Py_GetPath)
+
+/*-----------------------------------------------------------------------*/    
+
+#define Type9(func, wrap_obj)                                   \
+    CAMLprim value func##_wrapper(value py_args)                \
+    {                                                           \
+        CAMLparam1(py_args);                                    \
+                                                                \
+        PyObject *new_obj = func(String_val(Field(py_args, 0)), \
+                                 Int_val(Field(py_args, 1)),    \
+                                 pyunwrap(Field(py_args, 2)),   \
+                                 pyunwrap(Field(py_args, 3)));  \
+        CAMLreturn(wrap_obj(new_obj));                          \
+    }
+
+Type9(PyRun_String, pywrap_steal)
+
+/*-----------------------------------------------------------------------*/
+
+/* Perhaps these should take a wrapped (FILE*) as argument instead of
+ * an integer file descriptor. */
+    
+#define Type10(func, wrap_obj)                                  \
+    CAMLprim value func##_wrapper(value py_args)                \
+    {                                                           \
+        CAMLparam1(py_args);                                    \
+                                                                \
+        FILE *f = make_FILE(Int_val(Field(py_args, 0)));        \
+        PyObject *new_obj = func(f,                             \
+                                 String_val(Field(py_args, 1)), \
+                                 Int_val(Field(py_args, 2)),    \
+                                 pyunwrap(Field(py_args, 3)),   \
+                                 pyunwrap(Field(py_args, 4)));  \
+        fclose(f);                                              \
+        CAMLreturn(wrap_obj(new_obj));                          \
+    }
+
+Type10(PyRun_File, pywrap_steal)
+
+/*-----------------------------------------------------------------------*/
+
+/* Perhaps these should take a wrapped (FILE*) as argument instead of
+ * an integer file descriptor. */
+    
+#define Type11(func, wrap_obj)                                  \
+    CAMLprim value func##_wrapper(value py_args)                \
+    {                                                           \
+        CAMLparam1(py_args);                                    \
+                                                                \
+        FILE *f = make_FILE(Int_val(Field(py_args, 0)));        \
+        PyObject *new_obj = func(f,                             \
+                                 String_val(Field(py_args, 1)), \
+                                 Int_val(Field(py_args, 2)),    \
+                                 pyunwrap(Field(py_args, 3)),   \
+                                 pyunwrap(Field(py_args, 4)),   \
+                                 Int_val(Field(py_args, 5)));   \
+        fclose(f);                                              \
+        CAMLreturn(wrap_obj(new_obj));                          \
+    }
+
+Type11(PyRun_FileEx, pywrap_steal)
+
+/*-----------------------------------------------------------------------*/
+
+#define Type12(func, wrap_obj)                                  \
+    CAMLprim value func##_wrapper(value py_args)                \
+    {                                                           \
+        CAMLparam1(py_args);                                    \
+                                                                \
+        PyObject *new_obj = func(String_val(Field(py_args, 0)), \
+                                 String_val(Field(py_args, 1)), \
+                                 Int_val(Field(py_args, 2)));   \
+        CAMLreturn(wrap_obj(new_obj));                          \
+    }
+
+Type12(Py_CompileString, pywrap_steal)
+
+/*-----------------------------------------------------------------------*/
+
+/* Perhaps these should take a wrapped (FILE*) as argument instead of
+ * an integer file descriptor. */
+    
+#define Type13(func)                                        \
+    CAMLprim value func##_wrapper(value py_args)            \
+    {                                                       \
+        CAMLparam1(py_args);                                \
+                                                            \
+        FILE *f = make_FILE(Int_val(Field(py_args, 1)));    \
+        int result = func(pyunwrap(Field(py_args, 0)),      \
+                          f,                                \
+                          Int_val(Field(py_args, 2)));      \
+        fclose(f);                                          \
+        CAMLreturn(Val_int(result));                        \
+    }
+
+Type13(PyObject_Print)
+
+/*-----------------------------------------------------------------------*/
+
+#define Type_GetSlice(func, wrap_obj)                           \
+    CAMLprim value func##_wrapper(value py_args)                \
+    {                                                           \
+        CAMLparam1(py_args);                                    \
+                                                                \
+        PyObject *new_obj = func(pyunwrap(Field(py_args, 0)),   \
+                                 Int_val(Field(py_args, 1)),    \
+                                 Int_val(Field(py_args, 2)));   \
+        CAMLreturn(wrap_obj(new_obj));                          \
+    }
+
+Type_GetSlice(PySequence_GetSlice, pywrap_steal)
+Type_GetSlice(PyTuple_GetSlice, pywrap_steal)
+
+/*-----------------------------------------------------------------------*/
+
+#define Type14(func, wrap_obj)                      \
+    CAMLprim value func##_wrapper(value obj)        \
+    {                                               \
+        CAMLparam1(obj);                            \
+                                                    \
+        PyObject *new_obj = func(pyunwrap(obj));    \
+        CAMLreturn(wrap_obj(new_obj));              \
+    }
+
+#if PY_MAJOR_VERSION <= 2
+#define Type14a(func, substitute, wrap_obj) Type14(func, wrap_obj)
+#else
+#define Type14a(func, substitute, wrap_obj)             \
+    CAMLprim value func##_wrapper(value obj)            \
+    {                                                   \
+        CAMLparam1(obj);                                \
+                                                        \
+        PyObject *new_obj = substitute(pyunwrap(obj));  \
+        CAMLreturn(wrap_obj(new_obj));                  \
+    }
+#endif    
+
+Type14(PyMethod_Function, pywrap)
+Type14(PyMethod_Self, pywrap)
+Type14(PyModule_GetDict, pywrap)
+
+#if PY_MAJOR_VERSION <= 2
+Type14(PyMethod_Class, pywrap)
+#endif
+
+Type14(PyUnicode_AsUTF8String, pywrap_steal)
+Type14(PyUnicode_AsUTF16String, pywrap_steal)
+Type14(PyUnicode_AsUTF32String, pywrap_steal)
+Type14(PyObject_Repr, pywrap_steal)
+Type14(PyImport_ReloadModule, pywrap_steal)
+Type14(PyImport_Import, pywrap_steal)
+Type14(PyObject_Str, pywrap_steal)
+Type14(PyObject_Type, pywrap_steal)
+Type14(PyDict_Keys, pywrap_steal)
+Type14(PyDict_Values, pywrap_steal)
+Type14(PyDict_Items, pywrap_steal)
+Type14(PyDict_Copy, pywrap_steal)
+Type14(PySequence_Tuple, pywrap_steal)
+Type14(PySequence_List, pywrap_steal)
+Type14(PyNumber_Long, pywrap_steal)
+Type14(PyNumber_Float, pywrap_steal)
+Type14(PyNumber_Negative, pywrap_steal)
+Type14(PyNumber_Positive, pywrap_steal)
+Type14(PyNumber_Absolute, pywrap_steal)
+Type14(PyNumber_Invert, pywrap_steal)
+Type14(PyIter_Next, pywrap_steal)
+
+Type14a(PyObject_Unicode, PyObject_Str, pywrap_steal)
+Type14a(PyNumber_Int, PyNumber_Long, pywrap_steal)
+
+/*-----------------------------------------------------------------------*/
+
+#define Type15(func, wrap_obj)                                      \
+    CAMLprim value func##_wrapper(value py_args)                    \
+    {                                                               \
+        CAMLparam1(py_args);                                        \
+                                                                    \
+        PyObject *new_obj = func(pyunwrap(Field(py_args, 0)),       \
+                                 pyunwrap(Field(py_args, 1)),       \
+                                 Int_val(Field(py_args, 2)));       \
+        CAMLreturn(wrap_obj(new_obj));                              \
+    }
+
+Type15(PyObject_RichCompare, pywrap_steal);
+
+/*-----------------------------------------------------------------------*/
+
+#define Type16(func, wrap_obj)                                      \
+    CAMLprim value func##_wrapper(value py_args)                    \
+    {                                                               \
+        CAMLparam1(py_args);                                        \
+                                                                    \
+        PyObject *new_obj = func(pyunwrap(Field(py_args, 0)),       \
+                                 String_val(Field(py_args, 1)));    \
+        CAMLreturn(wrap_obj(new_obj));                              \
+    }
+
+Type16(PyDict_GetItemString, pywrap)
+
+Type16(PyObject_GetAttrString, pywrap_steal)
+Type16(PySequence_Fast, pywrap_steal)    
+Type16(PyMapping_GetItemString, pywrap_steal)    
+
+/*-----------------------------------------------------------------------*/
+
+#define Type17(func, wrap_obj)                                  \
+    CAMLprim value func##_wrapper(value py_args)                \
+    {                                                           \
+        CAMLparam1(py_args);                                    \
+                                                                \
+        PyObject *new_obj = func(pyunwrap(Field(py_args, 0)),   \
+                                 pyunwrap(Field(py_args, 1)));  \
+        CAMLreturn(wrap_obj(new_obj));                          \
+    }
+
+Type17(PyDict_GetItem, pywrap)
+
+Type17(PyEval_CallObject, pywrap_steal)
+
+#if PY_MAJOR_VERSION <= 2
+Type17(PyBytes_Format, pywrap_steal)
+#endif
+
+#if PY_MAJOR_VERSION <= 2
+Type17(PyInstance_NewRaw, pywrap_steal)
+#endif
+
+Type17(PySequence_Concat, pywrap_steal)
+Type17(PySequence_InPlaceConcat, pywrap_steal)
+
+Type17(PyObject_GetAttr, pywrap_steal)
+Type17(PyObject_GetItem, pywrap_steal)
+
+Type17(PyNumber_Add, pywrap_steal)
+Type17(PyNumber_Subtract, pywrap_steal)
+Type17(PyNumber_Multiply, pywrap_steal)
+Type17(PyNumber_Remainder, pywrap_steal)
+Type17(PyNumber_Divmod, pywrap_steal)
+Type17(PyNumber_TrueDivide, pywrap_steal)
+Type17(PyNumber_FloorDivide, pywrap_steal)
+
+#if PY_MAJOR_VERSION <= 2
+Type17(PyNumber_Divide, pywrap_steal)
+#endif
+
+Type17(PyNumber_Lshift, pywrap_steal)
+Type17(PyNumber_Rshift, pywrap_steal)
+Type17(PyNumber_And, pywrap_steal)
+Type17(PyNumber_Xor, pywrap_steal)
+Type17(PyNumber_Or, pywrap_steal)
+
+Type17(PyNumber_InPlaceAdd, pywrap_steal)
+Type17(PyNumber_InPlaceSubtract, pywrap_steal)
+Type17(PyNumber_InPlaceMultiply, pywrap_steal)
+Type17(PyNumber_InPlaceTrueDivide, pywrap_steal)
+Type17(PyNumber_InPlaceFloorDivide, pywrap_steal)
+Type17(PyNumber_InPlaceRemainder, pywrap_steal)
+Type17(PyNumber_InPlaceLshift, pywrap_steal)
+Type17(PyNumber_InPlaceRshift, pywrap_steal)
+Type17(PyNumber_InPlaceAnd, pywrap_steal)
+Type17(PyNumber_InPlaceXor, pywrap_steal)
+Type17(PyNumber_InPlaceOr, pywrap_steal)
+
+#if PY_MAJOR_VERSION <= 2
+Type17(PyNumber_InPlaceDivide, pywrap_steal)
+#endif
+
+/*-----------------------------------------------------------------------*/
+    
+#define Type18(func)                                            \
+    CAMLprim value func##_wrapper(value obj)                    \
+    {                                                           \
+        CAMLparam1(obj);                                        \
+                                                                \
+        int result = func(pyunwrap(obj));                       \
+        CAMLreturn(Val_int(result));                            \
+     }
+
+Type18(PyObject_IsTrue)
+Type18(PyObject_Not)
+Type18(PyCallable_Check)
+Type18(PyBytes_Size)
+Type18(PyDict_Size)
+Type18(PyTuple_Size)
+Type18(PyErr_ExceptionMatches)
+Type18(PyObject_Size)
+Type18(PyNumber_Check)
+Type18(PySequence_Check)
+Type18(PySequence_Size)
+Type18(PySequence_Length)
+Type18(PyMapping_Check)
+Type18(PyMapping_Size)
+Type18(PyMapping_Length)
+Type18(PyIter_Check)
+Type18(PyUnicode_GetSize)
+
+/*-----------------------------------------------------------------------*/
+
+#define Type19(func)                                            \
+    CAMLprim value func##_wrapper(value py_args)                \
+    {                                                           \
+        CAMLparam1(py_args);                                    \
+                                                                \
+        int result = func(pyunwrap(Field(py_args, 0)),          \
+                          pyunwrap(Field(py_args, 1)));         \
+        CAMLreturn(Val_int(result));                            \
+    }
+
+Type19(PyObject_HasAttr)
+Type19(PyObject_DelItem)
+Type19(PyDict_DelItem)
+Type19(PyErr_GivenExceptionMatches)
+Type19(PySequence_Count)
+Type19(PySequence_Contains)
+Type19(PySequence_In)
+Type19(PySequence_Index)
+Type19(PyMapping_HasKey)
+
+#if PY_MAJOR_VERSION <= 2
+Type19(PyObject_Compare)
+#endif
+
+/*-----------------------------------------------------------------------*/
+
+#define Type20(func)                                                \
+    CAMLprim value func##_wrapper(value py_args)                    \
+    {                                                               \
+        CAMLparam1(py_args);                                        \
+                                                                    \
+        int result = func(pyunwrap(Field(py_args, 0)),              \
+                          pyunwrap(Field(py_args, 1)),              \
+                          Int_val(Field(py_args, 2)));              \
+        CAMLreturn(Val_int(result));                                \
+    }
+
+Type20(PyObject_RichCompareBool)
+
+/*-----------------------------------------------------------------------*/
+
+#define Type21(func)                                                \
+    CAMLprim value func##_wrapper(value py_args)                    \
+    {                                                               \
+        CAMLparam1(py_args);                                        \
+                                                                    \
+        int result = func(pyunwrap(Field(py_args, 0)),              \
+                          String_val(Field(py_args, 1)),            \
+                          pyunwrap(Field(py_args, 2)));             \
+        CAMLreturn(Val_int(result));                                \
+    }
+
+Type21(PyObject_SetAttrString)
+Type21(PyDict_SetItemString)
+Type21(PyMapping_SetItemString)
+
+/*-----------------------------------------------------------------------*/
+
+#define Type22(func)                                                    \
+    CAMLprim value func##_wrapper(value py_args)                        \
+    {                                                                   \
+        CAMLparam1(py_args);                                            \
+                                                                        \
+        int result = func(pyunwrap(Field(py_args, 0)),                  \
+                          String_val(Field(py_args, 1)));               \
+        CAMLreturn(Val_int(result));                                    \
+    }
+
+Type22(PyMapping_HasKeyString)
+Type22(PyObject_HasAttrString)
+Type22(PyDict_DelItemString)
+
+/*-----------------------------------------------------------------------*/
+
+/*
+  Type23 not implemented:
+  PyNumber_Coerce
+  PyNumber_CoerceEx
+*/
+
+/*-----------------------------------------------------------------------*/
+
+#define Type24(func)                                    \
+  CAMLprim value func##_wrapper(value py_args)          \
+  {                                                     \
+      CAMLparam1(py_args);                              \
+                                                        \
+      int result = func(pyunwrap(Field(py_args, 0)),    \
+                        pyunwrap(Field(py_args, 1)),    \
+                        pyunwrap(Field(py_args, 2)));   \
+      CAMLreturn(Val_int(result));                      \
+  }
+
+Type24(PyObject_SetAttr)
+Type24(PyObject_SetItem)
+Type24(PyDict_SetItem)
+
+/*-----------------------------------------------------------------------*/
+
+#define Type25(func)                                        \
+      CAMLprim value func##_wrapper(value obj)              \
+      {                                                     \
+          CAMLparam1(obj);                                  \
+          CAMLreturn(copy_int64(func(pyunwrap(obj))));      \
+      }
+
+#if PY_MAJOR_VERSION <= 2
+#define Type25a(func, substitute) Type25(func)
+#else
+#define Type25a(func, substitute)                               \
+    CAMLprim value func##_wrapper(value obj)                    \
+    {                                                           \
+        CAMLparam1(obj);                                        \
+        CAMLreturn(copy_int64(substitute(pyunwrap(obj))));      \
+    }
+#endif
+
+Type25(PyObject_Hash)
+Type25a(PyInt_AsLong, PyLong_AsLong)
+/*-----------------------------------------------------------------------*/
+
+#define Type26(func, byte_type)                             \
+    CAMLprim value func##_wrapper(value obj)                \
+    {                                                       \
+        CAMLparam1(obj);                                    \
+        CAMLlocal1(string);                                 \
+                                                            \
+        byte_type *s = func(pyunwrap(obj));                 \
+        if (s == NULL)                                      \
+            string = pynull(Val_unit);                      \
+        else                                                \
+            string = caml_copy_string(s);                   \
+        CAMLreturn(string);                                 \
+    }
+
+Type26(PyBytes_AsString, char)
+Type26(PyModule_GetName, const char)
+Type26(PyModule_GetFilename, const char)
+
+/*-----------------------------------------------------------------------*/
+
+#define Type28(func, wrap_obj)                                      \
+    CAMLprim value func##_wrapper(value obj)                        \
+    {                                                               \
+        CAMLparam1(obj);                                            \
+                                                                    \
+        PyObject *result = func(String_val(obj));                   \
+        CAMLreturn(wrap_obj(result));                               \
+    }
+
+Type28(PyImport_AddModule, pywrap)
+
+Type28(PyBytes_FromString, pywrap_steal)
+Type28(PyUnicode_FromString, pywrap_steal)
+Type28(PyModule_New, pywrap_steal)
+Type28(PyImport_ImportModule, pywrap_steal)
+
+/*-----------------------------------------------------------------------*/
+
+#define Type29(func, wrap_obj)                                  \
+    CAMLprim value func##_wrapper(value unit)                   \
+    {                                                           \
+        CAMLparam1(unit);                                       \
+                                                                \
+        PyObject *result = func();                              \
+        CAMLreturn(wrap_obj(result));                           \
+    }
+
+Type29(PyErr_Occurred, pywrap)
+Type29(PyImport_GetModuleDict, pywrap)
+Type29(PyEval_GetBuiltins, pywrap)
+Type29(PyEval_GetGlobals, pywrap)
+Type29(PyEval_GetLocals, pywrap)
+/* Type29(PyEval_GetFrame, pywrap)  -- FIX: Should return wrapped (PyFrameObject*), not wrapped (Object*). */
+
+Type29(PyDict_New, pywrap_steal)
+
+/*-----------------------------------------------------------------------*/
+
+#define Type30(func)                                            \
+    CAMLprim value func##_wrapper(value obj)                    \
+    {                                                           \
+        CAMLparam1(obj);                                        \
+                                                                \
+        func(pyunwrap(obj));                                    \
+        CAMLreturn(Val_unit);                                   \
+    }
+
+Type30(PyDict_Clear)
+Type30(PyErr_SetNone)
+
+/*-----------------------------------------------------------------------*/
+
+/*
+  Type31 -- currently not implemented:
+  PyDict_Next
+*/
+
+/*-----------------------------------------------------------------------*/
+
+#define Type34(func, wrap_obj)                                          \
+    CAMLprim value func##_wrapper(value obj)                            \
+    {                                                                   \
+        CAMLparam1(obj);                                                \
+                                                                        \
+        PyObject *new_obj = func(Int64_val(obj));                       \
+        CAMLreturn(wrap_obj(new_obj));                                  \
+    }
+
+#if PY_MAJOR_VERSION <= 2
+
+#define Type34a(func, substitute, wrap_obj) Type34(func, wrap_obj)
+
+#else
+
+#define Type34a(func, substitute, wrap_obj)                             \
+    CAMLprim value func##_wrapper(value obj)                            \
+    {                                                                   \
+        CAMLparam1(obj);                                                \
+                                                                        \
+        PyObject *new_obj = substitute(Int64_val(obj));                 \
+        CAMLreturn(wrap_obj(new_obj));                                  \
+    }
+
+#endif
+
+Type34a(PyInt_FromLong, PyLong_FromLong, pywrap_steal)
+
+/*-----------------------------------------------------------------------*/
+        
+#define Type35(func)                                                    \
+    CAMLprim value func##_wrapper(value unit)                           \
+    {                                                                   \
+        CAMLparam1(unit);                                               \
+        CAMLreturn(copy_int64(func()));                                 \
+    }
+
+#if PY_MAJOR_VERSION <= 2
+Type35(PyInt_GetMax)
+#endif
+
+Type35(PyImport_GetMagicNumber)
+
+/*-----------------------------------------------------------------------*/
+
+#define Type36(func, wrap_obj)                                          \
+    CAMLprim value func##_wrapper(value obj)                            \
+    {                                                                   \
+        CAMLparam1(obj);                                                \
+                                                                        \
+        PyObject *new_obj = func(Double_val(obj));                      \
+        CAMLreturn(wrap_obj(new_obj));                                  \
+    }
+
+Type36(PyFloat_FromDouble, pywrap_steal)
+
+/*-----------------------------------------------------------------------*/
+
+#define Type37(func)                                                    \
+    CAMLprim value func##_wrapper(value obj)                            \
+    {                                                                   \
+        CAMLparam1(obj);                                                \
+        CAMLreturn(copy_double(func(pyunwrap(obj))));                   \
+    }
+
+Type37(PyFloat_AsDouble)
+
+/*-----------------------------------------------------------------------*/
+
+#define Type39(func, wrap_obj)                                          \
+    CAMLprim value func##_wrapper(value obj)                            \
+    {                                                                   \
+        CAMLparam1(obj);                                                \
+                                                                        \
+        PyObject *new_obj = func(Int_val(obj));                         \
+        CAMLreturn(wrap_obj(new_obj));                                  \
+    }
+
+Type39(PyTuple_New, pywrap_steal);
+
+/*-----------------------------------------------------------------------*/
+
+#define Type40(func, wrap_obj)                                          \
+    CAMLprim value func##_wrapper(value py_args)                        \
+    {                                                                   \
+        CAMLparam1(py_args);                                            \
+                                                                        \
+        PyObject *new_obj = func(pyunwrap(Field(py_args, 0)),           \
+                                 Int_val(Field(py_args, 1)));           \
+        CAMLreturn(wrap_obj(new_obj));                                  \
+    }
+
+Type40(PyTuple_GetItem, pywrap)
+
+Type40(PySequence_InPlaceRepeat, pywrap_steal)
+Type40(PySequence_Repeat, pywrap_steal)
+Type40(PySequence_GetItem, pywrap_steal)
+
+/*-----------------------------------------------------------------------*/
+
+#define Type40b(func)                                                   \
+    CAMLprim value func##_wrapper(value py_args)                        \
+    {                                                                   \
+        CAMLparam1(py_args);                                            \
+                                                                        \
+        int result = func(pyunwrap(Field(py_args, 0)),                  \
+                          Int_val(Field(py_args, 1)));                  \
+        CAMLreturn(Val_int(result));                                    \
+    }
+
+Type40b(PySequence_DelItem)
+
+/*-----------------------------------------------------------------------*/
+
+/* |do_steal| here means: "do we steal the arg[2] reference (which is
+   an OCaml reference)?"  If our function is stealing, we first have
+   to get a reference. */
+
+#define Type41(func, do_steal)                                          \
+    CAMLprim value func##_wrapper(value py_args)                        \
+    {                                                                   \
+        CAMLparam1(py_args);                                            \
+                                                                        \
+        PyObject *x = pyunwrap(Field(py_args, 2));                      \
+        if (do_steal)                                                   \
+            Py_INCREF(x);                                               \
+        CAMLreturn(Val_int(func(pyunwrap(Field(py_args, 0)),            \
+                                Int_val(Field(py_args, 1)),             \
+                                x)));                                   \
+    }
+
+
+Type41(PySequence_SetItem, 0)
+
+Type41(PyTuple_SetItem, 1)
+
+/*-----------------------------------------------------------------------*/
+
+#define Type42(func, wrap_obj)                                  \
+    CAMLprim value func##_wrapper(value py_args)                \
+    {                                                           \
+        CAMLparam1(py_args);                                    \
+                                                                \
+        PyObject *new_obj = func(pyunwrap(Field(py_args, 0)),   \
+                                 pyunwrap(Field(py_args, 1)),   \
+                                 pyunwrap(Field(py_args, 2)));  \
+        CAMLreturn(wrap_obj(new_obj));                          \
+    }
+
+#if PY_MAJOR_VERSION <= 2
+#define Type42a Type42
+#else
+#define Type42a(func, wrap_obj)                                 \
+    CAMLprim value func##_wrapper(value py_args)                \
+    {                                                           \
+        CAMLparam1(py_args);                                    \
+                                                                \
+        PyObject *new_obj = func(pyunwrap(Field(py_args, 0)),   \
+                                 pyunwrap(Field(py_args, 2)));  \
+        CAMLreturn(wrap_obj(new_obj));                          \
+    }
+#endif
+
+Type42(PySlice_New, pywrap_steal)
+Type42(PyEval_CallObjectWithKeywords, pywrap_steal)
+Type42(PyNumber_Power, pywrap_steal)
+Type42(PyNumber_InPlacePower, pywrap_steal)
+
+#if PY_MAJOR_VERSION <= 2
+Type42(PyClass_New, pywrap_steal)
+Type42(PyInstance_New, pywrap_steal)
+#else
+/* Calls the builtin-function: type(name,bases,dict), with the
+ * name of the class, tuples of parent names, and dictionary
+ * with initializations of fields.
+ */
+CAMLprim value PyClass_New_wrapper(value py_args)
+{
+  CAMLparam1(py_args);
+  PyObject *bases = pyunwrap(Field(py_args, 0));
+  PyObject *dict = pyunwrap(Field(py_args, 1));
+  PyObject *name = pyunwrap(Field(py_args, 2));
+  PyObject *new_obj = 
+    PyObject_CallFunctionObjArgs
+    ( (PyObject *) &PyType_Type, name, bases, dict, NULL);
+  CAMLreturn(pywrap_steal(new_obj));
+}
+#endif
+
+Type42a(PyMethod_New, pywrap_steal)
+
+/*-----------------------------------------------------------------------*/
+
+/*
+Type43(PySlice_GetIndices) <-- Not supported in this version.
+*/
+
+/*-----------------------------------------------------------------------*/
+
+#define Type45(func)                                            \
+    CAMLprim value func##_wrapper(value py_args)                \
+    {                                                           \
+        CAMLparam1(py_args);                                    \
+                                                                \
+        func(pyunwrap(Field(py_args, 0)),                       \
+             pyunwrap(Field(py_args, 1)));                      \
+        CAMLreturn(Val_unit);                                   \
+    }
+
+Type45(PyErr_SetObject)
+
+/*-----------------------------------------------------------------------*/
+        
+#define Type46(func)                                            \
+    CAMLprim value func##_wrapper(value py_args)                \
+    {                                                           \
+        CAMLparam1(py_args);                                    \
+                                                                \
+        func(pyunwrap(Field(py_args, 0)),                       \
+             String_val(Field(py_args, 1)));                    \
+        CAMLreturn(Val_unit);                                   \
+    }
+
+Type46(PyErr_SetString)
+
+/*-----------------------------------------------------------------------*/
+    
+#define Type47(func, wrap_obj)                                          \
+    CAMLprim value func##_wrapper(value py_args)                        \
+    {                                                                   \
+        CAMLparam1(py_args);                                            \
+        CAMLlocal1(result);                                             \
+                                                                        \
+        PyObject *obj1 = pyunwrap(Field(py_args, 0));                   \
+        PyObject *obj2 = pyunwrap(Field(py_args, 1));                   \
+        PyObject *obj3 = pyunwrap(Field(py_args, 2));                   \
+        func(&obj1, &obj2, &obj3);                                      \
+        result = caml_alloc_tuple(3);                                   \
+        Store_field(result, 0, wrap_obj(obj1));                         \
+        Store_field(result, 1, wrap_obj(obj2));                         \
+        Store_field(result, 2, wrap_obj(obj3));                         \
+        CAMLreturn(result);                                             \
+    }
+
+Type47(PyErr_Fetch, pywrap_steal)
+Type47(PyErr_NormalizeException, pywrap_steal)
+
+  /*-----------------------------------------------------------------------*/
+
+#define Type48(func)                            \
+  CAMLprim value func##_wrapper(value py_args)  \
+  {                                             \
+      CAMLparam1(py_args);                      \
+                                                \
+      func(pyunwrap(Field(py_args, 0)),         \
+           pyunwrap(Field(py_args, 1)),         \
+           pyunwrap(Field(py_args, 2)));        \
+      CAMLreturn(Val_unit);                     \
+  }
+
+Type48(PyErr_Restore)
+
+/*-----------------------------------------------------------------------*/
+
+
+#define Type49(func, wrap_obj)                                      \
+      CAMLprim value func##_wrapper(value py_args)                  \
+      {                                                             \
+          CAMLparam1(py_args);                                      \
+                                                                    \
+          PyObject *result = func(String_val(Field(py_args, 0)),    \
+                                  pyunwrap(Field(py_args, 1)));     \
+          CAMLreturn(wrap_obj(result));                             \
+      }
+
+Type49(PyImport_ExecCodeModule, pywrap_steal)      
+
+/*-----------------------------------------------------------------------*/
+
+#define Type50(func, wrap_obj)                                      \
+      CAMLprim value func##_wrapper(value py_args)                  \
+      {                                                             \
+          CAMLparam1(py_args);                                      \
+                                                                    \
+          PyObject *result = func(String_val(Field(py_args, 0)),    \
+                                  pyunwrap(Field(py_args, 1)),      \
+                                  String_val(Field(py_args, 2)));   \
+          CAMLreturn(wrap_obj(result));                             \
+      }
+
+Type50(PyImport_ExecCodeModuleEx, pywrap_steal)
+
+/*-----------------------------------------------------------------------*/
+
+#define Type51(func, wrap_obj)                                      \
+      CAMLprim value func##_wrapper(value py_args)                  \
+      {                                                             \
+          CAMLparam1(py_args);                                      \
+                                                                    \
+          PyObject *result = func(String_val(Field(py_args, 0)),    \
+                                  pyunwrap(Field(py_args, 1)),      \
+                                  pyunwrap(Field(py_args, 2)),      \
+                                  pyunwrap(Field(py_args, 3)));     \
+          CAMLreturn(wrap_obj(result));                             \
+      }
+
+Type51(PyImport_ImportModuleEx, pywrap_steal)
+
+/*-----------------------------------------------------------------------*/
+
+#define Type52(func, byte_type)                                 \
+      CAMLprim value func##_wrapper(value obj)                  \
+      {                                                         \
+          CAMLparam1(obj);                                      \
+          CAMLlocal1(string);                                   \
+                                                                \
+          int return_val;                                       \
+          byte_type *buffer;                                    \
+          Py_ssize_t length;                                    \
+                                                                \
+          return_val = func(pyunwrap(obj), &buffer, &length);   \
+          if (return_val == -1) {                               \
+              string = pynull(Val_unit);                        \
+          } else {                                              \
+              string = caml_alloc_string(length);               \
+              memcpy(String_val(string), buffer, length);       \
+          }                                                     \
+          CAMLreturn(string);                                   \
+      }
+
+      Type52(PyBytes_AsStringAndSize, char)
+      Type52(PyObject_AsCharBuffer, const char)
+      Type52(PyObject_AsReadBuffer, const void)
+      Type52(PyObject_AsWriteBuffer, void)
+
+/*-----------------------------------------------------------------------*/
+
+#define Type53(func)                                        \
+      CAMLprim value func##_wrapper(value py_args)          \
+      {                                                     \
+          CAMLparam1(py_args);                              \
+                                                            \
+          int result = func(pyunwrap(Field(py_args, 0)),    \
+                            Int_val(Field(py_args, 1)),     \
+                            Int_val(Field(py_args, 2)),     \
+                            pyunwrap(Field(py_args, 3)));   \
+          CAMLreturn(Val_int(result));                      \
+      }
+
+      Type53(PySequence_SetSlice)
+
+/*-----------------------------------------------------------------------*/
+
+#define Type54(func)                                        \
+      CAMLprim value func##_wrapper(value py_args)          \
+      {                                                     \
+          CAMLparam1(py_args);                              \
+                                                            \
+          int result = func(pyunwrap(Field(py_args, 0)),    \
+                            Int_val(Field(py_args, 1)),     \
+                            Int_val(Field(py_args, 2)));    \
+          CAMLreturn(Val_int(result));                      \
+      }
+
+      Type54(PySequence_DelSlice)
+
+/*-----------------------------------------------------------------------*/
+
+#define TypeUTF8Decoder(func, wrap_obj)                                 \
+    CAMLprim value func##_wrapper(value py_args)                        \
+    {                                                                   \
+        CAMLparam1(py_args);                                            \
+                                                                        \
+        PyObject *result;                                               \
+                                                                        \
+        char *utf8 = String_val(Field(py_args, 0));                     \
+        Py_ssize_t utf8_length = caml_string_length(Field(py_args, 0)); \
+                                                                        \
+        if (Field(py_args, 1) == Val_int(0))                            \
+            result = func(utf8, utf8_length, NULL);                     \
+        else                                                            \
+            result = func(utf8, utf8_length,                            \
+                          String_val(Field(Field(py_args, 1), 0)));     \
+        CAMLreturn(wrap_obj(result));                                   \
+    }
+
+TypeUTF8Decoder(PyUnicode_DecodeUTF8, pywrap_steal)
+
+/*-----------------------------------------------------------------------*/
+
+#define TypeUTF16Decoder(func, wrap_obj)                                \
+    CAMLprim value func##_wrapper(value py_args)                        \
+    {                                                                   \
+        CAMLparam1(py_args);                                            \
+                                                                        \
+        PyObject *result;                                               \
+        char *errors;                                                   \
+                                                                        \
+        char *s = String_val(Field(py_args, 0));                        \
+        Py_ssize_t s_length = caml_string_length(Field(py_args, 0));    \
+                                                                        \
+        if (Field(py_args, 1) == Val_int(0))                            \
+            errors = NULL;                                              \
+        else                                                            \
+            errors = String_val(Field(Field(py_args, 1), 0));           \
+                                                                        \
+        if (Field(py_args, 2) == Val_int(0))                            \
+            result = func(s, s_length, errors, NULL);                   \
+        else {                                                          \
+            int byteorder = Int_val(Field(Field(py_args, 2), 0));       \
+            result = func(s, s_length, errors, &byteorder);             \
+        }                                                               \
+                                                                        \
+        CAMLreturn(wrap_obj(result));                                   \
+    }
+
+TypeUTF16Decoder(PyUnicode_DecodeUTF16, pywrap_steal)
+TypeUTF16Decoder(PyUnicode_DecodeUTF32, pywrap_steal)
+
+/*-----------------------------------------------------------------------*/
+
+CAMLprim value PyUnicode_FromUnicode_wrapper(value closure, value length)
+{
+    CAMLparam2(closure, length);
+    CAMLlocal2(index, val); /* We need named intermediate values for
+                             * garbage collection. */
+
+    Py_ssize_t len = Int_val(length);
+    Py_ssize_t i;
+    PyObject *result;
+
+    result = PyUnicode_FromUnicode(NULL, len);
+    if (result != NULL) {
+        Py_UNICODE *p = PyUnicode_AS_UNICODE(result);
+        for (i = 0; i < len; i++) {
+            index = Val_int(i);
+            val = caml_callback(closure, index);
+            p[i] = Int_val(val) & 0x7FFFFFFF;
+        }
+    }
+
+    CAMLreturn(pywrap_steal(result));
+}
+
+CAMLprim value PyUnicode_AsUnicode_wrapper(value uni)
+{
+    CAMLparam1(uni);
+    CAMLlocal1(result);
+
+    PyObject *py_uni = pyunwrap(uni);
+    Py_UNICODE *p = PyUnicode_AsUnicode(py_uni);
+
+    if (p != NULL) {
+        Py_ssize_t len = PyUnicode_GET_SIZE(py_uni);
+        Py_ssize_t i;
+
+        result = caml_alloc(len, 0);
+        for (i = 0; i < len; i++)
+            Store_field(result, i, Val_int(p[i]));
+    }
+
+    CAMLreturn(result);
+}
+
+/*-----------------------------------------------------------------------*/
+
+/* Value -> Pyobject */
+
+value pywrapvalue( value cb ) {
+    CAMLparam1(cb);
+    CAMLreturn(pywrap_steal(camlwrap(cb,NULL,0)));
+    /* T.F.: camlwrap already gives us a reference. We steal that. */
+}
+
+/* For pills, we use an extension: */
+value pywrapvalue_pill( value cb ) {
+    CAMLparam1(cb);
+    CAMLreturn(pywrap_steal(camlwrap_pill(cb,NULL,0)));
+}
+
+
+value pycaml_seterror(value ml_err,value ml_str)
+{
+  CAMLparam2(ml_err,ml_str);
+  PyObject *err;
+  int nr_err;
+
+  nr_err=Int_val(ml_err);
+
+  switch(nr_err) {
+      case 0:
+          err=PyExc_Exception;
+          break;
+      case 1:
+#if PY_MAJOR_VERSION <= 2
+          err=PyExc_StandardError;
+          break;
+#else
+          /* PyExc_StandardError is obsolete. Maybe it would be better
+           * to raise an OCaml exception. */
+          err=PyExc_Exception;
+          break;
+#endif
+      case 2:
+          err=PyExc_ArithmeticError;
+          break;
+      case 3:
+          err=PyExc_LookupError;
+          break;
+      case 4:
+          err=PyExc_AssertionError;
+          break;
+      case 5:
+          err=PyExc_AttributeError;
+          break;
+      case 6:
+          err=PyExc_EOFError;
+          break;
+      case 7:
+          err=PyExc_EnvironmentError;
+          break;
+      case 8:
+          err=PyExc_FloatingPointError;
+          break;
+      case 9:
+          err=PyExc_IOError;
+          break;
+      case 10:
+          err=PyExc_ImportError;
+          break;
+      case 11:
+          err=PyExc_IndexError;
+          break;
+      case 12:
+          err=PyExc_KeyError;
+          break;
+      case 13:
+          err=PyExc_KeyboardInterrupt;
+          break;
+      case 14:
+          err=PyExc_MemoryError;
+          break;
+      case 15:
+          err=PyExc_NameError;
+          break;
+      case 16:
+          err=PyExc_NotImplementedError;
+          break;
+      case 17:
+          err=PyExc_OSError;
+          break;
+      case 18:
+          err=PyExc_OverflowError;
+          break;
+      case 19:
+          err=PyExc_ReferenceError;
+          break;
+      case 20:
+          err=PyExc_RuntimeError;
+          break;
+      case 21:
+          err=PyExc_SyntaxError;
+          break;
+      case 22:
+          err=PyExc_SystemExit;
+          break;
+      case 23:
+          err=PyExc_TypeError;
+          break;
+      case 24:
+          err=PyExc_ValueError;
+          break;
+      case 25:
+          err=PyExc_ZeroDivisionError;
+          break;
+      default:
+          /* Maybe it would be better here to raise an OCaml
+           * exception. */
+#if PY_MAJOR_VERSION <= 2
+          err=PyExc_StandardError;
+#else
+          err=PyExc_Exception;
+#endif
+  }
+
+  PyErr_SetString(err,String_val(ml_str));
+  CAMLreturn(Val_unit);
+}
+
+value pyunwrapvalue(value cb)
+{
+    CAMLparam1(cb);
+    value *v;
+#if USE_PYCAPSULE
+    v = (value *) PyCapsule_GetPointer(pyunwrap(cb), "caml-pill");
+    if (v == NULL)
+        v = (value *) PyCapsule_GetPointer(pyunwrap(cb), "caml-other");
+#else
+    v = (value *) PyCObject_AsVoidPtr(pyunwrap(cb));
+#endif
+    CAMLreturn(*v);
+}
+
+/* Create the function table */
+
+typedef struct _python_func_table {
+    void *func;
+    int format;
+    int steal_result;
+    char *desc;
+} python_func_table;
+
+int PyRun_SimpleString_(const char *command)
+{
+    return PyRun_SimpleStringFlags(command, NULL);
+}
+
+int PyRun_SimpleFile_(FILE *fp, const char *filename)
+{
+    return PyRun_SimpleFileExFlags(fp, filename, 0, NULL);
+}
+
+int PyRun_AnyFile_(FILE *fp, const char *filename)
+{
+    return PyRun_AnyFileExFlags(fp, filename, 0, NULL);
+}
+
+int PyRun_InteractiveOne_(FILE *fp, const char *filename)
+{
+    return PyRun_InteractiveOneFlags(fp, filename, NULL);
+}
+
+int PyRun_InteractiveLoop_(FILE *fp, const char *filename)
+{
+    return PyRun_InteractiveLoopFlags(fp, filename, NULL);
+}
+
+int PyRun_AnyFileEx_(FILE *fp, const char *filename, int closeit)
+{
+    return PyRun_AnyFileExFlags(fp, filename, closeit, NULL);
+}
+
+int PyRun_SimpleFileEx_(FILE *fp, const char *filename, int closeit)
+{
+    return PyRun_SimpleFileExFlags(fp, filename, closeit, NULL);
+}
+
+PyObject* PyRun_String_(const char *str, int start, PyObject *globals, PyObject *locals)
+{
+    return PyRun_StringFlags(str, start, globals, locals, NULL);
+}
+
+PyObject* PyRun_File_(FILE *fp, const char *filename, int start, PyObject *globals, PyObject *locals)
+{
+    return PyRun_FileExFlags(fp, filename, start, globals, locals, 0, NULL);
+}
+
+PyObject* PyRun_FileEx_(FILE *fp, const char *filename, int start, PyObject *globals, PyObject *locals, int closeit)
+{
+    return PyRun_FileExFlags(fp, filename, start, globals, locals, closeit, NULL);
+}
+
+PyObject* Py_CompileString_(const char *str, const char *filename, int start)
+{
+    return Py_CompileStringFlags(str, filename, start, NULL);
+}
+
+PyObject* PyImport_ImportModuleEx_(char *name, PyObject *globals, PyObject *locals, PyObject *fromlist)
+{
+    return PyImport_ImportModuleLevel(name, globals, locals, fromlist, -1);
+}
+
+enum PycamlTypeLabels { 
+    TupleType = 0,
+    BytesType,
+    UnicodeType,
+    BoolType,
+    IntType,
+    FloatType,
+    ListType,
+    NoneType,
+    CallableType,
+    ModuleType,
+    ClassType,
+    TypeType,
+    DictType,
+    NullType,
+    CamlpillType,
+    OtherType,
+    EitherStringType, /* Signifies that either of BytesType or UnicodeType is allowed. */
+    CamlpillSubtype, /* Signifies that only the particular Camlpill variety is allowed. */
+    AnyType          /* Allow any python object. */
+};
+
+value pytype( value obj ) {
+    CAMLparam1(obj);
+    PyObject *pobj = pyunwrap( obj );
+    if( !pobj ) CAMLreturn(NullType);
+    else if( PyTuple_Check( pobj ) ) CAMLreturn(Val_int(TupleType));
+    else if( PyBytes_Check( pobj ) ) CAMLreturn(Val_int(BytesType));
+    else if( PyUnicode_Check( pobj ) ) CAMLreturn(Val_int(UnicodeType));
+    else if( PyBool_Check( pobj ) ) CAMLreturn(Val_int(BoolType));
+#if PY_MAJOR_VERSION <= 2
+    else if( PyInt_Check( pobj ) ) CAMLreturn(Val_int(IntType));
+#else
+    else if( PyLong_Check( pobj ) ) CAMLreturn(Val_int(IntType));
+#endif
+    else if( PyFloat_Check( pobj ) ) CAMLreturn(Val_int(FloatType));
+    else if( PyList_Check( pobj ) ) CAMLreturn(Val_int(ListType));
+    else if( pobj == Py_None ) CAMLreturn(Val_int(NoneType));
+    else if( PyCallable_Check( pobj ) ) CAMLreturn(Val_int(CallableType));
+    else if( PyModule_Check( pobj ) ) CAMLreturn(Val_int(ModuleType));
+#if PY_MAJOR_VERSION <= 2
+    else if( PyClass_Check( pobj ) ) CAMLreturn(Val_int(ClassType));
+#endif
+    else if( PyType_Check( pobj ) ) CAMLreturn(Val_int(TypeType));
+    else if( PyDict_Check( pobj ) ) CAMLreturn(Val_int(DictType));
+#if USE_PYCAPSULE
+    else if (PyCapsule_IsValid(pobj, "caml-pill"))
+        CAMLreturn(Val_int(CamlpillType));
+#else /* USE_PYCAPSULE */
+    else if (PyCObject_Check(pobj))
+      {
+          void *desc = PyCObject_GetDesc(pobj);
+          if (desc == (void *) ocamlpill_token)
+                  CAMLreturn(Val_int(CamlpillType));
+          else
+                  CAMLreturn(Val_int(OtherType));
+      }
+#endif /* USE_PYCAPSULE */
+    else
+        CAMLreturn(Val_int(OtherType));
+}
+
+value pytuple_fromarray( value array ) {
+    CAMLparam1(array);
+    PyObject *tuple = PyTuple_New(Wosize_val(array));
+    int i;
+    int x;
+
+    for( i = 0; i < Wosize_val(array); i++ )
+      {
+       PyObject *entry;
+       entry=pyunwrap(Field(array,i));
+       /* T.F.:
+          entry's reference count was increased by one because it is visible
+          from within OCaml (and OCaml's GC will take care of decreasing
+          this again upon finalization. But now, we do add another use to
+          entry. So, we have to increase its reference count manually:
+
+          Note that even if tuple contained some python value before
+          (which it does not), we do not have to Py_DECREF the
+          reference count on the old entry, as the PyTuple_SetItem/PyList_SetItem
+          does this of its own! Nice, isn't it?
+       */
+       Py_INCREF(entry);
+       x = PyTuple_SetItem(tuple,i,entry);
+      }
+
+    CAMLreturn(pywrap_steal(tuple));
+}
+
+value pytuple_toarray( value array ) {
+    CAMLparam1(array);
+    PyObject *obj = pyunwrap(array);
+    int i;
+    CAMLlocal1(rv);
+
+    rv = caml_alloc_tuple(PySequence_Size(obj));
+    /* XXX T.F.: actually, using caml_alloc_tuple to get an array is not overly aesthetic... */
+
+    for (i = 0; i < PySequence_Size(obj); i++)
+       Store_field(rv, i, pywrap_steal(PySequence_GetItem(obj, i)));
+
+    CAMLreturn(rv);
+}
+
+value pywrap_closure( value closure ) {
+    CAMLparam1(closure);
+    PyMethodDef ml;
+    PyObject *obj;
+    PyMethodDef *ml_def;
+    ml.ml_name = "anonymous_closure";
+    ml.ml_meth = pycall_callback;
+    ml.ml_flags = 1;
+    ml.ml_doc = "Anonymous closure";
+    obj = camlwrap(closure, &ml, sizeof(ml));
+    ml_def = (PyMethodDef *) caml_aux(obj);
+    CAMLreturn(pywrap_steal(PyCFunction_New(ml_def, obj)));
+}
+
+/*
+value pymodule_initmodule( value name, value funclist ) { ... }
+Removed by T.F., as this piece of code seemed quite buggy....
+*/
+
+/* -- T.F. Extensions -- */
+
+/*
+  In case of "You used it the wrong way" or "this should not happen",
+  we want to be able to just bailout from python into ocaml with an
+  exception.
+
+
+  Note: this is not being used, as we decided to do error handling the
+  other way round: python is in charge, ocaml lies "beneath the surface",
+  so we effectively always bailout into python.
+ */
+
+#if 0
+static int pycaml_raise_error(int type, char *message)
+{
+  CAMLlocal1(ex);
+  ex=caml_alloc_tuple(3);
+  Store_field(ex,0,Val_int(type));
+  Store_field(ex,1,caml_copy_string(message));
+  raise_with_arg(*caml_named_value("ocaml_exn_pycaml"),ex);
+}
+#endif
+
+/* This is just an adjusted copy of pytuple_fromarray. */
+value pylist_fromarray( value array ) {
+    CAMLparam1(array);
+    PyObject *list = PyList_New(Wosize_val(array));
+    int i;
+    int x;
+
+    for( i = 0; i < Wosize_val(array); i++ )
+      {
+       PyObject *entry;
+       entry=pyunwrap(Field(array,i));
+       /* T.F.: See pytuple_fromarray code comments! */
+       Py_INCREF(entry);
+       x = PyList_SetItem(list,i,entry);
+      }
+    CAMLreturn(pywrap_steal(list));
+}
+
+/* We also need it the other way round */
+value pylist_toarray( value pylist ) {
+    CAMLparam1(pylist);
+    PyObject *obj = pyunwrap(pylist);
+    int i,len;
+    CAMLlocal1(rv);
+
+    rv = caml_alloc_tuple( PySequence_Size(obj) );
+
+    len=PySequence_Size(obj);
+
+    for( i = 0; i < len; i++ )
+       Store_field(rv,i,pywrap_steal(PySequence_GetItem(obj,i)));
+
+    CAMLreturn(rv);
+}
+
+value pylist_set( value pylist, value index, value v ) {
+  CAMLparam3(pylist,index,v);
+  PyObject *list, *new_entry;
+  
+  list = pyunwrap(pylist);
+  new_entry=pyunwrap(v);
+  Py_INCREF(new_entry);
+  PyList_SetItem(list,Int_val(index),new_entry);
+  
+  CAMLreturn(Val_unit);
+}
+
+value pylist_get( value pylist, value index) {
+  CAMLparam2(pylist,index);
+  PyObject *list = pyunwrap(pylist);
+  
+  /* T.F.: According to the Python docs, we own the reference produced by
+     PySequence_GetItem. Hence, we have to steal that reference...
+   */
+  CAMLreturn(pywrap_steal(PySequence_GetItem(list,Int_val(index))));
+}
+
+
+
+/* It's nice to have this variant of pywrap_closure */
+value pywrap_closure_docstring(value docstring, value closure) {
+  CAMLparam2(docstring, closure);
+  PyMethodDef ml;
+  PyObject *obj;
+  PyMethodDef *ml_def;
+  ml.ml_name = "anonymous_closure";
+  ml.ml_meth = pycall_callback;
+  ml.ml_flags = 1;
+  ml.ml_doc = String_val(docstring);
+  obj = camlwrap(closure,&ml,sizeof(ml));
+  ml_def = (PyMethodDef *) caml_aux(obj);
+  CAMLreturn(pywrap_steal(PyCFunction_New(ml_def,obj)));
+}
+
+/* Using pyrun_interactiveloop the way it was in the original code
+   may work on some systems, but then just by chance. We have to
+   do this in a cleaner way:
+ */
+value pycaml_prompt(value ml_unit) {
+  CAMLparam1(ml_unit);
+  
+  PyRun_InteractiveLoop(stdin,"<stdin>");
+
+  CAMLreturn(Val_unit);
+}
+
+
+/* The function below is highly useful for debugging! */
+value pyrefcount(value pyobj) {
+  CAMLparam1(pyobj);
+  PyObject *obj = pyunwrap(pyobj);
+  
+  CAMLreturn(Val_int(obj->ob_refcnt));
+}
diff --git a/bundles/pycaml/chemoelectric-pycaml-8614105/pycaml_stubs.h b/bundles/pycaml/chemoelectric-pycaml-8614105/pycaml_stubs.h
new file mode 100644 (file)
index 0000000..8cc81e5
--- /dev/null
@@ -0,0 +1,9 @@
+/* (C) 2005 Dr. Thomas Fischbacher */
+
+/* Provide C stub error codes that match the type pycaml_error definition
+   in pycaml.ml
+ */
+
+#define ERR_PYCAML_ALLOC_FAILED 0
+#define ERR_PYCAML_BAD_PARAMETERS 1
+#define ERR_PYCAML_WEIRD 2
diff --git a/bundles/pycaml/pycaml_0.82-14.debian.tar.gz b/bundles/pycaml/pycaml_0.82-14.debian.tar.gz
deleted file mode 100644 (file)
index 0ad3bec..0000000
Binary files a/bundles/pycaml/pycaml_0.82-14.debian.tar.gz and /dev/null differ
diff --git a/bundles/pycaml/pycaml_0.82.orig.tar.gz b/bundles/pycaml/pycaml_0.82.orig.tar.gz
deleted file mode 100644 (file)
index 4d2d656..0000000
Binary files a/bundles/pycaml/pycaml_0.82.orig.tar.gz and /dev/null differ
diff --git a/bundles/pycaml/python3-compat-fix.patch b/bundles/pycaml/python3-compat-fix.patch
new file mode 100644 (file)
index 0000000..7e2213f
--- /dev/null
@@ -0,0 +1,73 @@
+--- /tmp/chemoelectric-pycaml-8614105/pycaml.ml        2011-10-01 02:05:57.000000000 +0200
++++ chemoelectric-pycaml-8614105/pycaml.ml     2012-04-10 20:20:02.518683959 +0200
+@@ -326,7 +326,11 @@
+ (* Type28 *)
+ external pyimport_addmodule : string -> pyobject = "PyImport_AddModule_wrapper"
+ external pybytes_fromstring : string -> pyobject = "PyBytes_FromString_wrapper"
++IFDEF PYMAJOR2 THEN
+ external pystring_fromstring : string -> pyobject = "PyBytes_FromString_wrapper" (* Legacy support *)
++ELSE
++external pystring_fromstring : string -> pyobject = "PyUnicode_FromString_wrapper" (* Legacy support *)
++ENDIF
+ external pymodule_new : string -> pyobject = "PyModule_New_wrapper"
+ external pyimport_importmodule : string -> pyobject = "PyImport_ImportModule_wrapper"
+@@ -380,15 +384,11 @@
+ (* Type42 *)
+ external pyslice_new : (pyobject * pyobject * pyobject) -> pyobject = "PySlice_New_wrapper"
+-IFDEF PYMAJOR2 THEN
+ external pyclass_new : (pyobject * pyobject * pyobject) -> pyobject = "PyClass_New_wrapper"
++IFDEF PYMAJOR2 THEN
+ external pyinstance_new : (pyobject * pyobject * pyobject) -> pyobject = "PyInstance_New_wrapper"
+ END
+-IFDEF PYMAJOR2 THEN
+ external pymethod_new : (pyobject * pyobject * pyobject) -> pyobject = "PyMethod_New_wrapper"
+-ELSE
+-external pymethod_new : (pyobject * pyobject) -> pyobject = "PyMethod_New_wrapper"
+-END
+ external pyeval_callobjectwithkeywords : (pyobject * pyobject * pyobject) -> pyobject = "PyEval_CallObjectWithKeywords_wrapper"
+ external pynumber_power : (pyobject * pyobject * pyobject) -> pyobject = "PyNumber_Power_wrapper"
+ external pynumber_inplacepower : (pyobject * pyobject * pyobject) -> pyobject = "PyNumber_InPlacePower_wrapper"
+--- /tmp/chemoelectric-pycaml-8614105/pycaml_stubs.c   2011-10-01 02:05:57.000000000 +0200
++++ chemoelectric-pycaml-8614105/pycaml_stubs.c        2012-04-10 20:12:06.871665196 +0200
+@@ -1096,6 +1096,7 @@
+ Type28(PyImport_AddModule, pywrap)
+ Type28(PyBytes_FromString, pywrap_steal)
++Type28(PyUnicode_FromString, pywrap_steal)
+ Type28(PyModule_New, pywrap_steal)
+ Type28(PyImport_ImportModule, pywrap_steal)
+@@ -1300,7 +1301,7 @@
+         CAMLparam1(py_args);                                    \
+                                                                 \
+         PyObject *new_obj = func(pyunwrap(Field(py_args, 0)),   \
+-                                 pyunwrap(Field(py_args, 1)));  \
++                                 pyunwrap(Field(py_args, 2)));  \
+         CAMLreturn(wrap_obj(new_obj));                          \
+     }
+ #endif
+@@ -1313,6 +1314,22 @@
+ #if PY_MAJOR_VERSION <= 2
+ Type42(PyClass_New, pywrap_steal)
+ Type42(PyInstance_New, pywrap_steal)
++#else
++/* Calls the builtin-function: type(name,bases,dict), with the
++ * name of the class, tuples of parent names, and dictionary
++ * with initializations of fields.
++ */
++CAMLprim value PyClass_New_wrapper(value py_args)
++{
++  CAMLparam1(py_args);
++  PyObject *bases = pyunwrap(Field(py_args, 0));
++  PyObject *dict = pyunwrap(Field(py_args, 1));
++  PyObject *name = pyunwrap(Field(py_args, 2));
++  PyObject *new_obj = 
++    PyObject_CallFunctionObjArgs
++    ( (PyObject *) &PyType_Type, name, bases, dict, NULL);
++  CAMLreturn(pywrap_steal(new_obj));
++}
+ #endif
+ Type42a(PyMethod_New, pywrap_steal)
index 3480e3f..3ea2fe4 100644 (file)
@@ -8,9 +8,16 @@ packages are already available.
 
 The packages are unmodified from a particular original version:
 we bundled the original tarballs and build the software from
-these.
+these. In case of some packages we needed a small patch for
+integration in coccinelle.
+
+Note: the pycaml sources were taken from some repository on
+git hub that provided partial python3 support. We still needed
+some intricate patches to solve the non-backwards-compatibility
+issues. If at some point the debian package of pycaml gets
+pyton3 support too, we better switch to that version.
 
 Note: the compilation of these libraries may be tied to
 linux platforms because the Makefiles make assumptions
-about file name convention.
+about file name conventions.
 (dllXXX.so XXX.a etc)
index a288fe0..1db3885 100644 (file)
@@ -13,18 +13,26 @@ ifneq ($(MAKECMDGOALS),distclean)
 include ../../Makefile.config
 endif
 
+OCAMLCFLAGS ?= -g -dtypes
+OPTFLAGS ?= -g -dtypes
+
 VERSION=7.0.5
 SEXPDIR=sexplib-$(VERSION)
 SEXPLIB=$(SEXPDIR)/lib
 SEXPMARKER=$(SEXPDIR)/.marker
 
 PP_CMD=$(CPP) -x c -w -traditional -undef
-OCAMLC_CMD=$(OCAMLC) $(OCAMLCFLAGS) -I $(SEXPLIB) -thread -custom -pp "${PP_CMD}"
+OCAMLC_CMD=$(OCAMLC) $(OCAMLCFLAGS) -I $(SEXPLIB) -thread -pp "${PP_CMD}"
 OCAMLOPT_CMD=$(OCAMLOPT) $(OPTFLAGS) -I $(SEXPLIB) -thread -pp "${PP_CMD}"
 OCAMLDEP_CMD=$(OCAMLDEP) -I $(SEXPLIB) -pp "${PP_CMD}"
 
-all: sexplib.cma META
-all.opt: sexplib.cmxa META
+all: .depend
+       @$(MAKE) all-build
+all-build: .depend $(SEXPMARKER) sexplib.cma META
+
+all.opt: .depend
+       @$(MAKE) all-opt-build
+all-opt-build: .depend $(SEXPMARKER) sexplib.cmxa META
 
 clean:
        rm -f sexplib.cma sexplib.cmxa META \
@@ -47,7 +55,7 @@ $(SEXPDIR).tar.gz:
        @echo "$@ not found. Please download it and drop it in this directory ($(pwd))."
        @false
 
-.PHONEY: all all.opt clean distclean depend
+.PHONEY: all all.opt clean distclean depend depend-build all-build all-opt-build
 
 
 # Sources needed for coccinelle
@@ -57,7 +65,7 @@ MODULES=type parser lexer pre_sexp sexp_intf \
 MLI=$(MODULES:%=$(SEXPLIB)/%.mli)
 SRC=$(MODULES:%=$(SEXPLIB)/%.ml)
 
-# Link
+# Link (produces the .cmi file as well)
 sexplib.cma: .depend $(MLI:.mli=.cmi) $(SRC:.ml=.cmo)
        $(OCAMLC_CMD) -pack -o sexplib.cmo $(SRC:.ml=.cmo)
        $(OCAMLC_CMD) -a -o sexplib.cma sexplib.cmo
@@ -77,7 +85,7 @@ sexplib.cmxa: .depend $(MLI:.mli=.cmi) $(SRC:.ml=.cmx)
        $(OCAMLLEX) -o $@ $<
 
 .ml.mli:
-       $(OCAMLC_CMD) -i $< > $@
+       $(OCAMLC_CMD) -for-pack Sexplib -i $< > $@
 
 .mli.cmi:
        $(OCAMLC_CMD) -for-pack Sexplib -c $<
@@ -92,11 +100,28 @@ META: $(SEXPLIB)/META
        cp $< $@
 
 # the 'depend' target
-.depend depend: $(SEXPMARKER) $(SRC)
+.depend depend: $(SEXPMARKER)
+       @$(MAKE) depend-build
+
+depend-build: $(SEXPMARKER) $(SRC) $(MLI)
        $(OCAMLDEP_CMD) $(SEXPLIB)/*.mli $(SEXPLIB)/*.ml > .depend
 
+# extra dependencies that are needed to generate mli files which
+# are needed for ocamldep
+$(SEXPLIB)/lexer.mli: $(SEXPLIB)/parser.cmi
+$(SEXPLIB)/parser.mli: $(SEXPLIB)/type.cmi
+$(SEXPLIB)/sexp_intf.mli: $(SEXPLIB)/pre_sexp.cmi
+$(SEXPLIB)/conv.mli: $(SEXPLIB)/sexp.cmi
+$(SEXPLIB)/sexp.mli: $(SEXPLIB)/sexp_intf.cmi
+$(SEXPLIB)/pre_sexp.mli: $(SEXPLIB)/lexer.cmi
+$(SEXPLIB)/conv_error.mli: $(SEXPLIB)/conv.cmi
+
 ifneq ($(MAKECMDGOALS),clean)
 ifneq ($(MAKECMDGOALS),distclean)
--include .depend
+ifneq ($(MAKECMDGOALS),depend-build)
+include .depend
+endif
 endif
 endif
+
+include ../../Makefile.common
dissimilarity index 85%
index d44b481..f22e18b 100644 (file)
-(******************************************************************************
- *                             Sexplib                                        *
- *                                                                            *
- * Copyright (C) 2005- Jane Street Holding, LLC                               *
- *    Contact: opensource@janestreet.com                                      *
- *    WWW: http://www.janestreet.com/ocaml                                    *
- *    Author: Markus Mottl                                                    *
- *                                                                            *
- * This library is free software; you can redistribute it and/or              *
- * modify it under the terms of the GNU Lesser General Public                 *
- * License as published by the Free Software Foundation; either               *
- * version 2 of the License, or (at your option) any later version.           *
- *                                                                            *
- * This library is distributed in the hope that it will be useful,            *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU          *
- * Lesser General Public License for more details.                            *
- *                                                                            *
- * You should have received a copy of the GNU Lesser General Public           *
- * License along with this library; if not, write to the Free Software        *
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA  *
- *                                                                            *
- ******************************************************************************)
-
-(** Conv: Utility Module for S-expression Conversions *)
-
-open Bigarray
-
-(** Dummy definitions for "optional" options, lists, and for opaque types *)
-type sexp_bool = bool
-type 'a sexp_option = 'a option
-type 'a sexp_list = 'a list
-type 'a sexp_array = 'a array
-type 'a sexp_opaque = 'a
-
-
-(** {6 Type aliases} *)
-
-type bigstring = Sexp.bigstring
-type float32_vec = (float, float32_elt, fortran_layout) Array1.t
-type float64_vec = (float, float64_elt, fortran_layout) Array1.t
-type vec = float64_vec
-type float32_mat = (float, float32_elt, fortran_layout) Array2.t
-type float64_mat = (float, float64_elt, fortran_layout) Array2.t
-type mat = float64_mat
-
-
-(** {6 Conversion of OCaml-values to S-expressions} *)
-
-val default_string_of_float : (float -> string) ref
-(** [default_string_of_float] reference to the default function used
-    to convert floats to strings.
-
-    Initially set to [fun n -> sprintf "%.20G" n].
-*)
-
-val write_old_option_format : bool ref
-(** [write_old_option_format] reference for the default option format
-    used to write option values.  If set to [true], the old-style option
-    format will be used, the new-style one otherwise.
-
-    Initially set to [true].
-*)
-
-
-val read_old_option_format : bool ref
-(** [read_old_option_format] reference for the default option format
-    used to read option values.  [Of_sexp_error] will be raised
-    with old-style option values if this reference is set to [false].
-    Reading new-style option values is always supported.  Using a global
-    reference instead of changing the converter calling conventions is
-    the only way to avoid breaking old code with the standard macros.
-
-    Initially set to [true].
-*)
-
-(** We re-export a tail recursive map function, because some modules
-    override the standard library functions (e.g. [StdLabels]) which
-    wrecks havoc with the camlp4 extension. *)
-val list_map : ('a -> 'b) -> 'a list -> 'b list
-
-val sexp_of_unit : unit -> Sexp.t
-(** [sexp_of_unit ()] converts a value of type [unit] to an S-expression. *)
-
-val sexp_of_bool : bool -> Sexp.t
-(** [sexp_of_bool b] converts the value [x] of type [bool] to an
-    S-expression. *)
-
-val sexp_of_string : string -> Sexp.t
-(** [sexp_of_bool str] converts the value [str] of type [string] to an
-    S-expression. *)
-
-val sexp_of_char : char -> Sexp.t
-(** [sexp_of_char c] converts the value [c] of type [char] to an
-    S-expression. *)
-
-val sexp_of_int : int -> Sexp.t
-(** [sexp_of_int n] converts the value [n] of type [int] to an
-    S-expression. *)
-
-val sexp_of_float : float -> Sexp.t
-(** [sexp_of_float n] converts the value [n] of type [float] to an
-    S-expression. *)
-
-val sexp_of_int32 : int32 -> Sexp.t
-(** [sexp_of_int32 n] converts the value [n] of type [int32] to an
-    S-expression. *)
-
-val sexp_of_int64 : int64 -> Sexp.t
-(** [sexp_of_int64 n] converts the value [n] of type [int64] to an
-    S-expression. *)
-
-val sexp_of_nativeint : nativeint -> Sexp.t
-(** [sexp_of_nativeint n] converts the value [n] of type [nativeint] to an
-    S-expression. *)
-
-val sexp_of_big_int : Big_int.big_int -> Sexp.t
-(** [sexp_of_big_int n] converts the value [n] of type [Big_int.big_int]
-    to an S-expression. *)
-
-val sexp_of_nat : Nat.nat -> Sexp.t
-(** [sexp_of_nat n] converts the value [n] of type [Nat.nat] to an
-    S-expression. *)
-
-val sexp_of_num : Num.num -> Sexp.t
-(** [sexp_of_num n] converts the value [n] of type [Num.num] to an
-    S-expression. *)
-
-val sexp_of_ratio : Ratio.ratio -> Sexp.t
-(** [sexp_of_ratio n] converts the value [n] of type [Ratio.ratio] to an
-    S-expression. *)
-
-val sexp_of_ref : ('a -> Sexp.t) -> 'a ref -> Sexp.t
-(** [sexp_of_ref conv r] converts the value [r] of type ['a ref] to
-    an S-expression.  Uses [conv] to convert values of type ['a] to an
-    S-expression. *)
-
-val sexp_of_lazy_t : ('a -> Sexp.t) -> 'a lazy_t -> Sexp.t
-(** [sexp_of_lazy_t conv l] converts the value [l] of type ['a lazy_t] to
-    an S-expression.  Uses [conv] to convert values of type ['a] to an
-    S-expression. *)
-
-val sexp_of_option : ('a -> Sexp.t) -> 'a option -> Sexp.t
-(** [sexp_of_option conv opt] converts the value [opt] of type ['a
-    option] to an S-expression.  Uses [conv] to convert values of type
-    ['a] to an S-expression. *)
-
-val sexp_of_pair : ('a -> Sexp.t) -> ('b -> Sexp.t) -> 'a * 'b -> Sexp.t
-(** [sexp_of_pair conv1 conv2 pair] converts a pair to an S-expression.
-    It uses its first argument to convert the first element of the pair,
-    and its second argument to convert the second element of the pair. *)
-
-val sexp_of_triple :
-  ('a -> Sexp.t) -> ('b -> Sexp.t) -> ('c -> Sexp.t) -> 'a * 'b * 'c -> Sexp.t
-(** [sexp_of_triple conv1 conv2 conv3 triple] converts a triple to
-    an S-expression using [conv1], [conv2], and [conv3] to convert its
-    elements. *)
-
-val sexp_of_list : ('a -> Sexp.t) -> 'a list -> Sexp.t
-(** [sexp_of_list conv lst] converts the value [lst] of type ['a
-    list] to an S-expression.  Uses [conv] to convert values of type
-    ['a] to an S-expression. *)
-
-val sexp_of_array : ('a -> Sexp.t) -> 'a array -> Sexp.t
-(** [sexp_of_array conv ar] converts the value [ar] of type ['a
-    array] to an S-expression.  Uses [conv] to convert values of type
-    ['a] to an S-expression. *)
-
-val sexp_of_hashtbl :
-  ('a -> Sexp.t) -> ('b -> Sexp.t) -> ('a, 'b) Hashtbl.t -> Sexp.t
-(** [sexp_of_hashtbl conv_key conv_value htbl] converts the value [htbl]
-    of type [('a, 'b) Hashtbl.t] to an S-expression.  Uses [conv_key]
-    to convert the hashtable keys of type ['a], and [conv_value] to
-    convert hashtable values of type ['b] to S-expressions. *)
-
-val sexp_of_bigstring : bigstring -> Sexp.t
-(** [sexp_of_bigstring bstr] converts a bigstring (character bigarray
-    in C-layout) to an S-expression. *)
-
-val sexp_of_float32_vec : float32_vec -> Sexp.t
-(** [sexp_of_float32_vec vec] converts the one-dimensional bigarray
-    [vec] of 32-bit floats in Fortran-layout to an S-expression. *)
-
-val sexp_of_float64_vec : float64_vec -> Sexp.t
-(** [sexp_of_float64_vec vec] converts the one-dimensional bigarray
-    [vec] of 64-bit floats in Fortran-layout to an S-expression. *)
-
-val sexp_of_vec : vec -> Sexp.t
-(** [sexp_of_vec vec] same as {!Conv.sexp_of_float64_vec}. *)
-
-val sexp_of_float32_mat : float32_mat -> Sexp.t
-(** [sexp_of_float32_mat mat] converts the two-dimensional bigarray
-    [mat] of 32-bit floats in Fortran-layout to an S-expression. *)
-
-val sexp_of_float64_mat : float64_mat -> Sexp.t
-(** [sexp_of_float64_mat mat] converts the two-dimensional bigarray
-    [mat] of 64-bit floats in Fortran-layout to an S-expression. *)
-
-val sexp_of_mat : mat -> Sexp.t
-(** [sexp_of_mat mat] same as {!Conv.sexp_of_float64_mat}. *)
-
-val sexp_of_opaque : 'a -> Sexp.t
-(** [sexp_of_opaque x] converts the value [x] of opaque type to an
-    S-expression.  This means the user need not provide converters,
-    but the result cannot be interpreted. *)
-
-val sexp_of_fun : ('a -> 'b) -> Sexp.t
-(** [sexp_of_fun f] converts the value [f] of function type to a
-    dummy S-expression.  Functions cannot be serialized as S-expressions,
-    but at least a placeholder can be generated for pretty-printing. *)
-
-val string_of__of__sexp_of : ('a -> Sexp.t) -> 'a -> string
-(** [string_of__of__sexp_of conv x] converts the OCaml-value [x] to
-    an S-expression represented as a string by using conversion function
-    [conv]. *)
-
-
-(** {6 Conversion of S-expressions to OCaml-values} *)
-
-exception Of_sexp_error of exn * Sexp.t
-(** [Of_sexp_error (exn, sexp)] the exception raised when an S-expression
-    could not be successfully converted to an OCaml-value. *)
-
-val record_check_extra_fields : bool ref
-(** [record_check_extra_fields] checks for extra (= unknown) fields
-    in record S-expressions. *)
-
-val of_sexp_error : string -> Sexp.t -> 'a
-(** [of_sexp_error reason sexp] @raise Of_sexp_error (Failure reason, sexp). *)
-
-val of_sexp_error_exn : exn -> Sexp.t -> 'a
-(** [of_sexp_error exc sexp] @raise Of_sexp_error (exc, sexp). *)
-
-val unit_of_sexp : Sexp.t -> unit
-(** [unit_of_sexp sexp] converts S-expression [sexp] to a value of type
-    [unit]. *)
-
-val bool_of_sexp : Sexp.t -> bool
-(** [bool_of_sexp sexp] converts S-expression [sexp] to a value of type
-    [bool]. *)
-
-val string_of_sexp : Sexp.t -> string
-(** [string_of_sexp sexp] converts S-expression [sexp] to a value of type
-    [string]. *)
-
-val char_of_sexp : Sexp.t -> char
-(** [char_of_sexp sexp] converts S-expression [sexp] to a value of type
-    [char]. *)
-
-val int_of_sexp : Sexp.t -> int
-(** [int_of_sexp sexp] converts S-expression [sexp] to a value of type
-    [int]. *)
-
-val float_of_sexp : Sexp.t -> float
-(** [float_of_sexp sexp] converts S-expression [sexp] to a value of type
-    [float]. *)
-
-val int32_of_sexp : Sexp.t -> int32
-(** [int32_of_sexp sexp] converts S-expression [sexp] to a value of type
-    [int32]. *)
-
-val int64_of_sexp : Sexp.t -> int64
-(** [int64_of_sexp sexp] converts S-expression [sexp] to a value of type
-    [int64]. *)
-
-val nativeint_of_sexp : Sexp.t -> nativeint
-(** [nativeint_of_sexp sexp] converts S-expression [sexp] to a value
-    of type [nativeint]. *)
-
-val big_int_of_sexp : Sexp.t -> Big_int.big_int
-(** [big_int_of_sexp sexp] converts S-expression [sexp] to a value
-    of type [Big_int.big_int]. *)
-
-val nat_of_sexp : Sexp.t -> Nat.nat
-(** [nat_of_sexp sexp] converts S-expression [sexp] to a value
-    of type [Nat.nat]. *)
-
-val num_of_sexp : Sexp.t -> Num.num
-(** [num_of_sexp sexp] converts S-expression [sexp] to a value
-    of type [Nat.num]. *)
-
-val ratio_of_sexp : Sexp.t -> Ratio.ratio
-(** [ratio_of_sexp sexp] converts S-expression [sexp] to a value
-    of type [Nat.ratio]. *)
-
-val ref_of_sexp : (Sexp.t -> 'a) -> Sexp.t -> 'a ref
-(** [ref_of_sexp conv sexp] converts S-expression [sexp] to a value
-    of type ['a ref] using conversion function [conv], which converts
-    an S-expression to a value of type ['a]. *)
-
-val lazy_t_of_sexp : (Sexp.t -> 'a) -> Sexp.t -> 'a lazy_t
-(** [lazy_t_of_sexp conv sexp] converts S-expression [sexp] to a value
-    of type ['a lazy_t] using conversion function [conv], which converts
-    an S-expression to a value of type ['a]. *)
-
-val option_of_sexp : (Sexp.t -> 'a) -> Sexp.t -> 'a option
-(** [option_of_sexp conv sexp] converts S-expression [sexp] to a value
-    of type ['a option] using conversion function [conv], which converts
-    an S-expression to a value of type ['a]. *)
-
-val pair_of_sexp : (Sexp.t -> 'a) -> (Sexp.t -> 'b) -> Sexp.t -> 'a * 'b
-(** [pair_of_sexp conv1 conv2 sexp] converts S-expression [sexp] to a pair
-    of type ['a * 'b] using conversion functions [conv1] and [conv2],
-    which convert S-expressions to values of type ['a] and ['b]
-    respectively. *)
-
-val triple_of_sexp :
-  (Sexp.t -> 'a) -> (Sexp.t -> 'b) -> (Sexp.t -> 'c) -> Sexp.t -> 'a * 'b * 'c
-(** [triple_of_sexp conv1 conv2 conv3 sexp] converts S-expression [sexp]
-    to a triple of type ['a * 'b * 'c] using conversion functions [conv1],
-    [conv2], and [conv3], which convert S-expressions to values of type
-    ['a], ['b], and ['c] respectively. *)
-
-val list_of_sexp : (Sexp.t -> 'a) -> Sexp.t -> 'a list
-(** [list_of_sexp conv sexp] converts S-expression [sexp] to a value
-    of type ['a list] using conversion function [conv], which converts
-    an S-expression to a value of type ['a]. *)
-
-val array_of_sexp : (Sexp.t -> 'a) -> Sexp.t -> 'a array
-(** [array_of_sexp conv sexp] converts S-expression [sexp] to a value
-    of type ['a array] using conversion function [conv], which converts
-    an S-expression to a value of type ['a]. *)
-
-val hashtbl_of_sexp :
-  (Sexp.t -> 'a) -> (Sexp.t -> 'b) -> Sexp.t -> ('a, 'b) Hashtbl.t
-(** [hashtbl_of_sexp conv_key conv_value sexp] converts S-expression
-    [sexp] to a value of type [('a, 'b) Hashtbl.t] using conversion
-    function [conv_key], which converts an S-expression to hashtable
-    key of type ['a], and function [conv_value], which converts an
-    S-expression to hashtable value of type ['b]. *)
-
-val float32_vec_of_sexp : Sexp.t -> float32_vec
-(** [float32_vec_of_sexp sexp] converts S-expression [sexp] to a
-    one-dimensional bigarray of 32-bit floats in Fortran-layout. *)
-
-val float64_vec_of_sexp : Sexp.t -> float64_vec
-(** [float64_vec_of_sexp sexp] converts S-expression [sexp] to a
-    one-dimensional bigarray of 64-bit floats in Fortran-layout. *)
-
-val vec_of_sexp : Sexp.t -> vec
-(** [vec_of_sexp sexp] same as {!float64_vec_of_sexp}. *)
-
-val float32_mat_of_sexp : Sexp.t -> float32_mat
-(** [float32_mat_of_sexp sexp] converts S-expression [sexp] to a
-    two-dimensional bigarray of 32-bit floats in Fortran-layout. *)
-
-val float64_mat_of_sexp : Sexp.t -> float64_mat
-(** [float64_mat_of_sexp sexp] converts S-expression [sexp] to a
-    two-dimensional bigarray of 64-bit floats in Fortran-layout. *)
-
-val mat_of_sexp : Sexp.t -> mat
-(** [mat_of_sexp sexp] same as {!Conv.float64_mat_of_sexp}. *)
-
-val opaque_of_sexp : Sexp.t -> 'a
-(** [opaque_of_sexp sexp] @raise Of_sexp_error when attempting to
-    convert an S-expression to an opaque value. *)
-
-val fun_of_sexp : Sexp.t -> ('a -> 'b)
-(** [fun_of_sexp sexp] @raise Of_sexp_error when attempting to
-    convert an S-expression to a function. *)
-
-val of_string__of__of_sexp : (Sexp.t -> 'a) -> string -> 'a
-(** [of_string__of__of_sexp conv str] converts the S-expression [str]
-    represented as a string to an OCaml-value by using conversion function
-    [conv]. *)
-
-
-(** Exception converters *)
-
-val sexp_of_exn : exn -> Sexp.t
-(** [sexp_of_exn exc] converts exception [exc] to an S-expression.
-    If no suitable converter is found, the standard converter in
-    [Printexc] will be used to generate an atomic S-expression. *)
-
-val sexp_of_exn_opt : exn -> Sexp.t option
-(** [sexp_of_exn_opt exc] converts exception [exc] to [Some sexp].
-    If no suitable converter is found, [None] is returned instead. *)
-
-module Exn_converter : sig
-  type t  (** Type of handles for exception S-expression converters *)
-
-  val set_max_exn_tags : int -> unit
-  (** [set_max_exn_tags n] sets the maximum number of converters for exceptions
-      with the same template to [n].  If already existing handlers exceed
-      this number, they will remain at their current number until this number
-      is reduced due to garbage collection.  New handlers will not be added
-      until [n] will not be exceeded. *)
-
-  val get_max_exn_tags : unit -> int
-  (** [set_max_exn_tags ()] return the maximum number of converters for
-      exceptions with the same template. *)
-
-  val add_auto : ?finalise : bool -> exn -> (exn -> Sexp.t) -> unit
-  (** [add_auto ?finalise templ sexp_of_exn] registers exception S-expression
-      converter [sexp_of_exn] for exceptions having same constructor as
-      template [templ], unless the number of stored handlers for the given
-      template exceeds [get_max_exn_tags ()], in which case the handler will
-      never be called.  When [sexp_of_exn] is called, the passed exception
-      is guaranteed to match the template.
-
-      NOTE: if the exception belongs to a transient module, e.g. local modules
-      (including functor instantiations), first-class modules, etc., a manually
-      written [sexp_of_exn] must use [Obj.magic] internally to avoid matching
-      or creating the exception, otherwise the handler can never be reclaimed
-      once the exception ceases to exist.  If [finalise] is [true], then
-      the exception will be automatically registered for removal with the GC
-      (default).  Finalisation will not work with exceptions that have been
-      allocated outside the heap, which is the case for some standard ones
-      e.g. [Sys_error].
-
-      NOTE: Use with great caution, this function is primarily intended for
-      automated use!  If unsure, use [add_slow] instead.
-
-      @param finalise default = [true]
-  *)
-
-  val add_slow : (exn -> Sexp.t option) -> t
-  (** [add_slow sexp_of_exn] registers exception S-expression converter
-      [sexp_of_exn] and returns a handle.  Exception converters registered this
-      way are much slower than with [add], but this function does not require
-      an exception template.  NOTE: if you call this function explicitly,
-      or the "sexp"-macro for exceptions from within local modules, you will
-      eventually have to unregister it manually with {!del}, otherwise there
-      is a space leak! *)
-
-  val del_slow : t -> unit
-  (** [del_slow handle] unregisters exception S-expression converter with
-      handle [handle].  In multi-threaded contexts it is not guaranteed
-      that the unregistered converter will not be called after this function
-      returns. *)
-end
+type sexp_bool = bool
+type 'a sexp_option = 'a option
+type 'a sexp_list = 'a list
+type 'a sexp_array = 'a array
+type 'a sexp_opaque = 'a
+type bigstring = Sexp.bigstring
+type float32_vec =
+    (float, Bigarray.float32_elt, Bigarray.fortran_layout) Bigarray.Array1.t
+type float64_vec =
+    (float, Bigarray.float64_elt, Bigarray.fortran_layout) Bigarray.Array1.t
+type vec = float64_vec
+type float32_mat =
+    (float, Bigarray.float32_elt, Bigarray.fortran_layout) Bigarray.Array2.t
+type float64_mat =
+    (float, Bigarray.float64_elt, Bigarray.fortran_layout) Bigarray.Array2.t
+type mat = float64_mat
+val default_string_of_float : (float -> string) ref
+val read_old_option_format : bool ref
+val write_old_option_format : bool ref
+val list_map : ('a -> 'b) -> 'a list -> 'b list
+val sexp_of_unit : unit -> Sexp.t
+val sexp_of_bool : bool -> Sexp.t
+val sexp_of_string : string -> Sexp.t
+val sexp_of_char : char -> Sexp.t
+val sexp_of_int : int -> Sexp.t
+val sexp_of_float : float -> Sexp.t
+val sexp_of_int32 : int32 -> Sexp.t
+val sexp_of_int64 : int64 -> Sexp.t
+val sexp_of_nativeint : nativeint -> Sexp.t
+val sexp_of_big_int : Big_int.big_int -> Sexp.t
+val sexp_of_nat : Nat.nat -> Sexp.t
+val sexp_of_num : Num.num -> Sexp.t
+val sexp_of_ratio : Ratio.ratio -> Sexp.t
+val sexp_of_ref : ('a -> 'b) -> 'a ref -> 'b
+val sexp_of_lazy_t : ('a -> 'b) -> 'a Lazy.t -> 'b
+val sexp_of_option : ('a -> Sexp.t) -> 'a option -> Sexp.t
+val sexp_of_pair : ('a -> Sexp.t) -> ('b -> Sexp.t) -> 'a * 'b -> Sexp.t
+val sexp_of_triple :
+  ('a -> Sexp.t) ->
+  ('b -> Sexp.t) -> ('c -> Sexp.t) -> 'a * 'b * 'c -> Sexp.t
+val sexp_of_list : ('a -> Sexp.t) -> 'a list -> Sexp.t
+val sexp_of_array : ('a -> Sexp.t) -> 'a array -> Sexp.t
+val sexp_of_hashtbl :
+  ('a -> Sexp.t) -> ('b -> Sexp.t) -> ('a, 'b) Hashtbl.t -> Sexp.t
+val sexp_of_float_vec : (float, 'a, 'b) Bigarray.Array1.t -> Sexp.t
+val sexp_of_bigstring : bigstring -> Sexp.t
+val sexp_of_float32_vec : float32_vec -> Sexp.t
+val sexp_of_float64_vec : float64_vec -> Sexp.t
+val sexp_of_vec : vec -> Sexp.t
+val sexp_of_float_mat :
+  (float, 'a, Bigarray.fortran_layout) Bigarray.Array2.t -> Sexp.t
+val sexp_of_float32_mat : float32_mat -> Sexp.t
+val sexp_of_float64_mat : float64_mat -> Sexp.t
+val sexp_of_mat : mat -> Sexp.t
+val sexp_of_opaque : 'a -> Sexp.t
+val sexp_of_fun : 'a -> Sexp.t
+val string_of__of__sexp_of : ('a -> Sexp.t) -> 'a -> string
+module Exn_converter :
+  sig
+    type t = int64
+    module Ids :
+      sig
+        type key = Int64.t
+        type 'a t = 'a Map.Make(Int64).t
+        val empty : 'a t
+        val is_empty : 'a t -> bool
+        val mem : key -> 'a t -> bool
+        val add : key -> 'a -> 'a t -> 'a t
+        val singleton : key -> 'a -> 'a t
+        val remove : key -> 'a t -> 'a t
+        val merge :
+          (key -> 'a option -> 'b option -> 'c option) ->
+          'a t -> 'b t -> 'c t
+        val compare : ('a -> 'a -> int) -> 'a t -> 'a t -> int
+        val equal : ('a -> 'a -> bool) -> 'a t -> 'a t -> bool
+        val iter : (key -> 'a -> unit) -> 'a t -> unit
+        val fold : (key -> 'a -> 'b -> 'b) -> 'a t -> 'b -> 'b
+        val for_all : (key -> 'a -> bool) -> 'a t -> bool
+        val exists : (key -> 'a -> bool) -> 'a t -> bool
+        val filter : (key -> 'a -> bool) -> 'a t -> 'a t
+        val partition : (key -> 'a -> bool) -> 'a t -> 'a t * 'a t
+        val cardinal : 'a t -> int
+        val bindings : 'a t -> (key * 'a) list
+        val min_binding : 'a t -> key * 'a
+        val max_binding : 'a t -> key * 'a
+        val choose : 'a t -> key * 'a
+        val split : key -> 'a t -> 'a t * 'a option * 'a t
+        val find : key -> 'a t -> 'a
+        val map : ('a -> 'b) -> 'a t -> 'b t
+        val mapi : (key -> 'a -> 'b) -> 'a t -> 'b t
+      end
+    val exn_id_cnt : Ids.key ref
+    val exn_handlers : (exn -> Sexp.t option) Ids.t ref
+    val add_slow : (exn -> Sexp.t option) -> Ids.key
+    val del_slow : Ids.key -> unit
+    exception Found_sexp_opt of Sexp.t option
+    val find_slow : exn -> Sexp.t option
+    module Int : sig type t = int val compare : int -> int -> int end
+    module Addrs :
+      sig
+        type key = Int.t
+        type 'a t = 'a Map.Make(Int).t
+        val empty : 'a t
+        val is_empty : 'a t -> bool
+        val mem : key -> 'a t -> bool
+        val add : key -> 'a -> 'a t -> 'a t
+        val singleton : key -> 'a -> 'a t
+        val remove : key -> 'a t -> 'a t
+        val merge :
+          (key -> 'a option -> 'b option -> 'c option) ->
+          'a t -> 'b t -> 'c t
+        val compare : ('a -> 'a -> int) -> 'a t -> 'a t -> int
+        val equal : ('a -> 'a -> bool) -> 'a t -> 'a t -> bool
+        val iter : (key -> 'a -> unit) -> 'a t -> unit
+        val fold : (key -> 'a -> 'b -> 'b) -> 'a t -> 'b -> 'b
+        val for_all : (key -> 'a -> bool) -> 'a t -> bool
+        val exists : (key -> 'a -> bool) -> 'a t -> bool
+        val filter : (key -> 'a -> bool) -> 'a t -> 'a t
+        val partition : (key -> 'a -> bool) -> 'a t -> 'a t * 'a t
+        val cardinal : 'a t -> int
+        val bindings : 'a t -> (key * 'a) list
+        val min_binding : 'a t -> key * 'a
+        val max_binding : 'a t -> key * 'a
+        val choose : 'a t -> key * 'a
+        val split : key -> 'a t -> 'a t * 'a option * 'a t
+        val find : key -> 'a t -> 'a
+        val map : ('a -> 'b) -> 'a t -> 'b t
+        val mapi : (key -> 'a -> 'b) -> 'a t -> 'b t
+      end
+    type weak_repr = (Obj.t Weak.t * (exn -> Sexp.t)) Ids.t
+    val exn_addr_map :
+      (int * (Obj.t Weak.t * (exn -> Sexp.t)) Ids.t) Addrs.t ref
+    val get_exn_tag : exn -> Obj.t
+    val get_exn_tag_str_addr : Obj.t -> int
+    val get_exn_str_addr : exn -> int
+    val clean_up_handler : Ids.key -> Obj.t -> unit
+    val fast_id_cnt : Ids.key ref
+    exception Found_sexp of Sexp.t
+    val max_exn_tags : int ref
+    val set_max_exn_tags : int -> unit
+    val get_max_exn_tags : unit -> int
+    val add_auto : ?finalise:bool -> exn -> (exn -> Sexp.t) -> unit
+    val find_auto : exn -> Sexp.t option
+  end
+val sexp_of_exn_opt : exn -> Sexp.t option
+val sexp_of_exn : exn -> Sexp.t
+val exn_to_string : exn -> string
+exception Of_sexp_error of exn * Pre_sexp.t
+val record_check_extra_fields : bool ref
+val of_sexp_error_exn : exn -> Pre_sexp.t -> 'a
+val of_sexp_error : string -> Pre_sexp.t -> 'a
+val unit_of_sexp : Sexp.t -> unit
+val bool_of_sexp : Sexp.t -> bool
+val string_of_sexp : Sexp.t -> string
+val char_of_sexp : Sexp.t -> char
+val int_of_sexp : Sexp.t -> int
+val float_of_sexp : Sexp.t -> float
+val int32_of_sexp : Sexp.t -> int32
+val int64_of_sexp : Sexp.t -> int64
+val nativeint_of_sexp : Sexp.t -> nativeint
+val big_int_of_sexp : Sexp.t -> Big_int.big_int
+val nat_of_sexp : Sexp.t -> Nat.nat
+val num_of_sexp : Sexp.t -> Num.num
+val ratio_of_sexp : Sexp.t -> Ratio.ratio
+val ref_of_sexp : ('a -> 'b) -> 'a -> 'b ref
+val lazy_t_of_sexp : ('a -> 'b) -> 'a -> 'b Lazy.t
+val option_of_sexp : (Sexp.t -> 'a) -> Sexp.t -> 'a option
+val pair_of_sexp : (Sexp.t -> 'a) -> (Sexp.t -> 'b) -> Sexp.t -> 'a * 'b
+val triple_of_sexp :
+  (Sexp.t -> 'a) ->
+  (Sexp.t -> 'b) -> (Sexp.t -> 'c) -> Sexp.t -> 'a * 'b * 'c
+val list_of_sexp : (Sexp.t -> 'a) -> Sexp.t -> 'a list
+val array_of_sexp : (Sexp.t -> 'a) -> Sexp.t -> 'a array
+val hashtbl_of_sexp :
+  (Sexp.t -> 'a) -> (Sexp.t -> 'b) -> Sexp.t -> ('a, 'b) Hashtbl.t
+val bigstring_of_sexp :
+  Sexp.t ->
+  (char, Bigarray.int8_unsigned_elt, Bigarray.c_layout) Bigarray.Array1.t
+val float_vec_of_sexp :
+  (float, 'a, 'b) Bigarray.Array1.t ->
+  (int -> (float, 'a, 'b) Bigarray.Array1.t) ->
+  Sexp.t -> (float, 'a, 'b) Bigarray.Array1.t
+val create_float32_vec :
+  int ->
+  (float, Bigarray.float32_elt, Bigarray.fortran_layout) Bigarray.Array1.t
+val create_float64_vec :
+  int ->
+  (float, Bigarray.float64_elt, Bigarray.fortran_layout) Bigarray.Array1.t
+val empty_float32_vec :
+  (float, Bigarray.float32_elt, Bigarray.fortran_layout) Bigarray.Array1.t
+val empty_float64_vec :
+  (float, Bigarray.float64_elt, Bigarray.fortran_layout) Bigarray.Array1.t
+val float32_vec_of_sexp :
+  Sexp.t ->
+  (float, Bigarray.float32_elt, Bigarray.fortran_layout) Bigarray.Array1.t
+val float64_vec_of_sexp :
+  Sexp.t ->
+  (float, Bigarray.float64_elt, Bigarray.fortran_layout) Bigarray.Array1.t
+val vec_of_sexp :
+  Sexp.t ->
+  (float, Bigarray.float64_elt, Bigarray.fortran_layout) Bigarray.Array1.t
+val check_too_much_data : Pre_sexp.t -> 'a list -> 'b -> 'b
+val float_mat_of_sexp :
+  (int -> int -> (float, 'a, Bigarray.fortran_layout) Bigarray.Array2.t) ->
+  Sexp.t -> (float, 'a, Bigarray.fortran_layout) Bigarray.Array2.t
+val create_float32_mat :
+  int ->
+  int ->
+  (float, Bigarray.float32_elt, Bigarray.fortran_layout) Bigarray.Array2.t
+val create_float64_mat :
+  int ->
+  int ->
+  (float, Bigarray.float64_elt, Bigarray.fortran_layout) Bigarray.Array2.t
+val float32_mat_of_sexp :
+  Sexp.t ->
+  (float, Bigarray.float32_elt, Bigarray.fortran_layout) Bigarray.Array2.t
+val float64_mat_of_sexp :
+  Sexp.t ->
+  (float, Bigarray.float64_elt, Bigarray.fortran_layout) Bigarray.Array2.t
+val mat_of_sexp :
+  Sexp.t ->
+  (float, Bigarray.float64_elt, Bigarray.fortran_layout) Bigarray.Array2.t
+val opaque_of_sexp : Pre_sexp.t -> 'a
+val fun_of_sexp : Pre_sexp.t -> 'a
+val of_string__of__of_sexp : (Sexp.t -> 'a) -> string -> 'a
+val get_flc_error : string -> string * int * int -> Sexp.t
diff --git a/bundles/sexplib/sexplib-7.0.5/lib/conv_error.mli b/bundles/sexplib/sexplib-7.0.5/lib/conv_error.mli
new file mode 100644 (file)
index 0000000..5b8dda8
--- /dev/null
@@ -0,0 +1,26 @@
+val tuple_of_size_n_expected : string -> int -> Pre_sexp.t -> 'a
+val stag_no_args : string -> Pre_sexp.t -> 'a
+val stag_incorrect_n_args : string -> string -> Pre_sexp.t -> 'a
+val stag_takes_args : string -> Pre_sexp.t -> 'a
+val nested_list_invalid_sum : string -> Pre_sexp.t -> 'a
+val empty_list_invalid_sum : string -> Pre_sexp.t -> 'a
+val unexpected_stag : string -> Pre_sexp.t -> 'a
+val record_only_pairs_expected : string -> Pre_sexp.t -> 'a
+val record_superfluous_fields :
+  what:string -> loc:string -> string list -> Pre_sexp.t -> 'a
+val record_duplicate_fields : string -> string list -> Pre_sexp.t -> 'a
+val record_extra_fields : string -> string list -> Pre_sexp.t -> 'a
+val record_get_undefined_loop : string list -> (bool * string) list -> string
+val record_undefined_elements :
+  string -> Pre_sexp.t -> (bool * string) list -> 'a
+val record_list_instead_atom : string -> Pre_sexp.t -> 'a
+val record_poly_field_value : string -> Pre_sexp.t -> 'a
+exception No_variant_match of string * Sexp.t
+val no_variant_match : string -> Sexp.t -> 'a
+val no_matching_variant_found : string -> Pre_sexp.t -> 'a
+val ptag_no_args : string -> Pre_sexp.t -> 'a
+val ptag_incorrect_n_args : string -> string -> Pre_sexp.t -> 'a
+val nested_list_invalid_poly_var : string -> Pre_sexp.t -> 'a
+val empty_list_invalid_poly_var : string -> Pre_sexp.t -> 'a
+val silly_type : string -> Pre_sexp.t -> 'a
+val empty_type : string -> Pre_sexp.t -> 'a
diff --git a/bundles/sexplib/sexplib-7.0.5/lib/pre_sexp.mli b/bundles/sexplib/sexplib-7.0.5/lib/pre_sexp.mli
new file mode 100644 (file)
index 0000000..74c6a7e
--- /dev/null
@@ -0,0 +1,316 @@
+type t = Type.t = Atom of string | List of t list
+exception Of_sexp_error of exn * t
+type bigstring =
+    (char, Bigarray.int8_unsigned_elt, Bigarray.c_layout) Bigarray.Array1.t
+val default_indent : int ref
+val is_special_char : char -> bool
+val must_escape : string -> bool
+val maybe_esc_str : string -> string
+val pp_maybe_esc_str : Format.formatter -> string -> unit
+val pp_hum_indent : int -> Format.formatter -> t -> unit
+val pp_hum_rest : int -> Format.formatter -> t list -> unit
+val pp_mach_internal : bool -> Format.formatter -> t -> bool
+val pp_mach_rest : bool -> Format.formatter -> t list -> unit
+val pp_hum : Format.formatter -> t -> unit
+val pp_mach : Format.formatter -> t -> unit
+val pp : Format.formatter -> t -> unit
+val size_loop : int * int -> t -> int * int
+val size : t -> int * int
+val to_buffer_hum : buf:Buffer.t -> ?indent:int -> t -> unit
+val to_buffer_mach : buf:Buffer.t -> t -> unit
+val to_buffer : buf:Buffer.t -> t -> unit
+val buffer : unit -> Buffer.t
+val with_new_buffer : out_channel -> (Buffer.t -> 'a) -> unit
+val output_hum : out_channel -> t -> unit
+val output_hum_indent : int -> out_channel -> t -> unit
+val output_mach : out_channel -> t -> unit
+val output : out_channel -> t -> unit
+val save_of_output :
+  ?perm:Unix.file_perm -> (out_channel -> 'a -> 'b) -> string -> 'a -> unit
+val output_sexp_nl : (out_channel -> 'a -> 'b) -> out_channel -> 'a -> unit
+val save_hum : ?perm:Unix.file_perm -> string -> t -> unit
+val save_mach : ?perm:Unix.file_perm -> string -> t -> unit
+val save : ?perm:Unix.file_perm -> string -> t -> unit
+val output_sexps_nl :
+  (out_channel -> 'a -> 'b) -> out_channel -> 'a list -> unit
+val save_sexps_hum : ?perm:Unix.file_perm -> string -> t list -> unit
+val save_sexps_mach : ?perm:Unix.file_perm -> string -> t list -> unit
+val save_sexps : ?perm:Unix.file_perm -> string -> t list -> unit
+val to_string_hum : ?indent:int -> t -> string
+val to_string_mach : t -> string
+val to_string : t -> string
+val scan_sexp : ?buf:Buffer.t -> Lexing.lexbuf -> Type.t
+val scan_sexps : ?buf:Buffer.t -> Lexing.lexbuf -> Type.t list
+val get_main_buf : Buffer.t option -> Lexing.lexbuf -> Parser.token
+val scan_fold_sexps :
+  ?buf:Buffer.t -> f:('a -> Type.t -> 'a) -> init:'a -> Lexing.lexbuf -> 'a
+val scan_iter_sexps :
+  ?buf:Buffer.t -> f:(Type.t -> unit) -> Lexing.lexbuf -> unit
+val scan_sexps_conv :
+  ?buf:Buffer.t -> f:(Type.t -> 'a) -> Lexing.lexbuf -> 'a list
+module Annot :
+  sig
+    type pos = { line : int; col : int; offset : int; }
+    type range = { start_pos : pos; end_pos : pos; }
+    type t = Atom of range * Type.t | List of range * t list * Type.t
+    type 'a conv = [ `Error of exn * t | `Result of 'a ]
+    exception Conv_exn of string * exn
+    type stack = {
+      mutable positions : pos list;
+      mutable stack : t list list;
+    }
+    val get_sexp : t -> Type.t
+    val get_range : t -> range
+    exception Annot_sexp of t
+    val find_sexp : t -> Type.t -> t option
+  end
+module Parse_pos :
+  sig
+    type t = {
+      mutable text_line : int;
+      mutable text_char : int;
+      mutable global_offset : int;
+      mutable buf_pos : int;
+    }
+    val create :
+      ?text_line:int ->
+      ?text_char:int -> ?buf_pos:int -> ?global_offset:int -> unit -> t
+    val with_buf_pos : t -> int -> t
+  end
+type ('a, 'b) parse_result =
+    Done of 'b * Parse_pos.t
+  | Cont of bool * ('a, 'b) parse_fun
+and ('a, 'b) parse_fun = pos:int -> len:int -> 'a -> ('a, 'b) parse_result
+type 'a parse_state = {
+  parse_pos : Parse_pos.t;
+  mutable pstack : 'a;
+  pbuf : Buffer.t;
+}
+type parse_error = {
+  location : string;
+  err_msg : string;
+  parse_state :
+    [ `Annot of Annot.stack parse_state | `Sexp of t list list parse_state ];
+}
+exception Parse_error of parse_error
+val bump_text_line : 'a parse_state -> unit
+val bump_text_pos : 'a parse_state -> unit
+val bump_pos_cont :
+  'a parse_state ->
+  'b ->
+  max_pos:'c ->
+  pos:int -> ('a parse_state -> 'b -> max_pos:'c -> pos:int -> 'd) -> 'd
+val bump_line_cont :
+  'a parse_state ->
+  'b ->
+  max_pos:'c ->
+  pos:int -> ('a parse_state -> 'b -> max_pos:'c -> pos:int -> 'd) -> 'd
+val add_bump :
+  ('a parse_state -> 'b) ->
+  'a parse_state ->
+  'c ->
+  max_pos:'d ->
+  pos:int ->
+  char -> ('a parse_state -> 'c -> max_pos:'d -> pos:int -> 'e) -> 'e
+val add_bump_pos :
+  'a parse_state ->
+  'b ->
+  max_pos:'c ->
+  pos:int ->
+  char -> ('a parse_state -> 'b -> max_pos:'c -> pos:int -> 'd) -> 'd
+val add_bump_line :
+  'a parse_state ->
+  'b ->
+  max_pos:'c ->
+  pos:int ->
+  char -> ('a parse_state -> 'b -> max_pos:'c -> pos:int -> 'd) -> 'd
+val set_parse_pos : Parse_pos.t -> int -> unit
+val mk_parse_pos : 'a parse_state -> int -> Parse_pos.t
+val raise_parse_error :
+  [ `Annot of Annot.stack parse_state | `Sexp of t list list parse_state ] ->
+  string -> int -> string -> 'a
+val raise_unexpected_char :
+  [ `Annot of Annot.stack parse_state | `Sexp of t list list parse_state ] ->
+  string -> int -> char -> 'a
+val parse_str :
+  ?parse_pos:Parse_pos.t -> ?len:int -> string -> (string, t) parse_result
+val parse :
+  ?parse_pos:Parse_pos.t -> ?len:int -> string -> (string, t) parse_result
+val get_glob_ofs : Parse_pos.t -> int -> int
+val mk_annot_pos : Parse_pos.t -> int -> Annot.pos
+val mk_annot_pos1 : Parse_pos.t -> int -> Annot.pos
+val add_annot_pos : Annot.stack parse_state -> int -> unit
+val add_annot_pos1 : Annot.stack parse_state -> int -> unit
+val get_annot_range : Annot.stack parse_state -> int -> Annot.range
+val mk_annot_atom : Annot.stack parse_state -> string -> int -> Annot.t
+val mk_annot_list : Annot.stack parse_state -> Annot.t list -> int -> Annot.t
+val init_annot_pstate : unit -> Annot.stack
+val parse_str_annot :
+  ?parse_pos:Parse_pos.t ->
+  ?len:int -> string -> (string, Annot.t) parse_result
+val parse_bigstring :
+  ?parse_pos:Parse_pos.t ->
+  ?len:int -> bigstring -> (bigstring, t) parse_result
+val bump_found_atom :
+  (Annot.stack parse_state -> 'a) ->
+  Annot.stack parse_state ->
+  'b ->
+  max_pos:'c ->
+  pos:int ->
+  (Annot.stack parse_state ->
+   'b -> max_pos:'c -> pos:int -> ('d, Annot.t) parse_result) ->
+  ('d, Annot.t) parse_result
+val check_str_bounds : string -> pos:int -> len:int -> bigstring -> int
+val mk_cont :
+  string ->
+  (Annot.stack parse_state ->
+   bigstring -> max_pos:int -> pos:int -> (bigstring, 'a) parse_result) ->
+  Annot.stack parse_state -> (bigstring, 'a) parse_result
+val parse_nl :
+  Annot.stack parse_state ->
+  bigstring -> max_pos:int -> pos:int -> (bigstring, Annot.t) parse_result
+val parse_comment :
+  Annot.stack parse_state ->
+  bigstring -> max_pos:int -> pos:int -> (bigstring, Annot.t) parse_result
+val parse_atom :
+  Annot.stack parse_state ->
+  bigstring -> max_pos:int -> pos:int -> (bigstring, Annot.t) parse_result
+val reg_parse_quoted :
+  Annot.stack parse_state ->
+  bigstring -> max_pos:int -> pos:int -> (bigstring, Annot.t) parse_result
+val parse_quoted :
+  Annot.stack parse_state ->
+  bigstring -> max_pos:int -> pos:int -> (bigstring, Annot.t) parse_result
+val parse_quoted_nl :
+  Annot.stack parse_state ->
+  bigstring -> max_pos:int -> pos:int -> (bigstring, Annot.t) parse_result
+val parse_escaped :
+  Annot.stack parse_state ->
+  bigstring -> max_pos:int -> pos:int -> (bigstring, Annot.t) parse_result
+val parse_skip_ws :
+  Annot.stack parse_state ->
+  bigstring -> max_pos:int -> pos:int -> (bigstring, Annot.t) parse_result
+val parse_skip_ws_nl :
+  Annot.stack parse_state ->
+  bigstring -> max_pos:int -> pos:int -> (bigstring, Annot.t) parse_result
+val parse_dec :
+  Annot.stack parse_state ->
+  bigstring ->
+  max_pos:int ->
+  pos:int -> count:int -> d:int -> (bigstring, Annot.t) parse_result
+val parse_hex :
+  Annot.stack parse_state ->
+  bigstring ->
+  max_pos:int ->
+  pos:int -> count:int -> d:int -> (bigstring, Annot.t) parse_result
+val parse_bigstring_annot :
+  ?parse_pos:Parse_pos.t ->
+  ?len:int -> bigstring -> (bigstring, Annot.t) parse_result
+val mk_this_parse :
+  ?parse_pos:Parse_pos.t ->
+  (?parse_pos:Parse_pos.t -> ?len:'a -> 'b -> 'c) ->
+  pos:int -> len:'a -> 'b -> 'c
+val gen_input_sexp :
+  (?parse_pos:Parse_pos.t -> ?len:int -> string -> (string, 'a) parse_result) ->
+  ?parse_pos:Parse_pos.t -> in_channel -> 'a
+val input_sexp : ?parse_pos:Parse_pos.t -> in_channel -> t
+val gen_input_rev_sexps :
+  (?parse_pos:Parse_pos.t -> ?len:int -> string -> (string, 'a) parse_result) ->
+  ?parse_pos:Parse_pos.t -> ?buf:string -> in_channel -> 'a list
+val input_rev_sexps :
+  ?parse_pos:Parse_pos.t -> ?buf:string -> in_channel -> t list
+val input_sexps :
+  ?parse_pos:Parse_pos.t -> ?buf:string -> in_channel -> t list
+val of_string_bigstring :
+  string ->
+  ('a -> ('b, 'c) parse_result) ->
+  'b -> ('a -> int) -> ('a -> int -> int -> string) -> 'a -> 'c
+val of_string : string -> t
+val get_bstr_sub_str :
+  (char, 'a, 'b) Bigarray.Array1.t -> int -> int -> string
+val bstr_ws_buf :
+  (char, Bigarray.int8_unsigned_elt, Bigarray.c_layout) Bigarray.Array1.t
+val of_bigstring : bigstring -> t
+val gen_load_rev_sexps :
+  (?parse_pos:'a -> ?buf:'b -> in_channel -> 'c) -> ?buf:'b -> string -> 'c
+val load_rev_sexps : ?buf:string -> string -> t list
+val load_sexps : ?buf:string -> string -> t list
+val gen_load_sexp :
+  (?parse_pos:Parse_pos.t -> ?len:int -> string -> (string, 'a) parse_result) ->
+  ?strict:bool -> ?buf:string -> string -> 'a
+val load_sexp : ?strict:bool -> ?buf:string -> string -> t
+module Annotated :
+  sig
+    type pos = Annot.pos = { line : int; col : int; offset : int; }
+    type range = Annot.range = { start_pos : pos; end_pos : pos; }
+    type t =
+      Annot.t =
+        Atom of range * Type.t
+      | List of range * t list * Type.t
+    type 'a conv = [ `Error of exn * t | `Result of 'a ]
+    exception Conv_exn of string * exn
+    type stack =
+      Annot.stack = {
+      mutable positions : pos list;
+      mutable stack : t list list;
+    }
+    val get_sexp : t -> Type.t
+    val get_range : t -> range
+    exception Annot_sexp of t
+    val find_sexp : t -> Type.t -> t option
+    val parse :
+      ?parse_pos:Parse_pos.t ->
+      ?len:int -> string -> (string, Annot.t) parse_result
+    val parse_bigstring :
+      ?parse_pos:Parse_pos.t ->
+      ?len:int -> bigstring -> (bigstring, Annot.t) parse_result
+    val input_rev_sexps :
+      ?parse_pos:Parse_pos.t -> ?buf:string -> in_channel -> Annot.t list
+    val input_sexp : ?parse_pos:Parse_pos.t -> in_channel -> Annot.t
+    val input_sexps :
+      ?parse_pos:Parse_pos.t -> ?buf:string -> in_channel -> Annot.t list
+    val of_string : string -> Annot.t
+    val of_bigstring : bigstring -> Annot.t
+    val load_rev_sexps : ?buf:string -> string -> Annot.t list
+    val load_sexps : ?buf:string -> string -> Annot.t list
+    val load_sexp : ?strict:bool -> ?buf:string -> string -> Annot.t
+    val conv : (Type.t -> 'a) -> t -> [> `Error of exn * t | `Result of 'a ]
+    val get_conv_exn : file:string -> exc:exn -> t -> exn
+  end
+val load_sexp_conv :
+  ?strict:bool ->
+  ?buf:string ->
+  string -> (t -> 'a) -> [> `Error of exn * Annotated.t | `Result of 'a ]
+val raise_conv_exn :
+  file:string -> [< `Error of exn * Annotated.t | `Result of 'a ] -> 'a
+val load_sexp_conv_exn :
+  ?strict:bool -> ?buf:string -> string -> (t -> 'a) -> 'a
+val load_sexps_conv :
+  ?buf:string ->
+  string ->
+  (t -> 'a) -> [> `Error of exn * Annotated.t | `Result of 'a ] list
+val load_sexps_conv_exn : ?buf:string -> string -> (t -> 'a) -> 'a list
+val gen_of_string_conv :
+  ('a -> Type.t) ->
+  ('a -> Annotated.t) ->
+  'a -> (Type.t -> 'b) -> [> `Error of exn * Annotated.t | `Result of 'b ]
+val of_string_conv :
+  string -> (t -> 'a) -> [> `Error of exn * Annotated.t | `Result of 'a ]
+val of_bigstring_conv :
+  bigstring -> (t -> 'a) -> [> `Error of exn * Annotated.t | `Result of 'a ]
+module Of_string_conv_exn :
+  sig
+    type t = { exc : exn; sexp : Type.t; sub_sexp : Type.t; }
+    exception E of t
+  end
+val gen_of_string_conv_exn : ('a -> Type.t) -> 'a -> (Type.t -> 'b) -> 'b
+val of_string_conv_exn : string -> (t -> 'a) -> 'a
+val of_bigstring_conv_exn : bigstring -> (t -> 'a) -> 'a
+val unit : t
+external sexp_of_t : t -> t = "%identity"
+external t_of_sexp : t -> t = "%identity"
+type found = [ `Found | `Pos of int * found ]
+type search_result = [ `Found | `Not_found | `Pos of int * found ]
+val search_physical :
+  t -> contained:t -> [ `Found | `Not_found | `Pos of int * found ]
+val subst_found : t -> subst:t -> ([< `Found | `Pos of int * 'a ] as 'a) -> t
dissimilarity index 99%
index 3376f1b..5d3ee0d 100644 (file)
-(******************************************************************************
- *                             Sexplib                                        *
- *                                                                            *
- * Copyright (C) 2005- Jane Street Holding, LLC                               *
- *    Contact: opensource@janestreet.com                                      *
- *    WWW: http://www.janestreet.com/ocaml                                    *
- *    Author: Markus Mottl                                                    *
- *                                                                            *
- * This library is free software; you can redistribute it and/or              *
- * modify it under the terms of the GNU Lesser General Public                 *
- * License as published by the Free Software Foundation; either               *
- * version 2 of the License, or (at your option) any later version.           *
- *                                                                            *
- * This library is distributed in the hope that it will be useful,            *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU          *
- * Lesser General Public License for more details.                            *
- *                                                                            *
- * You should have received a copy of the GNU Lesser General Public           *
- * License along with this library; if not, write to the Free Software        *
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA  *
- *                                                                            *
- ******************************************************************************)
-
-(** Sexp: Module for handling S-expressions (I/O, etc.) *)
-
-include Sexp_intf.S
+type t = Type.t = Atom of string | List of t list
+exception Of_sexp_error of exn * t
+type bigstring =
+    (char, Bigarray.int8_unsigned_elt, Bigarray.c_layout) Bigarray.Array1.t
+val default_indent : int ref
+val is_special_char : char -> bool
+val must_escape : string -> bool
+val maybe_esc_str : string -> string
+val pp_maybe_esc_str : Format.formatter -> string -> unit
+val pp_hum_indent : int -> Format.formatter -> t -> unit
+val pp_hum_rest : int -> Format.formatter -> t list -> unit
+val pp_mach_internal : bool -> Format.formatter -> t -> bool
+val pp_mach_rest : bool -> Format.formatter -> t list -> unit
+val pp_hum : Format.formatter -> t -> unit
+val pp_mach : Format.formatter -> t -> unit
+val pp : Format.formatter -> t -> unit
+val size_loop : int * int -> t -> int * int
+val size : t -> int * int
+val to_buffer_hum : buf:Buffer.t -> ?indent:int -> t -> unit
+val to_buffer_mach : buf:Buffer.t -> t -> unit
+val to_buffer : buf:Buffer.t -> t -> unit
+val buffer : unit -> Buffer.t
+val with_new_buffer : out_channel -> (Buffer.t -> 'a) -> unit
+val output_hum : out_channel -> t -> unit
+val output_hum_indent : int -> out_channel -> t -> unit
+val output_mach : out_channel -> t -> unit
+val output : out_channel -> t -> unit
+val save_of_output :
+  ?perm:Unix.file_perm -> (out_channel -> 'a -> 'b) -> string -> 'a -> unit
+val output_sexp_nl : (out_channel -> 'a -> 'b) -> out_channel -> 'a -> unit
+val save_hum : ?perm:Unix.file_perm -> string -> t -> unit
+val save_mach : ?perm:Unix.file_perm -> string -> t -> unit
+val save : ?perm:Unix.file_perm -> string -> t -> unit
+val output_sexps_nl :
+  (out_channel -> 'a -> 'b) -> out_channel -> 'a list -> unit
+val save_sexps_hum : ?perm:Unix.file_perm -> string -> t list -> unit
+val save_sexps_mach : ?perm:Unix.file_perm -> string -> t list -> unit
+val save_sexps : ?perm:Unix.file_perm -> string -> t list -> unit
+val to_string_hum : ?indent:int -> t -> string
+val to_string_mach : t -> string
+val to_string : t -> string
+val scan_sexp : ?buf:Buffer.t -> Lexing.lexbuf -> Type.t
+val scan_sexps : ?buf:Buffer.t -> Lexing.lexbuf -> Type.t list
+val get_main_buf : Buffer.t option -> Lexing.lexbuf -> Parser.token
+val scan_fold_sexps :
+  ?buf:Buffer.t -> f:('a -> Type.t -> 'a) -> init:'a -> Lexing.lexbuf -> 'a
+val scan_iter_sexps :
+  ?buf:Buffer.t -> f:(Type.t -> unit) -> Lexing.lexbuf -> unit
+val scan_sexps_conv :
+  ?buf:Buffer.t -> f:(Type.t -> 'a) -> Lexing.lexbuf -> 'a list
+module Annot :
+  sig
+    type pos = Pre_sexp.Annot.pos = { line : int; col : int; offset : int; }
+    type range = Pre_sexp.Annot.range = { start_pos : pos; end_pos : pos; }
+    type t =
+      Pre_sexp.Annot.t =
+        Atom of range * Type.t
+      | List of range * t list * Type.t
+    type 'a conv = [ `Error of exn * t | `Result of 'a ]
+    exception Conv_exn of string * exn
+    type stack =
+      Pre_sexp.Annot.stack = {
+      mutable positions : pos list;
+      mutable stack : t list list;
+    }
+    val get_sexp : t -> Type.t
+    val get_range : t -> range
+    exception Annot_sexp of t
+    val find_sexp : t -> Type.t -> t option
+  end
+module Parse_pos :
+  sig
+    type t =
+      Pre_sexp.Parse_pos.t = {
+      mutable text_line : int;
+      mutable text_char : int;
+      mutable global_offset : int;
+      mutable buf_pos : int;
+    }
+    val create :
+      ?text_line:int ->
+      ?text_char:int -> ?buf_pos:int -> ?global_offset:int -> unit -> t
+    val with_buf_pos : t -> int -> t
+  end
+type ('a, 'b) parse_result =
+  ('a, 'b) Pre_sexp.parse_result =
+    Done of 'b * Parse_pos.t
+  | Cont of bool * ('a, 'b) parse_fun
+and ('a, 'b) parse_fun = pos:int -> len:int -> 'a -> ('a, 'b) parse_result
+type 'a parse_state =
+  'a Pre_sexp.parse_state = {
+  parse_pos : Parse_pos.t;
+  mutable pstack : 'a;
+  pbuf : Buffer.t;
+}
+type parse_error =
+  Pre_sexp.parse_error = {
+  location : string;
+  err_msg : string;
+  parse_state :
+    [ `Annot of Annot.stack parse_state | `Sexp of t list list parse_state ];
+}
+exception Parse_error of parse_error
+val bump_text_line : 'a parse_state -> unit
+val bump_text_pos : 'a parse_state -> unit
+val bump_pos_cont :
+  'a parse_state ->
+  'b ->
+  max_pos:'c ->
+  pos:int -> ('a parse_state -> 'b -> max_pos:'c -> pos:int -> 'd) -> 'd
+val bump_line_cont :
+  'a parse_state ->
+  'b ->
+  max_pos:'c ->
+  pos:int -> ('a parse_state -> 'b -> max_pos:'c -> pos:int -> 'd) -> 'd
+val add_bump :
+  ('a parse_state -> 'b) ->
+  'a parse_state ->
+  'c ->
+  max_pos:'d ->
+  pos:int ->
+  char -> ('a parse_state -> 'c -> max_pos:'d -> pos:int -> 'e) -> 'e
+val add_bump_pos :
+  'a parse_state ->
+  'b ->
+  max_pos:'c ->
+  pos:int ->
+  char -> ('a parse_state -> 'b -> max_pos:'c -> pos:int -> 'd) -> 'd
+val add_bump_line :
+  'a parse_state ->
+  'b ->
+  max_pos:'c ->
+  pos:int ->
+  char -> ('a parse_state -> 'b -> max_pos:'c -> pos:int -> 'd) -> 'd
+val set_parse_pos : Parse_pos.t -> int -> unit
+val mk_parse_pos : 'a parse_state -> int -> Parse_pos.t
+val raise_parse_error :
+  [ `Annot of Annot.stack parse_state | `Sexp of t list list parse_state ] ->
+  string -> int -> string -> 'a
+val raise_unexpected_char :
+  [ `Annot of Annot.stack parse_state | `Sexp of t list list parse_state ] ->
+  string -> int -> char -> 'a
+val parse_str :
+  ?parse_pos:Parse_pos.t -> ?len:int -> string -> (string, t) parse_result
+val parse :
+  ?parse_pos:Parse_pos.t -> ?len:int -> string -> (string, t) parse_result
+val get_glob_ofs : Parse_pos.t -> int -> int
+val mk_annot_pos : Parse_pos.t -> int -> Annot.pos
+val mk_annot_pos1 : Parse_pos.t -> int -> Annot.pos
+val add_annot_pos : Annot.stack parse_state -> int -> unit
+val add_annot_pos1 : Annot.stack parse_state -> int -> unit
+val get_annot_range : Annot.stack parse_state -> int -> Annot.range
+val mk_annot_atom : Annot.stack parse_state -> string -> int -> Annot.t
+val mk_annot_list : Annot.stack parse_state -> Annot.t list -> int -> Annot.t
+val init_annot_pstate : unit -> Annot.stack
+val parse_str_annot :
+  ?parse_pos:Parse_pos.t ->
+  ?len:int -> string -> (string, Annot.t) parse_result
+val parse_bigstring :
+  ?parse_pos:Parse_pos.t ->
+  ?len:int -> bigstring -> (bigstring, t) parse_result
+val bump_found_atom :
+  (Annot.stack parse_state -> 'a) ->
+  Annot.stack parse_state ->
+  'b ->
+  max_pos:'c ->
+  pos:int ->
+  (Annot.stack parse_state ->
+   'b -> max_pos:'c -> pos:int -> ('d, Annot.t) parse_result) ->
+  ('d, Annot.t) parse_result
+val check_str_bounds : string -> pos:int -> len:int -> bigstring -> int
+val mk_cont :
+  string ->
+  (Annot.stack parse_state ->
+   bigstring -> max_pos:int -> pos:int -> (bigstring, 'a) parse_result) ->
+  Annot.stack parse_state -> (bigstring, 'a) parse_result
+val parse_nl :
+  Annot.stack parse_state ->
+  bigstring -> max_pos:int -> pos:int -> (bigstring, Annot.t) parse_result
+val parse_comment :
+  Annot.stack parse_state ->
+  bigstring -> max_pos:int -> pos:int -> (bigstring, Annot.t) parse_result
+val parse_atom :
+  Annot.stack parse_state ->
+  bigstring -> max_pos:int -> pos:int -> (bigstring, Annot.t) parse_result
+val reg_parse_quoted :
+  Annot.stack parse_state ->
+  bigstring -> max_pos:int -> pos:int -> (bigstring, Annot.t) parse_result
+val parse_quoted :
+  Annot.stack parse_state ->
+  bigstring -> max_pos:int -> pos:int -> (bigstring, Annot.t) parse_result
+val parse_quoted_nl :
+  Annot.stack parse_state ->
+  bigstring -> max_pos:int -> pos:int -> (bigstring, Annot.t) parse_result
+val parse_escaped :
+  Annot.stack parse_state ->
+  bigstring -> max_pos:int -> pos:int -> (bigstring, Annot.t) parse_result
+val parse_skip_ws :
+  Annot.stack parse_state ->
+  bigstring -> max_pos:int -> pos:int -> (bigstring, Annot.t) parse_result
+val parse_skip_ws_nl :
+  Annot.stack parse_state ->
+  bigstring -> max_pos:int -> pos:int -> (bigstring, Annot.t) parse_result
+val parse_dec :
+  Annot.stack parse_state ->
+  bigstring ->
+  max_pos:int ->
+  pos:int -> count:int -> d:int -> (bigstring, Annot.t) parse_result
+val parse_hex :
+  Annot.stack parse_state ->
+  bigstring ->
+  max_pos:int ->
+  pos:int -> count:int -> d:int -> (bigstring, Annot.t) parse_result
+val parse_bigstring_annot :
+  ?parse_pos:Parse_pos.t ->
+  ?len:int -> bigstring -> (bigstring, Annot.t) parse_result
+val mk_this_parse :
+  ?parse_pos:Parse_pos.t ->
+  (?parse_pos:Parse_pos.t -> ?len:'a -> 'b -> 'c) ->
+  pos:int -> len:'a -> 'b -> 'c
+val gen_input_sexp :
+  (?parse_pos:Parse_pos.t -> ?len:int -> string -> (string, 'a) parse_result) ->
+  ?parse_pos:Parse_pos.t -> in_channel -> 'a
+val input_sexp : ?parse_pos:Parse_pos.t -> in_channel -> t
+val gen_input_rev_sexps :
+  (?parse_pos:Parse_pos.t -> ?len:int -> string -> (string, 'a) parse_result) ->
+  ?parse_pos:Parse_pos.t -> ?buf:string -> in_channel -> 'a list
+val input_rev_sexps :
+  ?parse_pos:Parse_pos.t -> ?buf:string -> in_channel -> t list
+val input_sexps :
+  ?parse_pos:Parse_pos.t -> ?buf:string -> in_channel -> t list
+val of_string_bigstring :
+  string ->
+  ('a -> ('b, 'c) parse_result) ->
+  'b -> ('a -> int) -> ('a -> int -> int -> string) -> 'a -> 'c
+val of_string : string -> t
+val get_bstr_sub_str :
+  (char, 'a, 'b) Bigarray.Array1.t -> int -> int -> string
+val bstr_ws_buf :
+  (char, Bigarray.int8_unsigned_elt, Bigarray.c_layout) Bigarray.Array1.t
+val of_bigstring : bigstring -> t
+val gen_load_rev_sexps :
+  (?parse_pos:'a -> ?buf:'b -> in_channel -> 'c) -> ?buf:'b -> string -> 'c
+val load_rev_sexps : ?buf:string -> string -> t list
+val load_sexps : ?buf:string -> string -> t list
+val gen_load_sexp :
+  (?parse_pos:Parse_pos.t -> ?len:int -> string -> (string, 'a) parse_result) ->
+  ?strict:bool -> ?buf:string -> string -> 'a
+val load_sexp : ?strict:bool -> ?buf:string -> string -> t
+module Annotated :
+  sig
+    type pos = Annot.pos = { line : int; col : int; offset : int; }
+    type range = Annot.range = { start_pos : pos; end_pos : pos; }
+    type t =
+      Annot.t =
+        Atom of range * Type.t
+      | List of range * t list * Type.t
+    type 'a conv = [ `Error of exn * t | `Result of 'a ]
+    exception Conv_exn of string * exn
+    type stack =
+      Annot.stack = {
+      mutable positions : pos list;
+      mutable stack : t list list;
+    }
+    val get_sexp : t -> Type.t
+    val get_range : t -> range
+    exception Annot_sexp of t
+    val find_sexp : t -> Type.t -> t option
+    val parse :
+      ?parse_pos:Parse_pos.t ->
+      ?len:int -> string -> (string, Annot.t) parse_result
+    val parse_bigstring :
+      ?parse_pos:Parse_pos.t ->
+      ?len:int -> bigstring -> (bigstring, Annot.t) parse_result
+    val input_rev_sexps :
+      ?parse_pos:Parse_pos.t -> ?buf:string -> in_channel -> Annot.t list
+    val input_sexp : ?parse_pos:Parse_pos.t -> in_channel -> Annot.t
+    val input_sexps :
+      ?parse_pos:Parse_pos.t -> ?buf:string -> in_channel -> Annot.t list
+    val of_string : string -> Annot.t
+    val of_bigstring : bigstring -> Annot.t
+    val load_rev_sexps : ?buf:string -> string -> Annot.t list
+    val load_sexps : ?buf:string -> string -> Annot.t list
+    val load_sexp : ?strict:bool -> ?buf:string -> string -> Annot.t
+    val conv : (Type.t -> 'a) -> t -> [> `Error of exn * t | `Result of 'a ]
+    val get_conv_exn : file:string -> exc:exn -> t -> exn
+  end
+val load_sexp_conv :
+  ?strict:bool ->
+  ?buf:string ->
+  string -> (t -> 'a) -> [> `Error of exn * Annotated.t | `Result of 'a ]
+val raise_conv_exn :
+  file:string -> [< `Error of exn * Annotated.t | `Result of 'a ] -> 'a
+val load_sexp_conv_exn :
+  ?strict:bool -> ?buf:string -> string -> (t -> 'a) -> 'a
+val load_sexps_conv :
+  ?buf:string ->
+  string ->
+  (t -> 'a) -> [> `Error of exn * Annotated.t | `Result of 'a ] list
+val load_sexps_conv_exn : ?buf:string -> string -> (t -> 'a) -> 'a list
+val gen_of_string_conv :
+  ('a -> Type.t) ->
+  ('a -> Annotated.t) ->
+  'a -> (Type.t -> 'b) -> [> `Error of exn * Annotated.t | `Result of 'b ]
+val of_string_conv :
+  string -> (t -> 'a) -> [> `Error of exn * Annotated.t | `Result of 'a ]
+val of_bigstring_conv :
+  bigstring -> (t -> 'a) -> [> `Error of exn * Annotated.t | `Result of 'a ]
+module Of_string_conv_exn :
+  sig
+    type t =
+      Pre_sexp.Of_string_conv_exn.t = {
+      exc : exn;
+      sexp : Type.t;
+      sub_sexp : Type.t;
+    }
+    exception E of t
+  end
+val gen_of_string_conv_exn : ('a -> Type.t) -> 'a -> (Type.t -> 'b) -> 'b
+val of_string_conv_exn : string -> (t -> 'a) -> 'a
+val of_bigstring_conv_exn : bigstring -> (t -> 'a) -> 'a
+val unit : t
+external sexp_of_t : t -> t = "%identity"
+external t_of_sexp : t -> t = "%identity"
+type found = [ `Found | `Pos of int * found ]
+type search_result = [ `Found | `Not_found | `Pos of int * found ]
+val search_physical :
+  t -> contained:t -> [ `Found | `Not_found | `Pos of int * found ]
+val subst_found : t -> subst:t -> ([< `Found | `Pos of int * 'a ] as 'a) -> t
diff --git a/bundles/sexplib/sexplib-7.0.5/lib/sexp_intf.mli b/bundles/sexplib/sexplib-7.0.5/lib/sexp_intf.mli
new file mode 100644 (file)
index 0000000..5af2f6e
--- /dev/null
@@ -0,0 +1,157 @@
+module type S =
+  sig
+    type t = Type.t = Atom of string | List of t list
+    type bigstring =
+        (char, Bigarray.int8_unsigned_elt, Bigarray.c_layout)
+        Bigarray.Array1.t
+    val default_indent : int ref
+    val size : t -> int * int
+    val scan_sexp : ?buf:Buffer.t -> Lexing.lexbuf -> t
+    val scan_sexps : ?buf:Buffer.t -> Lexing.lexbuf -> t list
+    val scan_iter_sexps :
+      ?buf:Buffer.t -> f:(t -> unit) -> Lexing.lexbuf -> unit
+    val scan_fold_sexps :
+      ?buf:Buffer.t -> f:('a -> t -> 'a) -> init:'a -> Lexing.lexbuf -> 'a
+    val scan_sexps_conv :
+      ?buf:Buffer.t -> f:(t -> 'a) -> Lexing.lexbuf -> 'a list
+    module Parse_pos :
+      sig
+        type t =
+          Pre_sexp.Parse_pos.t = private {
+          mutable text_line : int;
+          mutable text_char : int;
+          mutable global_offset : int;
+          mutable buf_pos : int;
+        }
+        val create :
+          ?text_line:int ->
+          ?text_char:int -> ?buf_pos:int -> ?global_offset:int -> unit -> t
+        val with_buf_pos : t -> int -> t
+      end
+    type ('a, 'b) parse_result =
+      ('a, 'b) Pre_sexp.parse_result =
+        Done of 'b * Parse_pos.t
+      | Cont of bool * ('a, 'b) parse_fun
+    and ('a, 'b) parse_fun =
+        pos:int -> len:int -> 'a -> ('a, 'b) parse_result
+    module Annotated :
+      sig
+        type pos =
+          Pre_sexp.Annotated.pos = {
+          line : int;
+          col : int;
+          offset : int;
+        }
+        type range =
+          Pre_sexp.Annotated.range = {
+          start_pos : pos;
+          end_pos : pos;
+        }
+        type t =
+          Pre_sexp.Annotated.t =
+            Atom of range * Type.t
+          | List of range * t list * Type.t
+        type 'a conv = [ `Error of exn * t | `Result of 'a ]
+        exception Conv_exn of string * exn
+        type stack =
+          Pre_sexp.Annotated.stack = {
+          mutable positions : pos list;
+          mutable stack : t list list;
+        }
+        val get_sexp : t -> Type.t
+        val get_range : t -> range
+        val find_sexp : t -> Type.t -> t option
+        val parse :
+          ?parse_pos:Parse_pos.t ->
+          ?len:int -> string -> (string, t) parse_result
+        val parse_bigstring :
+          ?parse_pos:Parse_pos.t ->
+          ?len:int -> bigstring -> (bigstring, t) parse_result
+        val input_sexp : ?parse_pos:Parse_pos.t -> in_channel -> t
+        val input_sexps :
+          ?parse_pos:Parse_pos.t -> ?buf:string -> in_channel -> t list
+        val input_rev_sexps :
+          ?parse_pos:Parse_pos.t -> ?buf:string -> in_channel -> t list
+        val load_sexp : ?strict:bool -> ?buf:string -> string -> t
+        val load_sexps : ?buf:string -> string -> t list
+        val load_rev_sexps : ?buf:string -> string -> t list
+        val of_string : string -> t
+        val of_bigstring : bigstring -> t
+        val conv : (Type.t -> 'a) -> t -> 'a conv
+        val get_conv_exn : file:string -> exc:exn -> t -> exn
+      end
+    type 'a parse_state =
+      'a Pre_sexp.parse_state = private {
+      parse_pos : Parse_pos.t;
+      mutable pstack : 'a;
+      pbuf : Buffer.t;
+    }
+    type parse_error =
+      Pre_sexp.parse_error = {
+      location : string;
+      err_msg : string;
+      parse_state :
+        [ `Annot of Annotated.stack parse_state
+        | `Sexp of t list list parse_state ];
+    }
+    exception Parse_error of parse_error
+    val parse :
+      ?parse_pos:Parse_pos.t ->
+      ?len:int -> string -> (string, t) parse_result
+    val parse_bigstring :
+      ?parse_pos:Parse_pos.t ->
+      ?len:int -> bigstring -> (bigstring, t) parse_result
+    val input_sexp : ?parse_pos:Parse_pos.t -> in_channel -> t
+    val input_sexps :
+      ?parse_pos:Parse_pos.t -> ?buf:string -> in_channel -> t list
+    val input_rev_sexps :
+      ?parse_pos:Parse_pos.t -> ?buf:string -> in_channel -> t list
+    val load_sexp : ?strict:bool -> ?buf:string -> string -> t
+    val load_sexps : ?buf:string -> string -> t list
+    val load_rev_sexps : ?buf:string -> string -> t list
+    val load_sexp_conv :
+      ?strict:bool -> ?buf:string -> string -> (t -> 'a) -> 'a Annotated.conv
+    val load_sexp_conv_exn :
+      ?strict:bool -> ?buf:string -> string -> (t -> 'a) -> 'a
+    val load_sexps_conv :
+      ?buf:string -> string -> (t -> 'a) -> 'a Annotated.conv list
+    val load_sexps_conv_exn : ?buf:string -> string -> (t -> 'a) -> 'a list
+    val output_hum : out_channel -> t -> unit
+    val output_hum_indent : int -> out_channel -> t -> unit
+    val output_mach : out_channel -> t -> unit
+    val output : out_channel -> t -> unit
+    val save_hum : ?perm:int -> string -> t -> unit
+    val save_mach : ?perm:int -> string -> t -> unit
+    val save : ?perm:int -> string -> t -> unit
+    val save_sexps_hum : ?perm:int -> string -> t list -> unit
+    val save_sexps_mach : ?perm:int -> string -> t list -> unit
+    val save_sexps : ?perm:int -> string -> t list -> unit
+    val pp_hum : Format.formatter -> t -> unit
+    val pp_hum_indent : int -> Format.formatter -> t -> unit
+    val pp_mach : Format.formatter -> t -> unit
+    val pp : Format.formatter -> t -> unit
+    module Of_string_conv_exn :
+      sig
+        type t = { exc : exn; sexp : Type.t; sub_sexp : Type.t; }
+        exception E of t
+      end
+    val of_string : string -> t
+    val of_string_conv : string -> (t -> 'a) -> 'a Annotated.conv
+    val of_string_conv_exn : string -> (t -> 'a) -> 'a
+    val of_bigstring : bigstring -> t
+    val of_bigstring_conv : bigstring -> (t -> 'a) -> 'a Annotated.conv
+    val of_bigstring_conv_exn : bigstring -> (t -> 'a) -> 'a
+    val to_string_hum : ?indent:int -> t -> string
+    val to_string_mach : t -> string
+    val to_string : t -> string
+    val to_buffer_hum : buf:Buffer.t -> ?indent:int -> t -> unit
+    val to_buffer_mach : buf:Buffer.t -> t -> unit
+    val to_buffer : buf:Buffer.t -> t -> unit
+    val unit : t
+    external sexp_of_t : t -> t = "%identity"
+    external t_of_sexp : t -> t = "%identity"
+    type found = [ `Found | `Pos of int * found ]
+    type search_result = [ `Found | `Not_found | `Pos of int * found ]
+    val search_physical : t -> contained:t -> search_result
+    val subst_found : t -> subst:t -> found -> t
+  end
diff --git a/bundles/sexplib/sexplib-7.0.5/lib/type.mli b/bundles/sexplib/sexplib-7.0.5/lib/type.mli
new file mode 100644 (file)
index 0000000..4d1251c
--- /dev/null
@@ -0,0 +1 @@
+type t = Atom of string | List of t list
index 691ac4b..2516bbb 100644 (file)
   suggesting this features.
 - Python code now receives expressions and identifiers as ordinary strings,
   not as elements of specific structures.
+- Allow size_t as the type of an array index in smpl code.  Reported by
+  Mansour Moufid.
+- Allow exp@id
+- Allow renaming an expression as an identifier (@i)
 
 ** Features:
 - Preserve spacing before // comments when not at the beginning of a line
 - Slightly more efficient handling of lists.
 - Slightly better error message in the case of inconsistent paths
 - Improve limited size caching
-- Remove #ifdefs when everything else is removed
+- Remove zero #ifdefs when everything else is removed
+- Mac OSX compatibility (tested on OSX Lion)
+- 'Make depend' is called automatically when starting from a cleaned source
+- Configure flag --enable-release makes 'make' build the optimized version of
+  coccinelle if possible.
+- The installed 'bin/spatch' calls spatch.opt or spatch with default parameters
+  for iso/headers/python. 'bin/spatch.opt' and 'bin/spatch.byte'
+- The bundled packages are now in the 'bundles' subdirectory and in the
+  form of their original tarballs. These are extracted and used on-demand.
+- Compatibility with python 2 and python 3. Also, a small bug is fixed in the order
+  of library includes that caused sometimes trouble when building the pycaml library.
+- Dropped the dependency on Perl in the Makefiles
+- The configure script uses pkg-config and ocaml findlib and provides many
+  flags for tuning/overriding the build process (including the ocaml
+  compiler and the C compiler and preprocessor).
+- Add line number directives to the .ml file generated from a .cocci file
+- Added 'make check' as an alternative to 'make test'. It can run after
+  building spatch, checks whether some featues work (python and ocaml scripts,
+  regexes) if these features are enabled, and then launches the test suite
+  with a 75% success rate requirement. It also does not ask for user input
+  and can be used in autonomous builds.
+- Added an experimental --reverse flag to invert the semantic patch before application.
+  Note that not all patches can be inverted, nor is it guaranteed that applying
+  a patch followed by applying its inverse is an identity operation.
 
 ** Bugfix:
 - Corrected parsing of script strings delimited by a single quote.  Thanks
 - Pretty printing of const/volatile arrays in smpl code.
 - Don't allow just dropping an exp or type
 - Avoid removing #endif when surrounded by - code
+- Print some important error messages even with the --very-quiet flag.
+- Fixed parallel building in the Makefiles
+- Fixed the compilation of the "pure bytecode" version. If you use the
+  bundled pycaml or ocaml-pcre, you'll need their stub libraries in
+  your LD_LIBRARY_PATH.
+- For get_constants, virtuals should be false, not true
+- C parsing of top-level declarers with initializations.
+- Remove constraints in predicates in match result, to avoid PCRE equality
+  problems
+- Enum assignment matching an enum value shouldn't cause a failure
 
 * 0.2.5
 ** Language:
index 9929076..bdf98d4 100644 (file)
--- a/cocci.ml
+++ b/cocci.ml
  *)
 
 
+# 0 "./cocci.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./cocci.ml"
 open Common
 
index c736745..3a68b24 100644 (file)
--- a/cocci.mli
+++ b/cocci.mli
  *)
 
 
+# 0 "./cocci.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./cocci.mli"
 open Common
 
index f4654f8..6ef3642 100644 (file)
@@ -90,7 +90,7 @@ BININCLUDES=-I ../ocamltarzan/lib-binprot -I ../../ocamltarzan/lib-binprot
 
 #backtrace
 MYBACKTRACESRC=backtrace.ml
-BACKTRACEINCLUDES=-I $(shell ocamlc -where)
+BACKTRACEINCLUDES=-I $(shell $(OCAMLC) -where)
 
 
 ##############################################################################
@@ -105,7 +105,8 @@ INCLUDES=$(INCLUDEDIRS:%=-I %) $(INCLUDESEXTRA)
 
 # This flag can also be used in subdirectories so don't change its name here.
 # For profiling use:  -p -inline 0
-OPTFLAGS=
+OCAMLCFLAGS ?= -g -dtypes
+OPTFLAGS ?= -g -dtypes
 #-thread
 
 # The OPTBIN variable is here to allow to use ocamlc.opt instead of
@@ -114,11 +115,9 @@ OPTFLAGS=
 # or setenv it to ".opt" in your startup script.
 OPTBIN ?= #.opt
 
-OCAMLCFLAGS ?= -g -dtypes
-
 # The OCaml tools.
-OCAMLC_CMD=$(OCAMLC) $(OCAMLCFLAGS) $(INCLUDES)
-OCAMLOPT_CMD=$(OCAMLOPT) $(OPTFLAGS) $(INCLUDES)
+OCAMLC_CMD=$(OCAMLC) -thread $(OCAMLCFLAGS) $(INCLUDES)
+OCAMLOPT_CMD=$(OCAMLOPT) -thread $(OPTFLAGS) $(INCLUDES)
 OCAMLDEP_CMD=$(OCAMLDEP) $(INCLUDES)
 OCAMLMKTOP_CMD=$(OCAMLMKTOP) -g -custom $(INCLUDES)
 
@@ -133,7 +132,8 @@ OPTOBJS = $(SRC:.ml=.cmx)
 
 
 all: $(LIB)
-all.opt: $(OPTLIB)
+all.opt:
+       @$(MAKE) $(OPTLIB) BUILD_OPT=yes
 opt: all.opt
 top: $(TARGET).top
 
@@ -244,7 +244,8 @@ clean::
 
 
 #-----------------------------------------------------------------------------
-.PHONEY: sexp.all sexp.opt
+.PHONEY: sexp sexp.all sexp.opt
+sexp: sexp.all
 sexp.all:
        $(MAKE) INCLUDESEXTRA="$(SEXPINCLUDES)" commons_sexp.cma
 sexp.opt:
@@ -342,3 +343,5 @@ ifneq ($(MAKECMDGOALS),distclean)
 -include .depend
 endif
 endif
+
+include ../Makefile.common
index 1700302..2af75aa 100755 (executable)
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.68 for coccinelle `cat ./version`.
+# Generated by GNU Autoconf 2.68 for coccinelle 1.0.0-rc12.
 #
 # Report bugs to <cocci@diku.dk>.
 #
@@ -619,14 +619,17 @@ MAKEFLAGS=
 # Identity of this package.
 PACKAGE_NAME='coccinelle'
 PACKAGE_TARNAME='coccinelle'
-PACKAGE_VERSION='`cat ./version`'
-PACKAGE_STRING='coccinelle `cat ./version`'
+PACKAGE_VERSION='1.0.0-rc12'
+PACKAGE_STRING='coccinelle 1.0.0-rc12'
 PACKAGE_BUGREPORT='cocci@diku.dk'
 PACKAGE_URL='http://coccinelle.lip6.fr/'
 
 ac_unique_file="cocci.ml"
 ac_subst_vars='LTLIBOBJS
 LIBOBJS
+MAKETARGET_SPATCH
+SPATCHNAME
+enable_opt
 MAKETARGET_ALL
 enable_release
 SUBSTITUTED_PDFLATEX
@@ -639,6 +642,7 @@ SHAREDIR
 REGEXP_FILE
 REGEXP_MODULE
 MAKE_pcre
+OPTFLAGS_pcre
 enable_pcre
 GLOBAL_pcre
 OCAML_PKG_pcre
@@ -649,12 +653,14 @@ PCRE_CFLAGS
 PYCOCCI_FILE
 PYCOCCI_MODULE
 MAKE_pycaml
+OPTFLAGS_pycaml
 GLOBAL_pycaml
 OCAML_PKG_pycaml
 enable_python
 HAVE_PYTHON
 PYTHON_LIBS
 PYTHON_CFLAGS
+PYVER_MAJOR
 SUBSTITUTED_PYTHON
 with_PYTHON
 enable_pycaml
@@ -665,23 +671,29 @@ enable_ocaml
 SUBSTITUTED_MENHIR
 with_MENHIR
 MENHIR
+OPTIMIZED_dynlink
 MAKE_extlib
+OPTFLAGS_extlib
 enable_extlib
 GLOBAL_extlib
 OCAML_PKG_extlib
 MAKE_menhirLib
+OPTFLAGS_menhirLib
 enable_menhirLib
 GLOBAL_menhirLib
 OCAML_PKG_menhirLib
 MAKE_sexplib
+OPTFLAGS_sexplib
 enable_sexplib
 GLOBAL_sexplib
 OCAML_PKG_sexplib
 MAKE_camlp4
+OPTFLAGS_camlp4
 enable_camlp4
 GLOBAL_camlp4
 OCAML_PKG_camlp4
 MAKE_dynlink
+OPTFLAGS_dynlink
 enable_dynlink
 GLOBAL_dynlink
 OCAML_PKG_dynlink
@@ -781,6 +793,7 @@ OCAMLLEXDOTOPT
 OCAMLLEX
 with_PKG_CONFIG
 PKG_CONFIG
+PATCHELF
 PATCH
 TAR
 CPP
@@ -800,6 +813,7 @@ GIT
 CONFVERSION
 COCCI_SRCDIR
 COCCI_VERSION
+CONFIGURE_FLAGS
 target_alias
 host_alias
 build_alias
@@ -866,6 +880,7 @@ enable_pcre_syntax
 enable_pcre
 with_pdflatex
 enable_release
+enable_opt
 '
       ac_precious_vars='PYVER
 build_alias
@@ -1437,7 +1452,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures coccinelle `cat ./version` to adapt to many kinds of systems.
+\`configure' configures coccinelle 1.0.0-rc12 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1498,7 +1513,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of coccinelle `cat ./version`:";;
+     short | recursive ) echo "Configuration of coccinelle 1.0.0-rc12:";;
    esac
   cat <<\_ACEOF
 
@@ -1525,6 +1540,7 @@ Optional Features:
   --enable-pcre           enable global package pcre (yes,no) (default: auto)
   --enable-release        build with a release configuration (yes,no, default:
                           no)
+  --enable-opt            build an optimized spatch (yes,no, default: auto)
 
 Optional Packages:
   --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
@@ -1648,7 +1664,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-coccinelle configure `cat ./version`
+coccinelle configure 1.0.0-rc12
 generated by GNU Autoconf 2.68
 
 Copyright (C) 2010 Free Software Foundation, Inc.
@@ -1740,7 +1756,7 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by coccinelle $as_me `cat ./version`, which was
+It was created by coccinelle $as_me 1.0.0-rc12, which was
 generated by GNU Autoconf 2.68.  Invocation command line was
 
   $ $0 $@
@@ -2088,9 +2104,42 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 
-COCCI_VERSION=$(cat ./version)
 
-COCCI_SRCDIR=$(pwd)
+ac_aux_dir=
+for ac_dir in setup "$srcdir"/setup; do
+  if test -f "$ac_dir/install-sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install-sh -c"
+    break
+  elif test -f "$ac_dir/install.sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install.sh -c"
+    break
+  elif test -f "$ac_dir/shtool"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/shtool install -c"
+    break
+  fi
+done
+if test -z "$ac_aux_dir"; then
+  as_fn_error $? "cannot find install-sh, install.sh, or shtool in setup \"$srcdir\"/setup" "$LINENO" 5
+fi
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
+ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
+
+
+
+CONFIGURE_FLAGS="$*"
+
+COCCI_VERSION="$PACKAGE_VERSION"
+
+COCCI_SRCDIR="$(pwd)"
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: configuring coccinelle $COCCI_VERSION in $COCCI_SRCDIR" >&5
 $as_echo "$as_me: configuring coccinelle $COCCI_VERSION in $COCCI_SRCDIR" >&6;}
@@ -2338,35 +2387,6 @@ $as_echo "$as_me: some fake substitutions for required but unavailable programs
 { $as_echo "$as_me:${as_lineno-$LINENO}: verifying basic tools" >&5
 $as_echo "$as_me: verifying basic tools" >&6;}
 
-ac_aux_dir=
-for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
-  if test -f "$ac_dir/install-sh"; then
-    ac_aux_dir=$ac_dir
-    ac_install_sh="$ac_aux_dir/install-sh -c"
-    break
-  elif test -f "$ac_dir/install.sh"; then
-    ac_aux_dir=$ac_dir
-    ac_install_sh="$ac_aux_dir/install.sh -c"
-    break
-  elif test -f "$ac_dir/shtool"; then
-    ac_aux_dir=$ac_dir
-    ac_install_sh="$ac_aux_dir/shtool install -c"
-    break
-  fi
-done
-if test -z "$ac_aux_dir"; then
-  as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5
-fi
-
-# These three variables are undocumented and unsupported,
-# and are intended to be withdrawn in a future Autoconf release.
-# They can cause serious problems if a builder's source tree is in a directory
-# whose full name contains unusual characters.
-ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
-ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
-ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
-
-
 # Find a good install program.  We prefer a C program (faster),
 # so one script is as good as another.  But avoid the broken or
 # incompatible versions:
@@ -3509,6 +3529,46 @@ $as_echo "no" >&6; }
 fi
 
 
+# Extract the first word of "patchelf", so it can be a program name with args.
+set dummy patchelf; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_PATCHELF+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $PATCHELF in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_PATCHELF="$PATCHELF" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_PATCHELF="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+PATCHELF=$ac_cv_path_PATCHELF
+if test -n "$PATCHELF"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PATCHELF" >&5
+$as_echo "$PATCHELF" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
 
 
 
@@ -3519,15 +3579,24 @@ fi
 
   with_PKG_CONFIG="$with_pkg_config"
 
-
     if test -n "$with_PKG_CONFIG" -a "x$with_PKG_CONFIG" != xno -a "x$with_PKG_CONFIG" != xyes; then :
       PKG_CONFIG="$with_PKG_CONFIG"
 
 
+else
+      PKG_CONFIG="pkg-config"
+
+
 fi
 
-    if test "x$with_PKG_CONFIG" != xno; then :
-        if test "xpkg-config" = xpkg-config -a "xPKG_CONFIG" = xPKG_CONFIG; then :
+    if test "x$with_PKG_CONFIG" = xno; then :
+      { $as_echo "$as_me:${as_lineno-$LINENO}: pkg-config is disabled explicitly" >&5
+$as_echo "$as_me: pkg-config is disabled explicitly" >&6;}
+    PKG_CONFIG=no
+
+
+else
+        if test "x$PKG_CONFIG" = xpkg-config -a "xPKG_CONFIG" = xPKG_CONFIG; then :
 
 
 if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
@@ -3645,7 +3714,7 @@ $as_echo "no" >&6; }
 
 fi
 
-elif test "xpkg-config" = xocamllex -a "xPKG_CONFIG" = xOCAMLLEX; then :
+elif test "x$PKG_CONFIG" = xocamllex -a "xPKG_CONFIG" = xOCAMLLEX; then :
         # checking for ocamllex
   if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}ocamllex", so it can be a program name with args.
@@ -3851,7 +3920,7 @@ fi
 
 
 
-elif test "xpkg-config" = xocamlyacc -a "xPKG_CONFIG" = xOCAMLYACC; then :
+elif test "x$PKG_CONFIG" = xocamlyacc -a "xPKG_CONFIG" = xOCAMLYACC; then :
         if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}ocamlyacc", so it can be a program name with args.
 set dummy ${ac_tool_prefix}ocamlyacc; ac_word=$2
@@ -3955,8 +4024,8 @@ fi
 
 else
       if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
-set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
+  # Extract the first word of "${ac_tool_prefix}[$]PKG_CONFIG", so it can be a program name with args.
+set dummy ${ac_tool_prefix}$PKG_CONFIG; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
 if ${ac_cv_path_PKG_CONFIG+:} false; then :
@@ -3998,8 +4067,8 @@ fi
 fi
 if test -z "$ac_cv_path_PKG_CONFIG"; then
   ac_pt_PKG_CONFIG=$PKG_CONFIG
-  # Extract the first word of "pkg-config", so it can be a program name with args.
-set dummy pkg-config; ac_word=$2
+  # Extract the first word of "[$]PKG_CONFIG", so it can be a program name with args.
+set dummy $PKG_CONFIG; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
 if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then :
@@ -6637,15 +6706,24 @@ fi
 
   with_OCAMLLEX="$with_ocamllex"
 
-
     if test -n "$with_OCAMLLEX" -a "x$with_OCAMLLEX" != xno -a "x$with_OCAMLLEX" != xyes; then :
       OCAMLLEX="$with_OCAMLLEX"
 
 
+else
+      OCAMLLEX="ocamllex"
+
+
 fi
 
-    if test "x$with_OCAMLLEX" != xno; then :
-        if test "xocamllex" = xpkg-config -a "xOCAMLLEX" = xPKG_CONFIG; then :
+    if test "x$with_OCAMLLEX" = xno; then :
+      { $as_echo "$as_me:${as_lineno-$LINENO}: ocamllex is disabled explicitly" >&5
+$as_echo "$as_me: ocamllex is disabled explicitly" >&6;}
+    OCAMLLEX=no
+
+
+else
+        if test "x$OCAMLLEX" = xpkg-config -a "xOCAMLLEX" = xPKG_CONFIG; then :
 
 
 if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
@@ -6763,7 +6841,7 @@ $as_echo "no" >&6; }
 
 fi
 
-elif test "xocamllex" = xocamllex -a "xOCAMLLEX" = xOCAMLLEX; then :
+elif test "x$OCAMLLEX" = xocamllex -a "xOCAMLLEX" = xOCAMLLEX; then :
         # checking for ocamllex
   if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}ocamllex", so it can be a program name with args.
@@ -6969,7 +7047,7 @@ fi
 
 
 
-elif test "xocamllex" = xocamlyacc -a "xOCAMLLEX" = xOCAMLYACC; then :
+elif test "x$OCAMLLEX" = xocamlyacc -a "xOCAMLLEX" = xOCAMLYACC; then :
         if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}ocamlyacc", so it can be a program name with args.
 set dummy ${ac_tool_prefix}ocamlyacc; ac_word=$2
@@ -7073,8 +7151,8 @@ fi
 
 else
       if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}ocamllex", so it can be a program name with args.
-set dummy ${ac_tool_prefix}ocamllex; ac_word=$2
+  # Extract the first word of "${ac_tool_prefix}[$]OCAMLLEX", so it can be a program name with args.
+set dummy ${ac_tool_prefix}$OCAMLLEX; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
 if ${ac_cv_path_OCAMLLEX+:} false; then :
@@ -7116,8 +7194,8 @@ fi
 fi
 if test -z "$ac_cv_path_OCAMLLEX"; then
   ac_pt_OCAMLLEX=$OCAMLLEX
-  # Extract the first word of "ocamllex", so it can be a program name with args.
-set dummy ocamllex; ac_word=$2
+  # Extract the first word of "[$]OCAMLLEX", so it can be a program name with args.
+set dummy $OCAMLLEX; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
 if ${ac_cv_path_ac_pt_OCAMLLEX+:} false; then :
@@ -7736,15 +7814,24 @@ fi
 
   with_OCAMLYACC="$with_ocamlyacc"
 
-
     if test -n "$with_OCAMLYACC" -a "x$with_OCAMLYACC" != xno -a "x$with_OCAMLYACC" != xyes; then :
       OCAMLYACC="$with_OCAMLYACC"
 
 
+else
+      OCAMLYACC="ocamlyacc"
+
+
 fi
 
-    if test "x$with_OCAMLYACC" != xno; then :
-        if test "xocamlyacc" = xpkg-config -a "xOCAMLYACC" = xPKG_CONFIG; then :
+    if test "x$with_OCAMLYACC" = xno; then :
+      { $as_echo "$as_me:${as_lineno-$LINENO}: ocamlyacc is disabled explicitly" >&5
+$as_echo "$as_me: ocamlyacc is disabled explicitly" >&6;}
+    OCAMLYACC=no
+
+
+else
+        if test "x$OCAMLYACC" = xpkg-config -a "xOCAMLYACC" = xPKG_CONFIG; then :
 
 
 if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
@@ -7862,7 +7949,7 @@ $as_echo "no" >&6; }
 
 fi
 
-elif test "xocamlyacc" = xocamllex -a "xOCAMLYACC" = xOCAMLLEX; then :
+elif test "x$OCAMLYACC" = xocamllex -a "xOCAMLYACC" = xOCAMLLEX; then :
         # checking for ocamllex
   if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}ocamllex", so it can be a program name with args.
@@ -8068,7 +8155,7 @@ fi
 
 
 
-elif test "xocamlyacc" = xocamlyacc -a "xOCAMLYACC" = xOCAMLYACC; then :
+elif test "x$OCAMLYACC" = xocamlyacc -a "xOCAMLYACC" = xOCAMLYACC; then :
         if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}ocamlyacc", so it can be a program name with args.
 set dummy ${ac_tool_prefix}ocamlyacc; ac_word=$2
@@ -8172,8 +8259,8 @@ fi
 
 else
       if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}ocamlyacc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}ocamlyacc; ac_word=$2
+  # Extract the first word of "${ac_tool_prefix}[$]OCAMLYACC", so it can be a program name with args.
+set dummy ${ac_tool_prefix}$OCAMLYACC; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
 if ${ac_cv_path_OCAMLYACC+:} false; then :
@@ -8215,8 +8302,8 @@ fi
 fi
 if test -z "$ac_cv_path_OCAMLYACC"; then
   ac_pt_OCAMLYACC=$OCAMLYACC
-  # Extract the first word of "ocamlyacc", so it can be a program name with args.
-set dummy ocamlyacc; ac_word=$2
+  # Extract the first word of "[$]OCAMLYACC", so it can be a program name with args.
+set dummy $OCAMLYACC; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
 if ${ac_cv_path_ac_pt_OCAMLYACC+:} false; then :
@@ -8835,15 +8922,24 @@ fi
 
   with_OCAMLFIND="$with_ocamlfind"
 
-
     if test -n "$with_OCAMLFIND" -a "x$with_OCAMLFIND" != xno -a "x$with_OCAMLFIND" != xyes; then :
       OCAMLFIND="$with_OCAMLFIND"
 
 
+else
+      OCAMLFIND="ocamlfind"
+
+
 fi
 
-    if test "x$with_OCAMLFIND" != xno; then :
-        if test "xocamlfind" = xpkg-config -a "xOCAMLFIND" = xPKG_CONFIG; then :
+    if test "x$with_OCAMLFIND" = xno; then :
+      { $as_echo "$as_me:${as_lineno-$LINENO}: ocamlfind is disabled explicitly" >&5
+$as_echo "$as_me: ocamlfind is disabled explicitly" >&6;}
+    OCAMLFIND=no
+
+
+else
+        if test "x$OCAMLFIND" = xpkg-config -a "xOCAMLFIND" = xPKG_CONFIG; then :
 
 
 if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
@@ -8961,7 +9057,7 @@ $as_echo "no" >&6; }
 
 fi
 
-elif test "xocamlfind" = xocamllex -a "xOCAMLFIND" = xOCAMLLEX; then :
+elif test "x$OCAMLFIND" = xocamllex -a "xOCAMLFIND" = xOCAMLLEX; then :
         # checking for ocamllex
   if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}ocamllex", so it can be a program name with args.
@@ -9167,7 +9263,7 @@ fi
 
 
 
-elif test "xocamlfind" = xocamlyacc -a "xOCAMLFIND" = xOCAMLYACC; then :
+elif test "x$OCAMLFIND" = xocamlyacc -a "xOCAMLFIND" = xOCAMLYACC; then :
         if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}ocamlyacc", so it can be a program name with args.
 set dummy ${ac_tool_prefix}ocamlyacc; ac_word=$2
@@ -9271,8 +9367,8 @@ fi
 
 else
       if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}ocamlfind", so it can be a program name with args.
-set dummy ${ac_tool_prefix}ocamlfind; ac_word=$2
+  # Extract the first word of "${ac_tool_prefix}[$]OCAMLFIND", so it can be a program name with args.
+set dummy ${ac_tool_prefix}$OCAMLFIND; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
 if ${ac_cv_path_OCAMLFIND+:} false; then :
@@ -9314,8 +9410,8 @@ fi
 fi
 if test -z "$ac_cv_path_OCAMLFIND"; then
   ac_pt_OCAMLFIND=$OCAMLFIND
-  # Extract the first word of "ocamlfind", so it can be a program name with args.
-set dummy ocamlfind; ac_word=$2
+  # Extract the first word of "[$]OCAMLFIND", so it can be a program name with args.
+set dummy $OCAMLFIND; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
 if ${ac_cv_path_ac_pt_OCAMLFIND+:} false; then :
@@ -10511,6 +10607,8 @@ else
           as_fn_error $? "OCaml package dynlink is not available but requested explicitly" "$LINENO" 5
 
 fi
+      { $as_echo "$as_me:${as_lineno-$LINENO}: OCaml package dynlink is not available" >&5
+$as_echo "$as_me: OCaml package dynlink is not available" >&6;}
       enable_dynlink=no
 
 
@@ -10545,6 +10643,8 @@ fi
 
     FLAGS_dynlink='$(FLAGS_dynlink)'
 
+    OPTFLAGS_dynlink='$(OPTFLAGS_dynlink)'
+
 
         if test "x$enable_dynlink" = xlocal; then :
         LOCALLIB_dynlink=1
@@ -10630,6 +10730,8 @@ else
           as_fn_error $? "OCaml package camlp4 is not available but requested explicitly" "$LINENO" 5
 
 fi
+      { $as_echo "$as_me:${as_lineno-$LINENO}: OCaml package camlp4 is not available" >&5
+$as_echo "$as_me: OCaml package camlp4 is not available" >&6;}
       enable_camlp4=no
 
 
@@ -10664,6 +10766,8 @@ fi
 
     FLAGS_camlp4='$(FLAGS_camlp4)'
 
+    OPTFLAGS_camlp4='$(OPTFLAGS_camlp4)'
+
 
         if test "x$enable_camlp4" = xlocal; then :
         LOCALLIB_camlp4=1
@@ -10749,6 +10853,8 @@ else
           as_fn_error $? "OCaml package sexplib is not available but requested explicitly" "$LINENO" 5
 
 fi
+      { $as_echo "$as_me:${as_lineno-$LINENO}: OCaml package sexplib is not available" >&5
+$as_echo "$as_me: OCaml package sexplib is not available" >&6;}
       enable_sexplib=no
 
 
@@ -10783,6 +10889,8 @@ fi
 
     FLAGS_sexplib='$(FLAGS_sexplib)'
 
+    OPTFLAGS_sexplib='$(OPTFLAGS_sexplib)'
+
 
         if test "x$enable_sexplib" = xlocal; then :
         LOCALLIB_sexplib=1
@@ -10868,6 +10976,8 @@ else
           as_fn_error $? "OCaml package menhirLib is not available but requested explicitly" "$LINENO" 5
 
 fi
+      { $as_echo "$as_me:${as_lineno-$LINENO}: OCaml package menhirLib is not available" >&5
+$as_echo "$as_me: OCaml package menhirLib is not available" >&6;}
       enable_menhirLib=no
 
 
@@ -10902,6 +11012,8 @@ fi
 
     FLAGS_menhirLib='$(FLAGS_menhirLib)'
 
+    OPTFLAGS_menhirLib='$(OPTFLAGS_menhirLib)'
+
 
         if test "x$enable_menhirLib" = xlocal; then :
         LOCALLIB_menhirLib=1
@@ -10987,6 +11099,8 @@ else
           as_fn_error $? "OCaml package extlib is not available but requested explicitly" "$LINENO" 5
 
 fi
+      { $as_echo "$as_me:${as_lineno-$LINENO}: OCaml package extlib is not available" >&5
+$as_echo "$as_me: OCaml package extlib is not available" >&6;}
       enable_extlib=no
 
 
@@ -11021,6 +11135,8 @@ fi
 
     FLAGS_extlib='$(FLAGS_extlib)'
 
+    OPTFLAGS_extlib='$(OPTFLAGS_extlib)'
+
 
         if test "x$enable_extlib" = xlocal; then :
         LOCALLIB_extlib=1
@@ -11148,6 +11264,16 @@ rm -f confcache
 { $as_echo "$as_me:${as_lineno-$LINENO}: verifying optional features" >&5
 $as_echo "$as_me: verifying optional features" >&6;}
 
+if test "x$OCAML_PKG_dynlink" != xno -a -f "$PATH_dynlink/dynlink.cmxa"; then :
+    OPTIMIZED_dynlink=yes
+
+
+else
+    OPTIMIZED_dynlink=no
+
+
+fi
+
 
 
 
 
   with_MENHIR="$with_menhir"
 
-
     if test -n "$with_MENHIR" -a "x$with_MENHIR" != xno -a "x$with_MENHIR" != xyes; then :
       MENHIR="$with_MENHIR"
 
 
+else
+      MENHIR="menhir"
+
+
 fi
 
-    if test "x$with_MENHIR" != xno; then :
-        if test "xmenhir" = xpkg-config -a "xMENHIR" = xPKG_CONFIG; then :
+    if test "x$with_MENHIR" = xno; then :
+      { $as_echo "$as_me:${as_lineno-$LINENO}: menhir is disabled explicitly" >&5
+$as_echo "$as_me: menhir is disabled explicitly" >&6;}
+    MENHIR=no
+
+
+else
+        if test "x$MENHIR" = xpkg-config -a "xMENHIR" = xPKG_CONFIG; then :
 
 
 if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
@@ -11284,7 +11419,7 @@ $as_echo "no" >&6; }
 
 fi
 
-elif test "xmenhir" = xocamllex -a "xMENHIR" = xOCAMLLEX; then :
+elif test "x$MENHIR" = xocamllex -a "xMENHIR" = xOCAMLLEX; then :
         # checking for ocamllex
   if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}ocamllex", so it can be a program name with args.
@@ -11490,7 +11625,7 @@ fi
 
 
 
-elif test "xmenhir" = xocamlyacc -a "xMENHIR" = xOCAMLYACC; then :
+elif test "x$MENHIR" = xocamlyacc -a "xMENHIR" = xOCAMLYACC; then :
         if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}ocamlyacc", so it can be a program name with args.
 set dummy ${ac_tool_prefix}ocamlyacc; ac_word=$2
@@ -11594,8 +11729,8 @@ fi
 
 else
       if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}menhir", so it can be a program name with args.
-set dummy ${ac_tool_prefix}menhir; ac_word=$2
+  # Extract the first word of "${ac_tool_prefix}[$]MENHIR", so it can be a program name with args.
+set dummy ${ac_tool_prefix}$MENHIR; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
 if ${ac_cv_path_MENHIR+:} false; then :
@@ -11637,8 +11772,8 @@ fi
 fi
 if test -z "$ac_cv_path_MENHIR"; then
   ac_pt_MENHIR=$MENHIR
-  # Extract the first word of "menhir", so it can be a program name with args.
-set dummy menhir; ac_word=$2
+  # Extract the first word of "[$]MENHIR", so it can be a program name with args.
+set dummy $MENHIR; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
 if ${ac_cv_path_ac_pt_MENHIR+:} false; then :
 fi
 
 if test "x$OCAMLATLEAST311" = xno; then :
-    enable_ocaml=no
+    if test -z "$enable_ocaml"; then :
+      enable_ocaml=no
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: ocaml scripting has been disabled by default because your OCaml version may not support dynamic linking properly" >&5
+$as_echo "$as_me: ocaml scripting has been disabled by default because your OCaml version may not support dynamic linking properly" >&6;}
 
-  { $as_echo "$as_me:${as_lineno-$LINENO}: ocaml scripting has been disabled because your OCaml version may not support dynamic linking properly" >&5
-$as_echo "$as_me: ocaml scripting has been disabled because your OCaml version may not support dynamic linking properly" >&6;}
+elif test "x$enable_ocaml" = xyes; then :
+      { $as_echo "$as_me:${as_lineno-$LINENO}: warning: your ocaml version may be too old for dynamic linking, thus ocaml scripting may not work" >&5
+$as_echo "$as_me: warning: your ocaml version may be too old for dynamic linking, thus ocaml scripting may not work" >&6;}
+
+fi
+
+fi
+
+if test "x$OPTIMIZED_dynlink" = xno; then :
+    if test -z "$enable_ocaml"; then :
+      enable_ocaml=no
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: ocaml scripting has been disabled by default because the optimized version of dynlink is not available" >&5
+$as_echo "$as_me: ocaml scripting has been disabled by default because the optimized version of dynlink is not available" >&6;}
+
+elif test "x$enable_ocaml" = xyes; then :
+      { $as_echo "$as_me:${as_lineno-$LINENO}: warning: the optimized version of dynlink is not available, thus ocaml scripting may not work" >&5
+$as_echo "$as_me: warning: the optimized version of dynlink is not available, thus ocaml scripting may not work" >&6;}
+
+fi
 
 fi
 
@@ -12290,8 +12447,8 @@ if test -n "$SUBSTITUTED_OCAMLFIND"; then :
 $as_echo "$as_me: ocaml scripting is disabled because it depends on ocamlfind" >&6;}
 
 elif test "x$enable_ocaml" != xno; then :
-      { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ocamlfind is not found but may be required if ocaml scripts are used" >&5
-$as_echo "$as_me: warning: ocamlfind is not found but may be required if ocaml scripts are used" >&6;}
+      { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ocamlfind is not found but may be required when ocaml scripts are used" >&5
+$as_echo "$as_me: warning: ocamlfind is not found but may be required when ocaml scripts are used" >&6;}
 
 fi
 
@@ -12301,12 +12458,12 @@ if test "x$CAMLP4" = xno; then :
     if test -z "$enable_ocaml"; then :
       enable_ocaml=no
 
-    { $as_echo "$as_me:${as_lineno-$LINENO}: ocaml scripting is disabled because it depends on camlp4" >&5
-$as_echo "$as_me: ocaml scripting is disabled because it depends on camlp4" >&6;}
+    { $as_echo "$as_me:${as_lineno-$LINENO}: ocaml scripting is disabled because it requires camlp4 which is not available" >&5
+$as_echo "$as_me: ocaml scripting is disabled because it requires camlp4 which is not available" >&6;}
 
 elif test "x$enable_ocaml" != xno; then :
-      { $as_echo "$as_me:${as_lineno-$LINENO}: warning: camlp4 is not found but may be required if ocaml scripts are used" >&5
-$as_echo "$as_me: warning: camlp4 is not found but may be required if ocaml scripts are used" >&6;}
+      { $as_echo "$as_me:${as_lineno-$LINENO}: warning: camlp4 is not found but may be required when ocaml scripts are used" >&5
+$as_echo "$as_me: warning: camlp4 is not found but may be required when ocaml scripts are used" >&6;}
 
 fi
 
@@ -12348,7 +12505,7 @@ if test "${enable_python+set}" = set; then :
 fi
 
 if test "x$enable_python" != xno; then :
-      if test -n "$enable_python" -a -z "$enable_pycaml"; then :
+          if test -n "$enable_python" -a -z "$enable_pycaml"; then :
       { $as_echo "$as_me:${as_lineno-$LINENO}: skipped the selection of a global pycaml module because --enable-python is given explicitly but --enable-pycaml is not." >&5
 $as_echo "$as_me: skipped the selection of a global pycaml module because --enable-python is given explicitly but --enable-pycaml is not." >&6;}
     enable_pycaml=no
@@ -12359,6 +12516,7 @@ fi
       if test -z "$PYVER"; then :
 
 
+
 # Check whether --with-python was given.
 if test "${with_python+set}" = set; then :
   withval=$with_python;
 
   with_PYTHON="$with_python"
 
-
     if test -n "$with_PYTHON" -a "x$with_PYTHON" != xno -a "x$with_PYTHON" != xyes; then :
       PYTHON="$with_PYTHON"
 
 
+else
+      PYTHON="python"
+
+
 fi
 
-    if test "x$with_PYTHON" != xno; then :
-        if test "xpython" = xpkg-config -a "xPYTHON" = xPKG_CONFIG; then :
+    if test "x$with_PYTHON" = xno; then :
+      { $as_echo "$as_me:${as_lineno-$LINENO}: python is disabled explicitly" >&5
+$as_echo "$as_me: python is disabled explicitly" >&6;}
+    PYTHON=no
+
+
+else
+        if test "x$PYTHON" = xpkg-config -a "xPYTHON" = xPKG_CONFIG; then :
 
 
 if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
@@ -12492,7 +12659,7 @@ $as_echo "no" >&6; }
 
 fi
 
-elif test "xpython" = xocamllex -a "xPYTHON" = xOCAMLLEX; then :
+elif test "x$PYTHON" = xocamllex -a "xPYTHON" = xOCAMLLEX; then :
         # checking for ocamllex
   if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}ocamllex", so it can be a program name with args.
@@ -12698,7 +12865,7 @@ fi
 
 
 
-elif test "xpython" = xocamlyacc -a "xPYTHON" = xOCAMLYACC; then :
+elif test "x$PYTHON" = xocamlyacc -a "xPYTHON" = xOCAMLYACC; then :
         if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}ocamlyacc", so it can be a program name with args.
 set dummy ${ac_tool_prefix}ocamlyacc; ac_word=$2
@@ -12802,8 +12969,8 @@ fi
 
 else
       if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}python", so it can be a program name with args.
-set dummy ${ac_tool_prefix}python; ac_word=$2
+  # Extract the first word of "${ac_tool_prefix}[$]PYTHON", so it can be a program name with args.
+set dummy ${ac_tool_prefix}$PYTHON; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
 if ${ac_cv_path_PYTHON+:} false; then :
@@ -12845,8 +13012,8 @@ fi
 fi
 if test -z "$ac_cv_path_PYTHON"; then
   ac_pt_PYTHON=$PYTHON
-  # Extract the first word of "python", so it can be a program name with args.
-set dummy python; ac_word=$2
+  # Extract the first word of "[$]PYTHON", so it can be a program name with args.
+set dummy $PYTHON; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
 if ${ac_cv_path_ac_pt_PYTHON+:} false; then :
 fi
 
 
+        if test "x$PYTHON" = xno -a -z "$with_python"; then :
+        for ac_prog in python python3 python3.2 python3.1 python2 python2.7 python2.6 python2.5
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_PYTHON+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $PYTHON in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_PYTHON="$PYTHON" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_PYTHON="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+PYTHON=$ac_cv_path_PYTHON
+if test -n "$PYTHON"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON" >&5
+$as_echo "$PYTHON" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$PYTHON" && break
+done
+
+      if test -z "$PYTHON"; then :
+  PYTHON=no
+
+fi
+
+fi
+
     if test "x$PYTHON" = xno -a -n "$with_python" -a "x$with_python" != xyes; then :
-        { $as_echo "$as_me:${as_lineno-$LINENO}:  is not a found as tool, therefore interpreted as version" >&5
-$as_echo "$as_me:  is not a found as tool, therefore interpreted as version" >&6;}
-      PYVER=""
+        { $as_echo "$as_me:${as_lineno-$LINENO}: $with_python is not a found as tool, therefore interpreted as version" >&5
+$as_echo "$as_me: $with_python is not a found as tool, therefore interpreted as version" >&6;}
+      PYVER="$with_python"
 
 
 fi
@@ -13486,6 +13706,11 @@ $as_echo "$as_me: python version assumed to be $PYVER" >&6;}
 
 fi
 
+    PYVER_MAJOR=${PYVER%%.*}
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: python major version: $PYVER_MAJOR" >&5
+$as_echo "$as_me: python major version: $PYVER_MAJOR" >&6;}
+
 
   if test -z "$PYVER"; then :
       if test "x$enable_python" = xyes; then :
@@ -13494,6 +13719,8 @@ fi
 fi
 
 else
+      { $as_echo "$as_me:${as_lineno-$LINENO}: looking for the corresponding python library" >&5
+$as_echo "$as_me: looking for the corresponding python library" >&6;}
 
 pkg_failed=no
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PYTHON" >&5
@@ -13566,8 +13793,8 @@ $as_echo "yes" >&6; }
 fi
 
     if test "x$HAVE_PYTHON" != xyes -a "x$enable_python" != xyes; then :
-        { $as_echo "$as_me:${as_lineno-$LINENO}: trying the default python version as fallback" >&5
-$as_echo "$as_me: trying the default python version as fallback" >&6;}
+        { $as_echo "$as_me:${as_lineno-$LINENO}: trying the default python library as fallback" >&5
+$as_echo "$as_me: trying the default python library as fallback" >&6;}
 
 pkg_failed=no
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PYTHON" >&5
@@ -13719,6 +13946,8 @@ else
           as_fn_error $? "OCaml package pycaml is not available but requested explicitly" "$LINENO" 5
 
 fi
+      { $as_echo "$as_me:${as_lineno-$LINENO}: OCaml package pycaml is not available" >&5
+$as_echo "$as_me: OCaml package pycaml is not available" >&6;}
       enable_pycaml=no
 
 
@@ -13753,6 +13982,8 @@ fi
 
     FLAGS_pycaml='$(FLAGS_pycaml)'
 
+    OPTFLAGS_pycaml='$(OPTFLAGS_pycaml)'
+
 
         if test "x$enable_pycaml" = xlocal; then :
         LOCALLIB_pycaml=1
@@ -13946,6 +14177,8 @@ else
           as_fn_error $? "OCaml package pcre is not available but requested explicitly" "$LINENO" 5
 
 fi
+      { $as_echo "$as_me:${as_lineno-$LINENO}: OCaml package pcre is not available" >&5
+$as_echo "$as_me: OCaml package pcre is not available" >&6;}
       enable_pcre=no
 
 
@@ -13980,6 +14213,8 @@ fi
 
     FLAGS_pcre='$(FLAGS_pcre)'
 
+    OPTFLAGS_pcre='$(OPTFLAGS_pcre)'
+
 
         if test "x$enable_pcre" = xlocal; then :
         LOCALLIB_pcre=1
@@ -14167,7 +14402,7 @@ else
 
 fi
 
-if test "x$OCAMLATLEAST311" = xyes -a "x$enable_ocaml" = xyes; then :
+if test "x$OCAMLATLEAST311" = xyes -a "x$enable_ocaml" = xyes -a "x$OCAMLOPT" != xno; then :
     DYNLINK_IS_NATIVE=Dynlink.is_native
 
 
 
   with_PDFLATEX="$with_pdflatex"
 
-
     if test -n "$with_PDFLATEX" -a "x$with_PDFLATEX" != xno -a "x$with_PDFLATEX" != xyes; then :
       PDFLATEX="$with_PDFLATEX"
 
 
+else
+      PDFLATEX="pdflatex"
+
+
 fi
 
-    if test "x$with_PDFLATEX" != xno; then :
-        if test "xpdflatex" = xpkg-config -a "xPDFLATEX" = xPKG_CONFIG; then :
+    if test "x$with_PDFLATEX" = xno; then :
+      { $as_echo "$as_me:${as_lineno-$LINENO}: pdflatex is disabled explicitly" >&5
+$as_echo "$as_me: pdflatex is disabled explicitly" >&6;}
+    PDFLATEX=no
+
+
+else
+        if test "x$PDFLATEX" = xpkg-config -a "xPDFLATEX" = xPKG_CONFIG; then :
 
 
 if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
@@ -14312,7 +14556,7 @@ $as_echo "no" >&6; }
 
 fi
 
-elif test "xpdflatex" = xocamllex -a "xPDFLATEX" = xOCAMLLEX; then :
+elif test "x$PDFLATEX" = xocamllex -a "xPDFLATEX" = xOCAMLLEX; then :
         # checking for ocamllex
   if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}ocamllex", so it can be a program name with args.
@@ -14518,7 +14762,7 @@ fi
 
 
 
-elif test "xpdflatex" = xocamlyacc -a "xPDFLATEX" = xOCAMLYACC; then :
+elif test "x$PDFLATEX" = xocamlyacc -a "xPDFLATEX" = xOCAMLYACC; then :
         if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}ocamlyacc", so it can be a program name with args.
 set dummy ${ac_tool_prefix}ocamlyacc; ac_word=$2
@@ -14622,8 +14866,8 @@ fi
 
 else
       if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}pdflatex", so it can be a program name with args.
-set dummy ${ac_tool_prefix}pdflatex; ac_word=$2
+  # Extract the first word of "${ac_tool_prefix}[$]PDFLATEX", so it can be a program name with args.
+set dummy ${ac_tool_prefix}$PDFLATEX; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
 if ${ac_cv_path_PDFLATEX+:} false; then :
@@ -14665,8 +14909,8 @@ fi
 fi
 if test -z "$ac_cv_path_PDFLATEX"; then
   ac_pt_PDFLATEX=$PDFLATEX
-  # Extract the first word of "pdflatex", so it can be a program name with args.
-set dummy pdflatex; ac_word=$2
+  # Extract the first word of "[$]PDFLATEX", so it can be a program name with args.
+set dummy $PDFLATEX; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
 $as_echo_n "checking for $ac_word... " >&6; }
 if ${ac_cv_path_ac_pt_PDFLATEX+:} false; then :
 
 
 
-
 # Check whether --enable-release was given.
 if test "${enable_release+set}" = set; then :
   enableval=$enable_release;
 fi
 
-
-if test "x$OCAMLOPT" = xno; then :
-    if test "x$enable_release" = xyes; then :
-      as_fn_error $? "a release build is requested, but ocamlopt is not available" "$LINENO" 5
-
-fi
-
-  enable_release=no
-
-
-fi
-
-if test "x$OCAMLVERSION" = x3.11.2 -a "x$enable_release" != xyes; then :
-    { $as_echo "$as_me:${as_lineno-$LINENO}: the optimized version of coccinelle will not be build by default due to OCaml version $OCAMLVERSION and --enable-build-all is not given to override this decision" >&5
-$as_echo "$as_me: the optimized version of coccinelle will not be build by default due to OCaml version $OCAMLVERSION and --enable-build-all is not given to override this decision" >&6;}
-  enable_release=no
-
-
-fi
-
 if test -z "$enable_release"; then :
     { $as_echo "$as_me:${as_lineno-$LINENO}: choosing the development Makefile configuration because the release configuration is not explicitly requested." >&5
 $as_echo "$as_me: choosing the development Makefile configuration because the release configuration is not explicitly requested." >&6;}
@@ -15326,31 +15549,78 @@ else
 
 fi
 
-if test "x$enable_release" != xno; then :
-  SPATCHNAME=spatch.opt
+# Check whether --enable-opt was given.
+if test "${enable_opt+set}" = set; then :
+  enableval=$enable_opt;
+fi
+
+if test "x$OCAMLOPT" = xno -a "x$enable_opt" != xno; then :
+    if test -n "$enable_release" -a "x$enable_release" != xyes -a "x$enable_release" != xno; then :
+      { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ensure that make target $enable_release does not depend on the unavailable ocamlopt" >&5
+$as_echo "$as_me: warning: ensure that make target $enable_release does not depend on the unavailable ocamlopt" >&6;}
+
+elif test "x$enable_opt" = xyes; then :
+      as_fn_error $? "the optimized version of coccinelle is requested explicitly, but ocamlopt is absent" "$LINENO" 5
+
 else
-  SPATCHNAME=spatch
+      { $as_echo "$as_me:${as_lineno-$LINENO}: the optimized version of coccinelle will not be build because ocamlopt is not present" >&5
+$as_echo "$as_me: the optimized version of coccinelle will not be build because ocamlopt is not present" >&6;}
+    enable_opt=no
+
+
+fi
+
+fi
+
+if test "x$OCAMLVERSION" = x3.11.2 -a -z "$enable_opt"; then :
+    { $as_echo "$as_me:${as_lineno-$LINENO}: the optimized version of coccinelle will not be build by default due to OCaml version $OCAMLVERSION" >&5
+$as_echo "$as_me: the optimized version of coccinelle will not be build by default due to OCaml version $OCAMLVERSION" >&6;}
+  enable_opt=no
+
+
 fi
 
+if test "x$OPTIMIZED_dynlink" = xno -a "x$enable_ocaml" = xyes; then :
+    if test -z "$enable_opt"; then :
+      { $as_echo "$as_me:${as_lineno-$LINENO}: the optimized version of coccinelle will not be build by default because ocaml scripting is enabled but the required optimized dynlink package is not present" >&5
+$as_echo "$as_me: the optimized version of coccinelle will not be build by default because ocaml scripting is enabled but the required optimized dynlink package is not present" >&6;}
+    enable_opt=no
+
+
+elif test "x$enable_opt" = xyes; then :
+      as_fn_error $? "the optimized version of coccinelle in combination with ocaml scripting requires the optimized version of the dynlik package, which is not present" "$LINENO" 5
+
+fi
 
+fi
 
-ac_config_files="$ac_config_files Makefile.config"
+# set the default enable-opt setting
+if test -z "$enable_opt"; then :
+    if test "x$enable_release" = xyes -o "x$enable_release" = xno; then :
+      enable_opt="$enable_release"
 
-ac_config_files="$ac_config_files version.ml"
 
-ac_config_files="$ac_config_files commons/commands.ml"
+fi
 
-ac_config_files="$ac_config_files globals/config.ml"
+fi
 
-ac_config_files="$ac_config_files globals/regexp.ml"
+if test "x$enable_opt" = xyes; then :
+    SPATCHNAME=spatch.opt
 
-ac_config_files="$ac_config_files python/pycocci.ml"
+  MAKETARGET_SPATCH=opt-only
 
-ac_config_files="$ac_config_files ocaml/prepare_ocamlcocci.ml"
 
-ac_config_files="$ac_config_files scripts/spatch.sh"
+else
+    SPATCHNAME=spatch
 
-ac_config_files="$ac_config_files docs/spatch.1"
+  MAKETARGET_SPATCH=byte-only
+
+
+fi
+
+
+
+ac_config_files="$ac_config_files Makefile.config version.ml commons/commands.ml globals/config.ml globals/regexp.ml python/pycocci.ml ocaml/prepare_ocamlcocci.ml scripts/spatch.sh docs/spatch.1"
 
 
 cat >confcache <<\_ACEOF
@@ -15907,7 +16177,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by coccinelle $as_me `cat ./version`, which was
+This file was extended by coccinelle $as_me 1.0.0-rc12, which was
 generated by GNU Autoconf 2.68.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -15961,7 +16231,7 @@ _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-coccinelle config.status `cat ./version`
+coccinelle config.status 1.0.0-rc12
 configured by $0, generated by GNU Autoconf 2.68,
   with options \\"\$ac_cs_config\\"
 
@@ -16550,23 +16820,22 @@ cat << EOF
 ------------------------------------------------------------------------------
 Summary
 
-findlib:          $OCAMLFIND
-menhir:           $MENHIR
-menhirLib module: $OCAML_PKG_menhirLib
+configure flags:  $CONFIGURE_FLAGS
+findlib:          $OCAMLFIND   (an actual version is strongly recommended)
+menhir:           $MENHIR      (should be an optional tool)
+menhirLib module: $enable_mehir        (for local package use --disable-menhirLib)
 
-ocaml scripting:  $enable_ocaml
-python scripting: $enable_python
-pycaml module:    $enable_pycaml
+ocaml scripting:  $enable_ocaml        (overridable with --enable-ocaml)
+python scripting: $enable_python       (overridable with --enable-python)
+pycaml module:    $enable_pycaml       (for local package use --disable-pycaml)
 
-pcre regexes:     $enable_pcre_syntax
-pcre module:      $enable_pcre
-pcre library:     $HAVE_PCRE
+pcre regexes:     $enable_pcre_syntax  (overridable with --enable-pcre-syntax)
+pcre module:      $enable_pcre (for local package use --disable-pcre)
+pcre library:     $HAVE_PCRE   (requires the dev version of libpcre)
 
-release config:   $enable_release
+release config:   $enable_release      (strongly recommended to be 'yes', overridable with --enable-release)
+optimized spatch: $enable_opt  (overridable with --disable-opt)
 
-EOF
-
-cat << EOF
 ------------------------------------------------------------------------------
 Coccinelle can now be compiled and installed.
 
@@ -16581,8 +16850,11 @@ To compile coccinelle, run:
 To install coccinelle, run:
   \$ make install
 
-Then, to test coccinelle run for example:
-  \$ $SPATCHNAME -sp_file demos/simple.cocci demos/simple.c -o /tmp/new_simple.c
+Then, to test coccinelle, run for example:
+  \$ spatch -sp_file demos/simple.cocci demos/simple.c -o /tmp/new_simple.c
+
+Or when coccinelle is not installed yet:
+  \$ COCCINELLE_HOME=$(pwd) ./scripts/spatch -sp_file demos/simple.cocci demos/simple.c -o /tmp/new_simple.c
 EOF
 
 if test "x$enable_python" != "xno"; then
index 47fb518..ca7ceea 100644 (file)
@@ -1,7 +1,12 @@
 dnl  standard initialization (we only use autoconf not automake)
-AC_INIT([coccinelle], [`cat ./version`], [cocci@diku.dk], [], [http://coccinelle.lip6.fr/])
-AC_SUBST([COCCI_VERSION], [$(cat ./version)])
-AC_SUBST([COCCI_SRCDIR], [$(pwd)])
+AC_PREREQ([2.68])
+AC_INIT([coccinelle], m4_esyscmd([cat ./version | tr -d '\n']), [cocci@diku.dk], [], [http://coccinelle.lip6.fr/])
+AC_CONFIG_MACRO_DIR([setup])
+AC_CONFIG_AUX_DIR([setup])
+
+AC_SUBST([CONFIGURE_FLAGS], ["$*"])
+AC_SUBST([COCCI_VERSION], ["$PACKAGE_VERSION"])
+AC_SUBST([COCCI_SRCDIR], ["$(pwd)"])
 AC_MSG_NOTICE([configuring coccinelle $COCCI_VERSION in $COCCI_SRCDIR])
 
 AC_CONFIG_SRCDIR([cocci.ml])    dnl  this file must be present in our src directory
@@ -33,6 +38,7 @@ AC_PROG_MKDIR_P
 AC_PROG_CPP
 AC_PATH_PROG([TAR],[tar])
 AC_PATH_PROG([PATCH],[patch])
+AC_PATH_PROG([PATCHELF],[patchelf])
 
 dnl  pkg config is required
 AC_COCCI_TOOL([PKG_CONFIG],[pkg-config],[$COCCI_SRCDIR/setup/fake-subst.sh pkg-config])
@@ -74,7 +80,7 @@ AS_IF([test "x$OCAMLFIND" = xno],
   AC_MSG_ERROR([A suitable OCaml findlib (the ocamlfind command) could not be found.])
 ])
 
-dnl  these variables are substituted for in the code: this guarantees a default for them.
+dnl  these runtime commands can also be passed as runtime flags to spatch.
 AC_COCCI_RUNTIME_CMD([OCAMLFIND],[ocamlfind])
 AC_COCCI_RUNTIME_CMD([OCAMLC],[ocamlc])
 AC_COCCI_RUNTIME_CMD([OCAMLOPT],[ocamlopt])
@@ -131,6 +137,15 @@ dnl
 
 AC_MSG_NOTICE([verifying optional features])
 
+dnl  test if the optimized version of dynlink is available
+AS_IF([test "x$OCAML_PKG_dynlink" != xno -a -f "$PATH_dynlink/dynlink.cmxa"],
+[dnl  yes
+  AC_SUBST([OPTIMIZED_dynlink], [yes])
+],
+[dnl  no
+  AC_SUBST([OPTIMIZED_dynlink], [no])
+])
+
 
 dnl  menhir handling
 dnl  variables:
@@ -150,7 +165,7 @@ AS_IF([test "x$OCAML_PKG_dynlink" = xno],
 [dnl
   AS_IF([test -z "$enable_ocaml"],
   [dnl
-    AC_SUBST([enable_ocaml],[no])
+    AC_SUBST([enable_ocaml], [no])
     AC_MSG_NOTICE([ocaml scripting is disabled because the 'dynlink' package is not installed])
   ], [test "x$enable_ocaml" != xno],
   [dnl
@@ -161,8 +176,27 @@ AS_IF([test "x$OCAML_PKG_dynlink" = xno],
 dnl  too old ocaml version, disable dynlink by default
 AS_IF([test "x$OCAMLATLEAST311" = xno],
 [dnl
-  AC_SUBST([enable_ocaml],[no])
-  AC_MSG_NOTICE([ocaml scripting has been disabled because your OCaml version may not support dynamic linking properly])
+  AS_IF([test -z "$enable_ocaml"],
+  [dnl
+    AC_SUBST([enable_ocaml], [no])
+    AC_MSG_NOTICE([ocaml scripting has been disabled by default because your OCaml version may not support dynamic linking properly])
+  ], [test "x$enable_ocaml" = xyes],
+  [dnl
+    AC_MSG_NOTICE([warning: your ocaml version may be too old for dynamic linking, thus ocaml scripting may not work])
+  ])
+])
+
+dnl  no optimized version, disable dynlink by default
+AS_IF([test "x$OPTIMIZED_dynlink" = xno],
+[dnl
+  AS_IF([test -z "$enable_ocaml"],
+  [dnl
+    AC_SUBST([enable_ocaml], [no])
+    AC_MSG_NOTICE([ocaml scripting has been disabled by default because the optimized version of dynlink is not available])
+  ], [test "x$enable_ocaml" = xyes],
+  [dnl
+    AC_MSG_NOTICE([warning: the optimized version of dynlink is not available, thus ocaml scripting may not work])
+  ])
 ])
 
 dnl  scripting requirement on ocamlfind
@@ -174,7 +208,7 @@ AS_IF([test -n "$SUBSTITUTED_OCAMLFIND"],
     AC_MSG_NOTICE([ocaml scripting is disabled because it depends on ocamlfind])
   ], [test "x$enable_ocaml" != xno],
   [dnl
-    AC_MSG_NOTICE([warning: ocamlfind is not found but may be required if ocaml scripts are used])
+    AC_MSG_NOTICE([warning: ocamlfind is not found but may be required when ocaml scripts are used])
   ])
 ])
 
@@ -184,23 +218,23 @@ AS_IF([test "x$CAMLP4" = xno],
   AS_IF([test -z "$enable_ocaml"],
   [dnl  this is perhaps a bit too strict
     AC_SUBST([enable_ocaml],no)
-    AC_MSG_NOTICE([ocaml scripting is disabled because it depends on camlp4])
+    AC_MSG_NOTICE([ocaml scripting is disabled because it requires camlp4 which is not available])
   ], [test "x$enable_ocaml" != xno],
   [dnl
-    AC_MSG_NOTICE([warning: camlp4 is not found but may be required if ocaml scripts are used])
+    AC_MSG_NOTICE([warning: camlp4 is not found but may be required when ocaml scripts are used])
   ])
 ])
 
 AS_IF([test "x$enable_ocaml" = xno],
 [dnl
   AC_COCCI_INIT_PKG_EMPTY([dynlink])    dnl  prevent linking with it
-  AC_SUBST(OCAMLCOCCI_MODULE,[No_prepare_ocamlcocci])
-  AC_SUBST(OCAMLCOCCI_FILE,[no_prepare_ocamlcocci.ml])
+  AC_SUBST(OCAMLCOCCI_MODULE, [No_prepare_ocamlcocci])
+  AC_SUBST(OCAMLCOCCI_FILE, [no_prepare_ocamlcocci.ml])
 ],
 [dnl
-  AC_SUBST([enable_ocaml],[yes])
-  AC_SUBST(OCAMLCOCCI_MODULE,[Yes_prepare_ocamlcocci])
-  AC_SUBST(OCAMLCOCCI_FILE,[yes_prepare_ocamlcocci.ml])
+  AC_SUBST([enable_ocaml], [yes])
+  AC_SUBST(OCAMLCOCCI_MODULE, [Yes_prepare_ocamlcocci])
+  AC_SUBST(OCAMLCOCCI_FILE, [yes_prepare_ocamlcocci.ml])
 ])
 
 
@@ -212,11 +246,13 @@ AC_ARG_VAR([PYTHON], [path to python when the version is determined automaticall
 AC_ARG_ENABLE([python], [AS_HELP_STRING([--enable-python], [enable python scripting (yes/no) (default: auto)])])
 AS_IF([test "x$enable_python" != xno],
 [dnl
-  dnl  an explicitly set --with-python disablees by default the global pycaml
+  dnl  an explicitly set --with-python disables the global pycaml by default
+  dnl  set --enable-pycaml if it is clear that the installed pycaml library
+  dnl  is consistent with the chosen python version
   AS_IF([test -n "$enable_python" -a -z "$enable_pycaml"],
   [dnl  if explicit python given: 
     AC_MSG_NOTICE([skipped the selection of a global pycaml module because --enable-python is given explicitly but --enable-pycaml is not.])
-    AC_SUBST([enable_pycaml],[no])
+    AC_SUBST([enable_pycaml], [no])
   ])
 
   dnl  sets "$PYVER" if python is available
@@ -230,11 +266,12 @@ AS_IF([test "x$enable_python" != xno],
     ])
   ],
   [dnl
+    AC_MSG_NOTICE([looking for the corresponding python library])
     PKG_CHECK_MODULES([PYTHON], [python-$PYVER],[AC_SUBST(HAVE_PYTHON,[yes])],[AC_SUBST(HAVE_PYTHON,[no])])
 
     AS_IF([test "x$HAVE_PYTHON" != xyes -a "x$enable_python" != xyes],
     [dnl  fallback if the above failed
-      AC_MSG_NOTICE([trying the default python version as fallback])
+      AC_MSG_NOTICE([trying the default python library as fallback])
       PKG_CHECK_MODULES([PYTHON], [python],[AC_SUBST(HAVE_PYTHON,[yes])],[AC_SUBST(HAVE_PYTHON,[no])])
     ])
   ])
@@ -244,10 +281,10 @@ AS_IF([test -z "$enable_python"],
 [dnl
   AS_IF([test "x$HAVE_PYTHON" = xyes],
   [dnl
-    AC_SUBST([enable_python],[yes])
+    AC_SUBST([enable_python], [yes])
   ],
   [dnl
-    AC_SUBST([enable_python],[no])
+    AC_SUBST([enable_python], [no])
   ])
 ])
 
@@ -282,7 +319,7 @@ AS_IF([test "x$enable_pcre_syntax" != "xno"],
   PKG_CHECK_MODULES([PCRE], [libpcre],[AC_SUBST([HAVE_PCRE],[yes])],[AC_SUBST([HAVE_PCRE],[no])])
   AS_IF([test -z "$enable_pcre_syntax" -a "x$HAVE_PCRE" != xyes],
   [dnl
-    AC_SUBST([enable_pcre_syntax],[no])
+    AC_SUBST([enable_pcre_syntax], [no])
   ],
   [dnl
     AC_CHECK_COCCI_EXTPKG([pcre])  dnl  will set $enable_pcre to 'yes', 'no', or 'local'
@@ -326,58 +363,35 @@ AC_SUBST(SHAREDIR,["${prefix}/share/coccinelle"])
 
 AS_IF([test "x$enable_python" != xno],
 [dnl
-  AC_SUBST(FEATURE_PYTHON,[1])
+  AC_SUBST(FEATURE_PYTHON, [1])
 ],
 [dnl
-  AC_SUBST(FEATURE_PYTHON,[0])
+  AC_SUBST(FEATURE_PYTHON, [0])
 ])
 
 AS_IF([test "x$enable_ocaml" != xno],
 [dnl
-  AC_SUBST(FEATURE_OCAML,[1])
+  AC_SUBST(FEATURE_OCAML, [1])
 ],
 [dnl
-  AC_SUBST(FEATURE_OCAML,[0])
+  AC_SUBST(FEATURE_OCAML, [0])
 ])
 
 dnl  dynlink stuff depending on the OCaml version and whether it is enabled
-AS_IF([test "x$OCAMLATLEAST311" = xyes -a "x$enable_ocaml" = xyes],
+AS_IF([test "x$OCAMLATLEAST311" = xyes -a "x$enable_ocaml" = xyes -a "x$OCAMLOPT" != xno],
 [dnl
-  AC_SUBST([DYNLINK_IS_NATIVE],[Dynlink.is_native])
+  AC_SUBST([DYNLINK_IS_NATIVE], [Dynlink.is_native])
 ],
 [dnl
-  AC_SUBST([DYNLINK_IS_NATIVE],[false])
+  AC_SUBST([DYNLINK_IS_NATIVE], [false])
 ])
 
 dnl  in case of the compilation of the manual
 AC_COCCI_TOOL([PDFLATEX],[pdflatex],[$COCCI_SRCDIR/setup/fake-pdflatex.sh pdflatex])
 
 
-dnl
-dnl  determine the default make target
-dnl  if ocamlopt is availabe, the default is both
-dnl  the bytecode version and the optimized version
-dnl  of coccinelle.
-dnl
-
+dnl  determine release configuration
 AC_ARG_ENABLE([release], [AS_HELP_STRING([--enable-release], [build with a release configuration (yes,no, default: no)])])
-
-AS_IF([test "x$OCAMLOPT" = xno],
-[dnl
-  AS_IF([test "x$enable_release" = xyes],
-  [dnl
-    AC_MSG_ERROR([a release build is requested, but ocamlopt is not available])
-  ])
-
-  AC_SUBST([enable_release],[no])
-])
-
-AS_IF([test "x$OCAMLVERSION" = x3.11.2 -a "x$enable_release" != xyes],
-[dnl  the optimized version may not be buildable with ocaml 3.11.2 (know bug), hence disable it by default
-  AC_MSG_NOTICE([the optimized version of coccinelle will not be build by default due to OCaml version $OCAMLVERSION and --enable-build-all is not given to override this decision])
-  AC_SUBST([enable_release],[no])
-])
-
 AS_IF([test -z "$enable_release"],
 [dnl
   AC_MSG_NOTICE([choosing the development Makefile configuration because the release configuration is not explicitly requested.])
@@ -385,33 +399,86 @@ AS_IF([test -z "$enable_release"],
 ])
 
 AS_IF([test "x$enable_release" = xyes],
-[dnl  include the optimized version by default
+[dnl  set the default target to 'release' when enable_release is given
   AC_SUBST([MAKETARGET_ALL], [all-release])
 ], [test "x$enable_release" = xno],
-[dnl  otherwise, exclude the optimized version
+[dnl  otherwise, set the default target to 'dev'
   AC_SUBST([MAKETARGET_ALL], [all-dev])
 ],
 [dnl  custom target given
   AC_SUBST([MAKETARGET_ALL], ["$enable_release"])
 ])
 
-dnl  which spatch will be constructed
-AS_IF([test "x$enable_release" != xno],[SPATCHNAME=spatch.opt],[SPATCHNAME=spatch])
+dnl  determine whether to build the optimizing version
+AC_ARG_ENABLE([opt], [AS_HELP_STRING([--enable-opt], [build an optimized spatch (yes,no, default: auto)])])
+AS_IF([test "x$OCAMLOPT" = xno -a "x$enable_opt" != xno],
+[dnl
+  AS_IF([test -n "$enable_release" -a "x$enable_release" != xyes -a "x$enable_release" != xno],
+  [dnl
+    AC_MSG_NOTICE([warning: ensure that make target $enable_release does not depend on the unavailable ocamlopt])
+  ], [test "x$enable_opt" = xyes],
+  [dnl
+    AC_MSG_ERROR([the optimized version of coccinelle is requested explicitly, but ocamlopt is absent])
+  ],
+  [dnl
+    AC_MSG_NOTICE([the optimized version of coccinelle will not be build because ocamlopt is not present])
+    AC_SUBST([enable_opt], [no])
+  ])
+])
+
+AS_IF([test "x$OCAMLVERSION" = x3.11.2 -a -z "$enable_opt"],
+[dnl  the optimized version may not be buildable with ocaml 3.11.2 (know bug), hence disable it by default
+  AC_MSG_NOTICE([the optimized version of coccinelle will not be build by default due to OCaml version $OCAMLVERSION])
+  AC_SUBST([enable_opt], [no])
+])
+
+dnl  disable the optimized target when dynlinking is enabled but the optimized version of dynlink is not available
+AS_IF([test "x$OPTIMIZED_dynlink" = xno -a "x$enable_ocaml" = xyes],
+[dnl
+  AS_IF([test -z "$enable_opt"],
+  [dnl
+    AC_MSG_NOTICE([the optimized version of coccinelle will not be build by default because ocaml scripting is enabled but the required optimized dynlink package is not present])
+    AC_SUBST([enable_opt], [no])
+  ], [test "x$enable_opt" = xyes],
+  [dnl
+    AC_MSG_ERROR([the optimized version of coccinelle in combination with ocaml scripting requires the optimized version of the dynlik package, which is not present])
+  ])
+])
+
+# set the default enable-opt setting
+AS_IF([test -z "$enable_opt"],
+[dnl
+  AS_IF([test "x$enable_release" = xyes -o "x$enable_release" = xno],
+  [dnl
+    AC_SUBST([enable_opt], ["$enable_release"])
+  ])
+])
+
+dnl  variables depending on whether we build the optimized spatch
+AS_IF([test "x$enable_opt" = xyes],
+[dnl  default target for the optimized version
+  AC_SUBST([SPATCHNAME], [spatch.opt])
+  AC_SUBST([MAKETARGET_SPATCH], [opt-only])
+],
+[dnl  default target for the bytecode version
+  AC_SUBST([SPATCHNAME], [spatch])
+  AC_SUBST([MAKETARGET_SPATCH], [byte-only])
+])
 
 
 dnl
 dnl  generating configuration
 dnl
 
-AC_CONFIG_FILES([Makefile.config])
-AC_CONFIG_FILES([version.ml])
-AC_CONFIG_FILES([commons/commands.ml])
-AC_CONFIG_FILES([globals/config.ml])
-AC_CONFIG_FILES([globals/regexp.ml])
-AC_CONFIG_FILES([python/pycocci.ml])
-AC_CONFIG_FILES([ocaml/prepare_ocamlcocci.ml])
-AC_CONFIG_FILES([scripts/spatch.sh])
-AC_CONFIG_FILES([docs/spatch.1])
+AC_CONFIG_FILES([
+  Makefile.config
+  version.ml
+  commons/commands.ml
+  globals/config.ml globals/regexp.ml python/pycocci.ml
+  ocaml/prepare_ocamlcocci.ml
+  scripts/spatch.sh
+  docs/spatch.1
+])
 
 AC_OUTPUT
 
@@ -421,23 +488,22 @@ cat << EOF
 ------------------------------------------------------------------------------
 Summary
 
-findlib:          $OCAMLFIND
-menhir:           $MENHIR
-menhirLib module: $OCAML_PKG_menhirLib
+configure flags:  $CONFIGURE_FLAGS
+findlib:          $OCAMLFIND   (an actual version is strongly recommended)
+menhir:           $MENHIR      (should be an optional tool)
+menhirLib module: $enable_mehir        (for local package use --disable-menhirLib)
 
-ocaml scripting:  $enable_ocaml
-python scripting: $enable_python
-pycaml module:    $enable_pycaml
+ocaml scripting:  $enable_ocaml        (overridable with --enable-ocaml)
+python scripting: $enable_python       (overridable with --enable-python)
+pycaml module:    $enable_pycaml       (for local package use --disable-pycaml)
 
-pcre regexes:     $enable_pcre_syntax
-pcre module:      $enable_pcre
-pcre library:     $HAVE_PCRE
+pcre regexes:     $enable_pcre_syntax  (overridable with --enable-pcre-syntax)
+pcre module:      $enable_pcre (for local package use --disable-pcre)
+pcre library:     $HAVE_PCRE   (requires the dev version of libpcre)
 
-release config:   $enable_release
+release config:   $enable_release      (strongly recommended to be 'yes', overridable with --enable-release)
+optimized spatch: $enable_opt  (overridable with --disable-opt)
 
-EOF
-
-cat << EOF
 ------------------------------------------------------------------------------
 Coccinelle can now be compiled and installed.
 
@@ -452,8 +518,11 @@ To compile coccinelle, run:
 To install coccinelle, run:
   \$ make install
 
-Then, to test coccinelle run for example:
-  \$ $SPATCHNAME -sp_file demos/simple.cocci demos/simple.c -o /tmp/new_simple.c
+Then, to test coccinelle, run for example:
+  \$ spatch -sp_file demos/simple.cocci demos/simple.c -o /tmp/new_simple.c
+
+Or when coccinelle is not installed yet:
+  \$ COCCINELLE_HOME=$(pwd) ./scripts/spatch -sp_file demos/simple.cocci demos/simple.c -o /tmp/new_simple.c
 EOF
 
 if test "x$enable_python" != "xno"; then
index 9f99a5a..6120e3c 100644 (file)
@@ -40,8 +40,9 @@ INCLUDES=-I ../commons -I ../commons/ocamlextra -I ../globals
 #for warning:  -w A
 #for profiling:  -p -inline 0   with OCAMLOPT
 OCAMLCFLAGS ?= -g -dtypes
-OCAMLC_CMD=$(OCAMLC) $(OCAMLCFLAGS) $(INCLUDES)
-OCAMLOPT_CMD=$(OCAMLOPT) $(OPTFLAGS) $(INCLUDES)
+OPTFLAGS ?= -g -dtypes
+OCAMLC_CMD=$(OCAMLC) -thread $(OCAMLCFLAGS) $(INCLUDES)
+OCAMLOPT_CMD=$(OCAMLOPT) -thread $(OPTFLAGS) $(INCLUDES)
 OCAMLDEP_CMD=$(OCAMLDEP) $(INCLUDES)
 OCAMLMKTOP_CMD=$(OCAMLMKTOP) -g -custom $(INCLUDES)
 
@@ -52,7 +53,8 @@ OBJS = $(SRC:.ml=.cmo)
 OPTOBJS = $(SRC:.ml=.cmx)
 
 all: $(LIB)
-all.opt: $(OPTLIB)
+all.opt:
+       @$(MAKE) $(OPTLIB) BUILD_OPT=yes
 
 $(TARGET).top: $(LIB) test_ctl.cmo
        $(OCAMLMKTOP_CMD) -o $(TARGET).top $(SYSLIBS) $(LIBS) $(OBJS) test_ctl.cmo
@@ -97,3 +99,5 @@ ifneq ($(MAKECMDGOALS),distclean)
 -include .depend
 endif
 endif
+
+include ../Makefile.common
index 80dc4c8..8aafb52 100644 (file)
  *)
 
 
+# 0 "./ast_ctl.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./ast_ctl.ml"
 
 (* ---------------------------------------------------------------------- *)
index 6f329b5..319462d 100644 (file)
  *)
 
 
+# 0 "./ctl_engine.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./ctl_engine.ml"
 (*external c_counter : unit -> int = "c_counter"*)
 let timeout = 800
index 797223d..517557f 100644 (file)
  *)
 
 
+# 0 "./ctl_engine.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./ctl_engine.mli"
 open Ast_ctl
 
index 62a0144..2e9f8bc 100644 (file)
  *)
 
 
+# 0 "./flag_ctl.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./flag_ctl.ml"
 (* option -verbose_ctl_engine *)
 let verbose_ctl_engine = ref false
index 1a394ee..d2b4fc5 100644 (file)
  *)
 
 
+# 0 "./pretty_print_ctl.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./pretty_print_ctl.ml"
 open Common
 open Format
index d2cea7a..39a9a44 100644 (file)
  *)
 
 
+# 0 "./pretty_print_ctl.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./pretty_print_ctl.mli"
 
 val pp_ctl:
index d57f4e8..e559070 100644 (file)
  *)
 
 
+# 0 "./test_ctl.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./test_ctl.ml"
 
 (* ********************************************************************** *)
index b85115a..3482faf 100644 (file)
  *)
 
 
+# 0 "./wrapper_ctl.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./wrapper_ctl.ml"
 (* **********************************************************************
  *
index b6ad3ab..ca52dc6 100644 (file)
  *)
 
 
+# 0 "./wrapper_ctl.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./wrapper_ctl.mli"
 type info = int
 
diff --git a/demos/hello/hello-ocaml.cocci b/demos/hello/hello-ocaml.cocci
new file mode 100644 (file)
index 0000000..81d1a8a
--- /dev/null
@@ -0,0 +1,18 @@
+@main@
+type T;
+parameter list P;
+symbol printf;
+expression E;
+position p;
+@@
+
+T main(P) {
+  printf@p(E);
+  ...
+}
+
+@script:ocaml@
+p << main.p;
+@@
+
+Printf.printf "Hello at: %d" (List.hd p).Coccilib.line
diff --git a/demos/hello/hello-python.cocci b/demos/hello/hello-python.cocci
new file mode 100644 (file)
index 0000000..97a6401
--- /dev/null
@@ -0,0 +1,18 @@
+@main@
+type T;
+parameter list P;
+symbol printf;
+expression E;
+position p;
+@@
+
+T main(P) {
+  printf@p(E);
+  ...
+}
+
+@script:python@
+p << main.p;
+@@
+
+print("Hello at: %s" % p[0].line);
diff --git a/demos/hello/hello-regexp.cocci b/demos/hello/hello-regexp.cocci
new file mode 100644 (file)
index 0000000..be2324d
--- /dev/null
@@ -0,0 +1,19 @@
+@main@
+type T;
+parameter list P;
+symbol printf;
+expression E;
+identifier M;
+@@
+
+T M(P) {
+  printf(E);
+  ...
+}
+
+@@
+expression main.E;
+@@
+
+-  E
++  "world, hello!"
\ No newline at end of file
diff --git a/demos/hello/hello-smpl.cocci b/demos/hello/hello-smpl.cocci
new file mode 100644 (file)
index 0000000..ec00e61
--- /dev/null
@@ -0,0 +1,18 @@
+@main@
+type T;
+parameter list P;
+symbol printf;
+expression E;
+@@
+
+T main(P) {
+  printf(E);
+  ...
+}
+
+@@
+expression main.E;
+@@
+
+-  E
++  "world, hello!"
\ No newline at end of file
diff --git a/demos/hello/helloworld.c b/demos/hello/helloworld.c
new file mode 100644 (file)
index 0000000..8c8709b
--- /dev/null
@@ -0,0 +1,4 @@
+int main() {
+  printf("Hello world!");
+  return 0;
+}
index 6c224a8..26caa04 100644 (file)
@@ -6,7 +6,7 @@
 // 
 //     Run this:
 // 
-//         #!/bin/sh
+//         #! /bin/sh
 //         for f in $(grep -Erl "\([^\)]*\) *k[cmz]alloc" *) ; do
 //           echo "De-casting $f..."
 //           perl -pi -e "s/ ?= ?\([^\)]*\) *(k[cmz]alloc) *\(/ = \1\(/" $f
index 3073382..36ebbf0 100755 (executable)
@@ -1,4 +1,4 @@
-#!/bin/sh
+#! /bin/sh
 
 ARGS="-no_show_ctl_text -no_show_transinfo -no_parse_error_msg -no_show_misc -no_type_error_msg";
 
index 3a3239d..ee33154 100644 (file)
@@ -1,4 +1,4 @@
-#!/bin/sh
+#! /bin/sh
 
 find linux -name "*\.c" -exec ../../spatch.opt -cocci_file intr4.cocci {} \
 -no_show_ctl_text -no_show_transinfo -no_parse_error_msg -no_show_misc \
index 233871f..13888a0 100644 (file)
@@ -17,3 +17,5 @@ distclean:
 
 clean:
        $(MAKE) -C $(SUBDIR) $@
+
+include ../Makefile.common
index 189ecef..753e55e 100644 (file)
@@ -157,3 +157,4 @@ clean::
                 *.out \
                 *.toc
 
+include ../../Makefile.common
index 657fd00..4e360c5 100644 (file)
Binary files a/docs/manual/main_grammar.pdf and b/docs/manual/main_grammar.pdf differ
index 109adb0..7f7eb84 100644 (file)
Binary files a/docs/manual/manual.pdf and b/docs/manual/manual.pdf differ
index a362825..0ced07d 100644 (file)
Binary files a/docs/manual/options.pdf and b/docs/manual/options.pdf differ
index bccafb1..6dc2892 100644 (file)
@@ -30,8 +30,9 @@ directory {\tt foodir}:
   cause for concern, unless it occurs in a function that is relevant to the
   semantic patch.
 \item {\tt spatch --sp-file foo.cocci foo.c}: Apply the semantic patch {\tt
-    foo.cocci} to the file {\tt foo.c} and print out any transformations as a
-  diff.  {\tt --sp-file} is optional in this and the following cases.
+    foo.cocci} to the file {\tt foo.c} and print out any transformations as
+  the changes between the original and transformed code, using the program
+  {\tt diff}.  {\tt --sp-file} is optional in this and the following cases.
 \item {\tt spatch --sp-file foo.cocci foo.c --debug}:  The same as the
   previous case, but print out some information about the matching process.
 \item {\tt spatch --sp-file foo.cocci --dir foodir}:  Apply the semantic
@@ -215,7 +216,11 @@ this option prints the regular expression that will be passed to glimpse.}
   option disables this optimization and tries the semantic patch on all files.}
 
 \developer{--test $\langle$file$\rangle$}{ A shortcut for running Coccinelle
-on the semantic patch ``file{\tt{.cocci}}'' and the C file ``file{\tt{.c}}''.}
+on the semantic patch ``file{\tt{.cocci}}'' and the C file
+``file{\tt{.c}}''.  The result is put in the file {\tt
+  /tmp/file{\tt{.res}}}.  If writing a file in /tmp with a non-fresh name
+is a concern, then do not use this option.
+}
 
 \developer{--testall}{A shortcut for running Coccinelle on all files in a
   subdirectory {\tt tests} such that there are all of a {\tt .cocci} file, a {\tt
@@ -476,12 +481,20 @@ due to running out of steps rather than due to not matching.}
 %   --popl-mark-all} and {\bf --popl-keep-all-wits} implicitly set {\bf
 %   --popl}.}
 
+\rare{--reverse}{Inverts the semantic patch before applying it.
+A potential use case is backporting changes to previous versions. If a
+semantic patch represents an API change, then the reverse undoes the
+API change. Note that inverting a semantic patch is not always possible.
+In particular, the composition of a
+semantic patch with its inverse is not guaranteed to be an empty patch.}
+
 \section{Generation of the result}
 
-Normally, the only output is a diff printed to standard output, containing
-the differences between the original code and the transformed code.  If
+Normally, the only output is the differences between the original code and
+the transformed code obtained using the program {\tt diff} with the unified
+format option.  If
 stars are used in column 0 rather than {\tt -} and {\tt +}, then the {\tt
-  -} lines in the diff are the lines that matched the stars.
+  -} lines in the output are the lines that matched the stars.
 
 \normal{--keep-comments}{Don't remove comments adjacent to removed code.}
 
@@ -493,13 +506,17 @@ stars are used in column 0 rather than {\tt -} and {\tt +}, then the {\tt
   patch, within individual lines.}
 
 \rare{-o $\langle$file$\rangle$}{ This causes the transformed code to be
-  placed in the file {\tt file}.  A diff is still printed to the standard
-  output.  This option only makes sense when {\tt -} and {\tt +} are used.}
+  placed in the file {\tt file}.  The difference between the original code
+  and the transformed code is still printed to the standard output using
+  {\tt diff} with the unified format option.  This option only makes sense
+  when {\tt -} and {\tt +} are used.}
 
 \rare{--in-place}{ Modify the input file to contain the transformed code.
-  A diff is still printed to the standard output.  By default, the input
-  file is overwritten when using this option, with no backup.  This option
-  only makes sense when {\tt -} and {\tt +} are used.}
+  The difference between the original code and the transformed code is
+  still printed to the standard output using {\tt diff} with the unified
+  format option.  By default, the input file is overwritten when using this
+  option, with no backup.  This option only makes sense when {\tt -} and
+  {\tt +} are used.}
 
 \rare{--backup-suffix}{The suffix of the file to use in making a backup of
   the original file(s).  This suffix should include the leading ``.'', if
@@ -507,17 +524,19 @@ stars are used in column 0 rather than {\tt -} and {\tt +}, then the {\tt
   {\tt --in-place} is also used.}
 
 \rare{--out-place}{ Store the result of modifying the code in a .cocci-res
-  file.  A diff is still printed to the standard output.  This option only
+  file.  The difference between the original code
+  and the transformed code is still printed to the standard output using
+  {\tt diff} with the unified format option.  This option only
   makes sense when {\tt -} and {\tt +} are used.}
 
-\rare{--no-show-diff}{ Normally, a diff between the original and transformed
-code is printed on the standard output.  This option causes this not to be
-done.}
+\rare{--no-show-diff}{ Normally, the difference between the original and
+  transformed code is printed on the standard output.  This option causes
+  this not to be done.}
 
-\rare{-U}{ Set number of diff context lines.}
+\rare{-U}{ Set number of context lines to be provided by {\tt diff}.}
 
 \rare{--patch $\langle$path$\rangle$}{The prefix of the pathname of the
-  directory or file name that should dropped from the diff line in the
+  directory or file name that should dropped from the {\tt diff} line in the
   generated patch.  This is useful if you want to apply a patch only to a
   subdirectory of a source code tree but want to create a patch that can be
   applied at the root of the source code tree.  An example could be {\tt
index 9ff6b58..b30babf 100644 (file)
@@ -60,9 +60,10 @@ SYSLIBS= str.cma unix.cma
 #for warning:  -w A
 #for profiling:  -p -inline 0   with OCAMLOPT
 OCAMLCFLAGS ?= -g -dtypes
+OPTFLAGS ?= -g -dtypes
 
-OCAMLC_CMD=$(OCAMLC) $(OCAMLCFLAGS) $(INCLUDES)
-OCAMLOPT_CMD=$(OCAMLOPT) $(OPTFLAGS) $(INCLUDES)
+OCAMLC_CMD=$(OCAMLC) -thread $(OCAMLCFLAGS) $(INCLUDES)
+OCAMLOPT_CMD=$(OCAMLOPT) -thread $(OPTFLAGS) $(INCLUDES)
 OCAMLDEP_CMD=$(OCAMLDEP) $(INCLUDESDEP)
 OCAMLMKTOP_CMD=$(OCAMLMKTOP) -g -custom $(INCLUDES)
 
@@ -74,7 +75,8 @@ OPTOBJS = $(SRC:.ml=.cmx)
 # Top rules
 ##############################################################################
 all: $(TARGET).cma
-all.opt: $(TARGET).cmxa
+all.opt:
+       @$(MAKE) $(TARGET).cmxa BUILD_OPT=yes
 
 $(TARGET).cma: $(OBJS)
        $(OCAMLC_CMD) -a -o $(TARGET).cma $(OBJS)
@@ -126,3 +128,5 @@ ifneq ($(MAKECMDGOALS),distclean)
 -include .depend
 endif
 endif
+
+include ../Makefile.common
index d9431e3..ba42753 100644 (file)
  *)
 
 
+# 0 "./asttoctl.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./asttoctl.ml"
 (* true = don't see all matched nodes, only modified ones *)
 let onlyModif = ref true(*false*)
index 00859ab..c6b0fbe 100644 (file)
  *)
 
 
+# 0 "./asttoctl.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./asttoctl.mli"
 type cocci_predicate = Lib_engine.predicate * string Ast_ctl.modif
 type formula =
index e4fe229..b7e51bd 100644 (file)
  *)
 
 
+# 0 "./asttoctl2.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./asttoctl2.ml"
 (* for MINUS and CONTEXT, pos is always None in this file *)
 (*search for require*)
index f869d67..34a10db 100644 (file)
  *)
 
 
+# 0 "./asttoctl2.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./asttoctl2.mli"
 type cocci_predicate = Lib_engine.predicate * Ast_cocci.meta_name Ast_ctl.modif
 type top_formula = NONDECL of Lib_engine.ctlcocci | CODE of Lib_engine.ctlcocci
index 0de4df3..01caf6f 100644 (file)
  *)
 
 
+# 0 "./asttomember.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./asttomember.ml"
 (* on the first pass, onlyModif is true, so we don't see all matched nodes,
 only modified ones *)
index 0e66eaa..8f3fcba 100644 (file)
  *)
 
 
+# 0 "./asttomember.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./asttomember.mli"
 val asttomember : Ast_cocci.rule -> Ast_cocci.meta_name list list ->
   (Lib_engine.predicate * Ast_cocci.meta_name Ast_ctl.modif) list list list
index e4d6581..c212a9e 100644 (file)
  *)
 
 
+# 0 "./c_vs_c.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./c_vs_c.ml"
 open Common
 
index 8712216..b378576 100644 (file)
  *)
 
 
+# 0 "./c_vs_c.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./c_vs_c.mli"
 val eq_type : Ast_c.fullType -> Ast_c.fullType -> bool
 val merge_type : Ast_c.fullType -> Ast_c.fullType -> Ast_c.fullType
index 3a209d6..508d582 100644 (file)
  *)
 
 
+# 0 "./check_exhaustive_pattern.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./check_exhaustive_pattern.ml"
 
 (* Just to warn me when there is some news in the types in
index 20ee731..94f4eb6 100644 (file)
  *)
 
 
+# 0 "./check_reachability.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./check_reachability.ml"
 (* ---------------------------------------------------------------- *)
 (* code to check for ambiguities *)
index d5aa86c..6c18eec 100644 (file)
  *)
 
 
+# 0 "./check_reachability.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./check_reachability.mli"
 type witness =
     (Ograph_extended.nodei, unit,
index e8786c0..0ba4c50 100644 (file)
  *)
 
 
+# 0 "./cocci_vs_c.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./cocci_vs_c.ml"
 open Common
 
@@ -1544,6 +1571,13 @@ and (ident: info_ident -> (A.ident, string * Ast_c.info) matcher) =
       | DontKnow -> failwith "MetaLocalFunc, need more semantic info about id"
       )
 
+  | A.AsIdent(id,asid) ->
+      ident infoidb id ib >>= (fun id ib ->
+      ident infoidb asid ib >>= (fun asid ib ->
+       return(
+         ((A.AsIdent(id,asid)) +> A.rewrap ida,
+          ib))))
+
   (* not clear why disj things are needed, after disjdistr? *)
   | A.DisjId ias ->
       ias +> List.fold_left (fun acc ia -> acc >|+|> (ident infoidb ia ib)) fail
@@ -1904,7 +1938,6 @@ and (declaration: (A.mcodekind * bool * A.declaration,B.declaration) matcher) =
         ident DontKnow sa (sb, iisb) >>= (fun sa (sb, iisb) ->
         tokenf lpa lpb >>= (fun lpa lpb ->
         tokenf rpa rpb >>= (fun rpa rpb ->
-        tokenf rpa rpb >>= (fun rpa rpb ->
         tokenf weqa weqb >>= (fun weqa weqb ->
         tokenf enda iiendb >>= (fun enda iiendb ->
         arguments (seqstyle eas) (A.undots eas) ebs >>= (fun easundots ebs ->
@@ -1913,11 +1946,15 @@ and (declaration: (A.mcodekind * bool * A.declaration,B.declaration) matcher) =
 
           return (
             (mckstart, allminus,
-            (A.MacroDecl (sa,lpa,eas,rpa,enda)) +> A.rewrap decla),
-            (B.MacroDecl ((sb,ebs,true),
+            (A.MacroDeclInit(sa,lpa,eas,rpa,weqa,inia,enda)) +> A.rewrap decla),
+            (B.MacroDeclInit ((sb,ebs,inib),
                          [iisb;lpb;rpb;iiendb;iifakestart] ++ iistob))
-          )))))))))))
-  | _, (B.MacroDecl _ |B.MacroDeclInit _ |B.DeclList _) ->      fail
+          ))))))))))
+
+
+  | A.MacroDeclInit (sa,lpa,eas,rpa,weqa,inia,enda), _ -> fail
+
+  | _, (B.MacroDecl _ |B.MacroDeclInit _ |B.DeclList _) -> fail
 
 
 and onedecl = fun allminus decla (declb, iiptvirgb, iistob) ->
@@ -2212,7 +2249,7 @@ and onedecl = fun allminus decla (declb, iiptvirgb, iistob) ->
 
    | _, ({B.v_namei = None;}, _) ->
        (* old:   failwith "no variable in this declaration, weird" *)
-       fail
+      fail
 
 
 
@@ -2658,6 +2695,7 @@ and enum_field ida idb =
            A.rewrap ida,
            (nameidb,Some(opbi,eb2))))))
       |        _ -> failwith "not possible")
+  | A.Assignment(ea1,opa,ea2,init),(nameidb,None) -> fail
   | _ -> failwith "not possible"
 
 (* ------------------------------------------------------------------------- *)
index c63c50c..d1617ec 100644 (file)
  *)
 
 
+# 0 "./cocci_vs_c.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./cocci_vs_c.mli"
 (*****************************************************************************)
 (* Cocci vs C *)
index e363c86..a8ef595 100644 (file)
  *)
 
 
+# 0 "./ctlcocci_integration.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./ctlcocci_integration.ml"
 open Common
 
@@ -484,6 +511,55 @@ let strip env =
       (v,vl))
     env
 
+    (* these remove constraints, at least those that contain pcre regexps,
+       which cannot be compared (problem in the unparser) *)
+let strip_predicate re =
+  let donothing r k e = k e in
+  let mcode mc = mc in
+  let ident r k e =
+    let e = k e in
+    match Ast_cocci.unwrap e with
+      Ast_cocci.MetaId(name,constraints,u,i) ->
+        Ast_cocci.rewrap e
+         (Ast_cocci.MetaId(name,Ast_cocci.IdNoConstraint,u,i))
+    |  Ast_cocci.MetaFunc(name,constraints,u,i) ->
+        Ast_cocci.rewrap e
+         (Ast_cocci.MetaFunc(name,Ast_cocci.IdNoConstraint,u,i))
+    |  Ast_cocci.MetaLocalFunc(name,constraints,u,i) ->
+        Ast_cocci.rewrap e
+         (Ast_cocci.MetaLocalFunc(name,Ast_cocci.IdNoConstraint,u,i))
+    |  _ -> e in
+  let expression r k e =
+    let e = k e in
+    match Ast_cocci.unwrap e with
+      Ast_cocci.MetaErr(name,constraints,u,i) ->
+       Ast_cocci.rewrap e
+         (Ast_cocci.MetaErr(name,Ast_cocci.NoConstraint,u,i))
+    | Ast_cocci.MetaExpr(name,constraints,u,ty,form,i) ->
+        Ast_cocci.rewrap e
+         (Ast_cocci.MetaExpr(name,Ast_cocci.NoConstraint,u,ty,form,i))
+    | _ -> e in
+  let fn = Visitor_ast.rebuilder
+      mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode
+      donothing donothing donothing donothing donothing
+      ident expression donothing donothing donothing donothing
+      donothing donothing donothing donothing donothing donothing in
+
+  fn.Visitor_ast.rebuilder_rule_elem re
+
+let clean_trans_info2 trans_info2 =
+  List.map
+    (function a ->
+      (List.map
+        (function (node,env,pred) ->
+          let pred =
+            match pred with
+              Lib_engine.Match re -> Lib_engine.Match (strip_predicate re)
+            | _ -> pred in
+          (node,env,pred))
+        a))
+    trans_info2
+
 let rec nub ls =
   match ls with
     [] -> []
@@ -492,7 +568,7 @@ let rec nub ls =
 
 (*****************************************************************************)
 (* Call ctl engine *)
-(*****************************************************************************)
+(***************************************************** ************************)
 let (mysat2:
   Lib_engine.model ->
   (Lib_engine.ctlcocci * (pred list list)) ->
@@ -505,6 +581,10 @@ let (mysat2:
       WRAPPED_ENGINE.satbis (flow, label, states) ctl
        (used_after, binding2)
     in
+    (* drop constraints in the predicate at the end of each match.
+       constraints aren't needed for transformation, and they can contain
+       regular expressions, which are incomparable. *)
+    let trans_info2 = clean_trans_info2 trans_info2 in
     if not (!Flag_parsing_cocci.sgrep_mode || !Flag.sgrep_mode2 ||
             !Flag_matcher.allow_inconsistent_paths)
     then Check_reachability.check_reachability rulename triples flow;
index 9c75cf3..dc0e8bc 100644 (file)
  *)
 
 
+# 0 "./ctlcocci_integration.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./ctlcocci_integration.mli"
 open Ograph_extended
 
index 4e6410b..82597af 100644 (file)
  *)
 
 
+# 0 "./ctltotex.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./ctltotex.ml"
 module CTL = Ast_ctl
 
index 3150fd4..61bbb16 100644 (file)
  *)
 
 
+# 0 "./ctltotex.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./ctltotex.mli"
 val totex :
   string ->
index 6053bd9..95917ba 100644 (file)
  *)
 
 
+# 0 "./flag_engine.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./flag_engine.ml"
 let debug_engine = ref false
 
index b622d92..a59eb40 100644 (file)
  *)
 
 
+# 0 "./flag_matcher.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./flag_matcher.ml"
 let debug_engine = ref false
 let verbose_matcher = ref true
index e154c82..ea5478a 100644 (file)
  *)
 
 
+# 0 "./isomorphisms_c_c.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./isomorphisms_c_c.ml"
 open Common
 
index 42473b1..c54f9a5 100644 (file)
  *)
 
 
+# 0 "./lib_engine.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./lib_engine.ml"
 open Ograph_extended
 
index 609dbef..ab47f45 100644 (file)
  *)
 
 
+# 0 "./lib_matcher_c.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./lib_matcher_c.ml"
index c0c34ea..2273e20 100644 (file)
  *)
 
 
+# 0 "./lib_matcher_c.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./lib_matcher_c.mli"
index bfb3eed..ed7a7da 100644 (file)
  *)
 
 
+# 0 "./main.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./main.ml"
 (* ----------------------------------------------------------------------- *)
 (* Entry point *)
index 1bd8773..e54043d 100644 (file)
  *)
 
 
+# 0 "./pattern_c.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./pattern_c.ml"
 open Common
 
index 22c67de..b8aa8f2 100644 (file)
  *)
 
 
+# 0 "./pattern_c.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./pattern_c.mli"
 
 val match_re_node :
index 85cfd97..2be472e 100644 (file)
  *)
 
 
+# 0 "./postprocess_transinfo.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./postprocess_transinfo.ml"
 (* two goals: first drop from the environments things that are not used,
    and second prompt for the names of fresh variables that are used *)
index e5ea495..d25d1a1 100644 (file)
  *)
 
 
+# 0 "./postprocess_transinfo.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./postprocess_transinfo.mli"
 val process :
     Ast_cocci.meta_name list (* used after *) ->
index 93ce733..d8daf9d 100644 (file)
  *)
 
 
+# 0 "./pretty_print_engine.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./pretty_print_engine.ml"
 open Common.Infix
 
index b5a0183..70e2f05 100644 (file)
  *)
 
 
+# 0 "./pretty_print_engine.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./pretty_print_engine.mli"
 (* could be in pretty_print_c because dependent of ast_c but metavars
  * are in ast_c for "bad" reason, so better put the pretty_print
index 0b6d50c..3069ed7 100644 (file)
  *)
 
 
+# 0 "./sgrep.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./sgrep.ml"
 (* no longer used *)
 
index bdce849..71af452 100644 (file)
  *)
 
 
+# 0 "./transformation_c.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./transformation_c.ml"
 open Common
 
index 71d0d38..629cd5e 100644 (file)
  *)
 
 
+# 0 "./transformation_c.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./transformation_c.mli"
 (* note that now we do the transformation via side effect on ast *)
 val transform :
index 8e0338f..e646075 100644 (file)
@@ -14,8 +14,10 @@ INCLUDES= -I ../commons -I ../globals -I  ../parsing_cocci -I  ../parsing_c
 #for warning:  -w A
 #for profiling:  -p -inline 0   with OCAMLOPT
 OCAMLCFLAGS ?= -g -dtypes
-OCAMLC_CMD=$(OCAMLC) $(OCAMLCFLAGS) $(INCLUDES)
-OCAMLOPT_CMD=$(OCAMLOPT) $(OPTFLAGS) $(INCLUDES)
+OPTFLAGS ?= -g -dtypes
+
+OCAMLC_CMD=$(OCAMLC) -thread $(OCAMLCFLAGS) $(INCLUDES)
+OCAMLOPT_CMD=$(OCAMLOPT) -thread $(OPTFLAGS) $(INCLUDES)
 OCAMLDEP_CMD=$(OCAMLDEP) $(INCLUDESDEP)
 OCAMLMKTOP_CMD=$(OCAMLMKTOP) -g -custom $(INCLUDES)
 
@@ -24,7 +26,8 @@ OPTOBJS = $(SOURCES:.ml=.cmx)
 
 all: $(TARGET).cma
 
-all.opt: $(TARGET).cmxa
+all.opt:
+       @$(MAKE) $(TARGET).cmxa BUILD_OPT=yes
 
 $(TARGET).byte: $(OBJS) $(LIBS)
        $(OCAMLC_CMD) -o $(TARGET).byte $(SYSLIBS) $(LIBS) $(OBJS)
@@ -72,3 +75,5 @@ ifneq ($(MAKECMDGOALS),distclean)
 -include .depend
 endif
 endif
+
+include ../Makefile.common
index bc70d53..6daa82f 100644 (file)
  *)
 
 
+# 0 "./flag_cocci.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./flag_cocci.ml"
 (* the inputs *)
 let show_c = ref false
index fb74f36..af2432f 100644 (file)
@@ -31,6 +31,9 @@ endif
 ##############################################################################
 TARGET=globals
 
+OCAMLCFLAGS ?= -g -dtypes
+OPTFLAGS ?= -g
+
 SRC=config.ml flag.ml iteration.ml $(REGEXP_FILE) regexp.ml
 
 LIBS=
@@ -41,8 +44,8 @@ INCLUDEDIRS= ../commons $(PCREDIR)
 ##############################################################################
 
 INCLUDES=$(INCLUDEDIRS:%=-I %)
-OCAMLC_CMD=$(OCAMLC) $(OCAMLCFLAGS) $(INCLUDES)
-OCAMLOPT_CMD=$(OCAMLOPT) $(OPTFLAGS) $(INCLUDES)
+OCAMLC_CMD=$(OCAMLC) -thread $(OCAMLCFLAGS) $(INCLUDES)
+OCAMLOPT_CMD=$(OCAMLOPT) -thread $(OPTFLAGS) $(INCLUDES)
 OCAMLDEP_CMD=$(OCAMLDEP) $(INCLUDES)
 OCAMLMKTOP_CMD=$(OCAMLMKTOP) -g -custom $(INCLUDES)
 
@@ -54,7 +57,8 @@ OPTOBJS= $(SRC:.ml=.cmx)
 ##############################################################################
 all: $(TARGET).cma
 
-all.opt: $(TARGET).cmxa
+all.opt:
+       @$(MAKE) $(TARGET).cmxa BUILD_OPT=yes
 
 $(TARGET).cma: $(LIBS) $(OBJS)
        $(OCAMLC_CMD) -a -o $(TARGET).cma $(OBJS)
@@ -93,3 +97,5 @@ ifneq ($(MAKECMDGOALS),distclean)
 -include .depend
 endif
 endif
+
+include ../Makefile.common
index 9f96058..d142386 100644 (file)
  *)
 
 
+# 0 "./flag.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./flag.ml"
 let sgrep_mode2 = ref false
 
index dcc2f43..81a9a4f 100644 (file)
  *)
 
 
+# 0 "./iteration.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./iteration.ml"
 type init_info = (string (* language *) * string (* rule name *)) *
       string list (* defined virtual rules *)
index 933960c..0958935 100644 (file)
  *)
 
 
+# 0 "./iteration.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./iteration.mli"
 type init_info = (string (* language *) * string (* rule name *)) *
       string list (* defined virtual rules *)
index ef75085..bcf366e 100644 (file)
  *)
 
 
+# 0 "./regexp_pcre.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./regexp_pcre.ml"
 
 type regexp =
index cda4755..d69403f 100644 (file)
  *)
 
 
+# 0 "./regexp_str.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./regexp_str.ml"
 
 type regexp = Str.regexp
diff --git a/install-sh b/install-sh
deleted file mode 100755 (executable)
index a9244eb..0000000
+++ /dev/null
@@ -1,527 +0,0 @@
-#!/bin/sh
-# install - install a program, script, or datafile
-
-scriptversion=2011-01-19.21; # UTC
-
-# This originates from X11R5 (mit/util/scripts/install.sh), which was
-# later released in X11R6 (xc/config/util/install.sh) with the
-# following copyright and license.
-#
-# Copyright (C) 1994 X Consortium
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to
-# deal in the Software without restriction, including without limitation the
-# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-# sell copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in
-# all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
-# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-# Except as contained in this notice, the name of the X Consortium shall not
-# be used in advertising or otherwise to promote the sale, use or other deal-
-# ings in this Software without prior written authorization from the X Consor-
-# tium.
-#
-#
-# FSF changes to this file are in the public domain.
-#
-# Calling this script install-sh is preferred over install.sh, to prevent
-# `make' implicit rules from creating a file called install from it
-# when there is no Makefile.
-#
-# This script is compatible with the BSD install script, but was written
-# from scratch.
-
-nl='
-'
-IFS=" ""       $nl"
-
-# set DOITPROG to echo to test this script
-
-# Don't use :- since 4.3BSD and earlier shells don't like it.
-doit=${DOITPROG-}
-if test -z "$doit"; then
-  doit_exec=exec
-else
-  doit_exec=$doit
-fi
-
-# Put in absolute file names if you don't have them in your path;
-# or use environment vars.
-
-chgrpprog=${CHGRPPROG-chgrp}
-chmodprog=${CHMODPROG-chmod}
-chownprog=${CHOWNPROG-chown}
-cmpprog=${CMPPROG-cmp}
-cpprog=${CPPROG-cp}
-mkdirprog=${MKDIRPROG-mkdir}
-mvprog=${MVPROG-mv}
-rmprog=${RMPROG-rm}
-stripprog=${STRIPPROG-strip}
-
-posix_glob='?'
-initialize_posix_glob='
-  test "$posix_glob" != "?" || {
-    if (set -f) 2>/dev/null; then
-      posix_glob=
-    else
-      posix_glob=:
-    fi
-  }
-'
-
-posix_mkdir=
-
-# Desired mode of installed file.
-mode=0755
-
-chgrpcmd=
-chmodcmd=$chmodprog
-chowncmd=
-mvcmd=$mvprog
-rmcmd="$rmprog -f"
-stripcmd=
-
-src=
-dst=
-dir_arg=
-dst_arg=
-
-copy_on_change=false
-no_target_directory=
-
-usage="\
-Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
-   or: $0 [OPTION]... SRCFILES... DIRECTORY
-   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
-   or: $0 [OPTION]... -d DIRECTORIES...
-
-In the 1st form, copy SRCFILE to DSTFILE.
-In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
-In the 4th, create DIRECTORIES.
-
-Options:
-     --help     display this help and exit.
-     --version  display version info and exit.
-
-  -c            (ignored)
-  -C            install only if different (preserve the last data modification time)
-  -d            create directories instead of installing files.
-  -g GROUP      $chgrpprog installed files to GROUP.
-  -m MODE       $chmodprog installed files to MODE.
-  -o USER       $chownprog installed files to USER.
-  -s            $stripprog installed files.
-  -t DIRECTORY  install into DIRECTORY.
-  -T            report an error if DSTFILE is a directory.
-
-Environment variables override the default commands:
-  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
-  RMPROG STRIPPROG
-"
-
-while test $# -ne 0; do
-  case $1 in
-    -c) ;;
-
-    -C) copy_on_change=true;;
-
-    -d) dir_arg=true;;
-
-    -g) chgrpcmd="$chgrpprog $2"
-       shift;;
-
-    --help) echo "$usage"; exit $?;;
-
-    -m) mode=$2
-       case $mode in
-         *' '* | *'    '* | *'
-'*       | *'*'* | *'?'* | *'['*)
-           echo "$0: invalid mode: $mode" >&2
-           exit 1;;
-       esac
-       shift;;
-
-    -o) chowncmd="$chownprog $2"
-       shift;;
-
-    -s) stripcmd=$stripprog;;
-
-    -t) dst_arg=$2
-       # Protect names problematic for `test' and other utilities.
-       case $dst_arg in
-         -* | [=\(\)!]) dst_arg=./$dst_arg;;
-       esac
-       shift;;
-
-    -T) no_target_directory=true;;
-
-    --version) echo "$0 $scriptversion"; exit $?;;
-
-    --)        shift
-       break;;
-
-    -*)        echo "$0: invalid option: $1" >&2
-       exit 1;;
-
-    *)  break;;
-  esac
-  shift
-done
-
-if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
-  # When -d is used, all remaining arguments are directories to create.
-  # When -t is used, the destination is already specified.
-  # Otherwise, the last argument is the destination.  Remove it from $@.
-  for arg
-  do
-    if test -n "$dst_arg"; then
-      # $@ is not empty: it contains at least $arg.
-      set fnord "$@" "$dst_arg"
-      shift # fnord
-    fi
-    shift # arg
-    dst_arg=$arg
-    # Protect names problematic for `test' and other utilities.
-    case $dst_arg in
-      -* | [=\(\)!]) dst_arg=./$dst_arg;;
-    esac
-  done
-fi
-
-if test $# -eq 0; then
-  if test -z "$dir_arg"; then
-    echo "$0: no input file specified." >&2
-    exit 1
-  fi
-  # It's OK to call `install-sh -d' without argument.
-  # This can happen when creating conditional directories.
-  exit 0
-fi
-
-if test -z "$dir_arg"; then
-  do_exit='(exit $ret); exit $ret'
-  trap "ret=129; $do_exit" 1
-  trap "ret=130; $do_exit" 2
-  trap "ret=141; $do_exit" 13
-  trap "ret=143; $do_exit" 15
-
-  # Set umask so as not to create temps with too-generous modes.
-  # However, 'strip' requires both read and write access to temps.
-  case $mode in
-    # Optimize common cases.
-    *644) cp_umask=133;;
-    *755) cp_umask=22;;
-
-    *[0-7])
-      if test -z "$stripcmd"; then
-       u_plus_rw=
-      else
-       u_plus_rw='% 200'
-      fi
-      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
-    *)
-      if test -z "$stripcmd"; then
-       u_plus_rw=
-      else
-       u_plus_rw=,u+rw
-      fi
-      cp_umask=$mode$u_plus_rw;;
-  esac
-fi
-
-for src
-do
-  # Protect names problematic for `test' and other utilities.
-  case $src in
-    -* | [=\(\)!]) src=./$src;;
-  esac
-
-  if test -n "$dir_arg"; then
-    dst=$src
-    dstdir=$dst
-    test -d "$dstdir"
-    dstdir_status=$?
-  else
-
-    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
-    # might cause directories to be created, which would be especially bad
-    # if $src (and thus $dsttmp) contains '*'.
-    if test ! -f "$src" && test ! -d "$src"; then
-      echo "$0: $src does not exist." >&2
-      exit 1
-    fi
-
-    if test -z "$dst_arg"; then
-      echo "$0: no destination specified." >&2
-      exit 1
-    fi
-    dst=$dst_arg
-
-    # If destination is a directory, append the input filename; won't work
-    # if double slashes aren't ignored.
-    if test -d "$dst"; then
-      if test -n "$no_target_directory"; then
-       echo "$0: $dst_arg: Is a directory" >&2
-       exit 1
-      fi
-      dstdir=$dst
-      dst=$dstdir/`basename "$src"`
-      dstdir_status=0
-    else
-      # Prefer dirname, but fall back on a substitute if dirname fails.
-      dstdir=`
-       (dirname "$dst") 2>/dev/null ||
-       expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-            X"$dst" : 'X\(//\)[^/]' \| \
-            X"$dst" : 'X\(//\)$' \| \
-            X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
-       echo X"$dst" |
-           sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-                  s//\1/
-                  q
-                }
-                /^X\(\/\/\)[^/].*/{
-                  s//\1/
-                  q
-                }
-                /^X\(\/\/\)$/{
-                  s//\1/
-                  q
-                }
-                /^X\(\/\).*/{
-                  s//\1/
-                  q
-                }
-                s/.*/./; q'
-      `
-
-      test -d "$dstdir"
-      dstdir_status=$?
-    fi
-  fi
-
-  obsolete_mkdir_used=false
-
-  if test $dstdir_status != 0; then
-    case $posix_mkdir in
-      '')
-       # Create intermediate dirs using mode 755 as modified by the umask.
-       # This is like FreeBSD 'install' as of 1997-10-28.
-       umask=`umask`
-       case $stripcmd.$umask in
-         # Optimize common cases.
-         *[2367][2367]) mkdir_umask=$umask;;
-         .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
-
-         *[0-7])
-           mkdir_umask=`expr $umask + 22 \
-             - $umask % 100 % 40 + $umask % 20 \
-             - $umask % 10 % 4 + $umask % 2
-           `;;
-         *) mkdir_umask=$umask,go-w;;
-       esac
-
-       # With -d, create the new directory with the user-specified mode.
-       # Otherwise, rely on $mkdir_umask.
-       if test -n "$dir_arg"; then
-         mkdir_mode=-m$mode
-       else
-         mkdir_mode=
-       fi
-
-       posix_mkdir=false
-       case $umask in
-         *[123567][0-7][0-7])
-           # POSIX mkdir -p sets u+wx bits regardless of umask, which
-           # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
-           ;;
-         *)
-           tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
-           trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
-
-           if (umask $mkdir_umask &&
-               exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
-           then
-             if test -z "$dir_arg" || {
-                  # Check for POSIX incompatibilities with -m.
-                  # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
-                  # other-writeable bit of parent directory when it shouldn't.
-                  # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
-                  ls_ld_tmpdir=`ls -ld "$tmpdir"`
-                  case $ls_ld_tmpdir in
-                    d????-?r-*) different_mode=700;;
-                    d????-?--*) different_mode=755;;
-                    *) false;;
-                  esac &&
-                  $mkdirprog -m$different_mode -p -- "$tmpdir" && {
-                    ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
-                    test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
-                  }
-                }
-             then posix_mkdir=:
-             fi
-             rmdir "$tmpdir/d" "$tmpdir"
-           else
-             # Remove any dirs left behind by ancient mkdir implementations.
-             rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
-           fi
-           trap '' 0;;
-       esac;;
-    esac
-
-    if
-      $posix_mkdir && (
-       umask $mkdir_umask &&
-       $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
-      )
-    then :
-    else
-
-      # The umask is ridiculous, or mkdir does not conform to POSIX,
-      # or it failed possibly due to a race condition.  Create the
-      # directory the slow way, step by step, checking for races as we go.
-
-      case $dstdir in
-       /*) prefix='/';;
-       [-=\(\)!]*) prefix='./';;
-       *)  prefix='';;
-      esac
-
-      eval "$initialize_posix_glob"
-
-      oIFS=$IFS
-      IFS=/
-      $posix_glob set -f
-      set fnord $dstdir
-      shift
-      $posix_glob set +f
-      IFS=$oIFS
-
-      prefixes=
-
-      for d
-      do
-       test X"$d" = X && continue
-
-       prefix=$prefix$d
-       if test -d "$prefix"; then
-         prefixes=
-       else
-         if $posix_mkdir; then
-           (umask=$mkdir_umask &&
-            $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
-           # Don't fail if two instances are running concurrently.
-           test -d "$prefix" || exit 1
-         else
-           case $prefix in
-             *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
-             *) qprefix=$prefix;;
-           esac
-           prefixes="$prefixes '$qprefix'"
-         fi
-       fi
-       prefix=$prefix/
-      done
-
-      if test -n "$prefixes"; then
-       # Don't fail if two instances are running concurrently.
-       (umask $mkdir_umask &&
-        eval "\$doit_exec \$mkdirprog $prefixes") ||
-         test -d "$dstdir" || exit 1
-       obsolete_mkdir_used=true
-      fi
-    fi
-  fi
-
-  if test -n "$dir_arg"; then
-    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
-    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
-    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
-      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
-  else
-
-    # Make a couple of temp file names in the proper directory.
-    dsttmp=$dstdir/_inst.$$_
-    rmtmp=$dstdir/_rm.$$_
-
-    # Trap to clean up those temp files at exit.
-    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
-
-    # Copy the file name to the temp name.
-    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
-
-    # and set any options; do chmod last to preserve setuid bits.
-    #
-    # If any of these fail, we abort the whole thing.  If we want to
-    # ignore errors from any of these, just make sure not to ignore
-    # errors from the above "$doit $cpprog $src $dsttmp" command.
-    #
-    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
-    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
-    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
-    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
-
-    # If -C, don't bother to copy if it wouldn't change the file.
-    if $copy_on_change &&
-       old=`LC_ALL=C ls -dlL "$dst"    2>/dev/null` &&
-       new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
-
-       eval "$initialize_posix_glob" &&
-       $posix_glob set -f &&
-       set X $old && old=:$2:$4:$5:$6 &&
-       set X $new && new=:$2:$4:$5:$6 &&
-       $posix_glob set +f &&
-
-       test "$old" = "$new" &&
-       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
-    then
-      rm -f "$dsttmp"
-    else
-      # Rename the file to the real destination.
-      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
-
-      # The rename failed, perhaps because mv can't rename something else
-      # to itself, or perhaps because mv is so ancient that it does not
-      # support -f.
-      {
-       # Now remove or move aside any old file at destination location.
-       # We try this two ways since rm can't unlink itself on some
-       # systems and the destination file might be busy for other
-       # reasons.  In this case, the final cleanup might fail but the new
-       # file should still install successfully.
-       {
-         test ! -f "$dst" ||
-         $doit $rmcmd -f "$dst" 2>/dev/null ||
-         { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
-           { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
-         } ||
-         { echo "$0: cannot unlink or rename $dst" >&2
-           (exit 1); exit 1
-         }
-       } &&
-
-       # Now rename the file to the real destination.
-       $doit $mvcmd "$dsttmp" "$dst"
-      }
-    fi || exit 1
-
-    trap '' 0
-  fi
-done
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC"
-# time-stamp-end: "; # UTC"
-# End:
index d42adee..4dd6b4f 100644 (file)
@@ -2,9 +2,9 @@
  ** Compilation **
 
 You must first install a recent version of
- - OCaml (at least 3.09.2),
+ - OCaml (at least 3.10),
    see http://caml.inria.fr/download.en.html
-   At least, OCaml 3.11 is required to use the OCaml scripting
+   At least, OCaml 3.12 is required to use the OCaml scripting
    feature in the SmPL code.
  - The Menhir parser generator (at least 20080912),
    see http://cristal.inria.fr/~fpottier/menhir/
@@ -14,6 +14,7 @@ You must first install a recent version of
    (unless you run configure with the --without-python option)
 
 On Debian/Ubuntu, install the following packages
+ - pkg-config (optional, but strongly recommended)
  - ocaml-native-compilers (or alternatively ocaml) 
  - ocaml-findlib
  - libpycaml-ocaml-dev
@@ -21,31 +22,62 @@ On Debian/Ubuntu, install the following packages
  - menhir and libmenhir-ocaml-dev
 
 On Fedora, install the following packages
+ - pkgconfig (optional, but strongly recommended)
  - ocaml
  - ocaml-findlib
  - ocaml-sexplib-devel
 
-Note that on Fedora, there is currently not
-package for menhir and pycaml.
+Note that on Fedora, there is currently not a
+package for menhir and pycaml. However, coccinelle
+bundles the sources of these packages and will use them
+when needed. The bundled pycaml package has support for
+python 3.
 
 Then simply type
- ./configure
- make depend
+ ./configure --enable-release
  make
  make install
 
 
+Other configuration flags of interest:
+--prefix                default: /usr/local
+--disable-opt           build the bytecode version
+--with-python=PATH      choose a specific python executable
+--without-python        no python scripting
+--disable-ocaml         no ocaml scripting
+--disable-pycaml        uses the bundled pycaml package instead of
+                        a installed pycaml package.
+--disable-pcre-syntax   no pcre regexp syntax
+--enable-release=world  builds the optimized and unoptimized
+                        version of spatch
+See ./configure --help for more options
 
 
 
-'make' will compile the bytecode version by default.  You could use
-'make all.opt' to have the optimized version.  If you compile both,
-'make install' will take care of that and install both, spatch and
-spatch.opt.  If you use only one of them, 'make install' will install
-the one you have compiled, either spatch ou spatch.opt, under the
-front-end spatch. You could use 'make world' to compile the bytecode
+
+When the --enable-release flag was given to ./configure, 'make' will
+build in release configuration (no debugging symbols, etc.). It
+defaults to the optimized version, unless --disable-opt is given
+to configure. You could use 'make opt-only' to compile the
+optimized version only. Similarly, you can use 'make byte-only' for
+the unoptimized version. 'make install' installs whichever version
+was compiled, and installs a script 'spatch' (the frontend) that invokes
+the 'best' one with proper environment variables.
+You can also use 'make world' to compile the bytecode
 and the optimized code version.
 
+Make targets of interest:
+opt-only, opt           compiles just the optimized version
+byt-only, byte          compiles just the bytecode version
+world                   compiles both + frontends + docs
+all-release             compiles the optimized version + frontends + docs
+all-dev                 compiles the bytecode version + frontends
+all                     default target: alias for either all-dev or all-release
+all.opt                 compiles the optimized version + frontends
+check                   run tests (note: not all tests are expected to succeed)
+As these make targets may change in the future, it is preferred to set the
+appropriate default using the --enable-release flag.
+
 We provide the files generated by menhir in the tarball.  However,
 'make distclean' will remove them. You could either restore them from
 the tarball or install menhir.  Using 'make clean' should be safe with
@@ -54,8 +86,7 @@ regards to these files.
 Note: The test target is intended for developers. In particular, you
       should not expect that every test will pass.
 
-
- In order to use the OCaml scripting feature in SmPL, you must compile
+In order to use the OCaml scripting feature in SmPL, you must compile
 Coccinelle with at least OCaml version 3.11.
 
 
@@ -93,6 +124,10 @@ Coccinelle with at least OCaml version 3.11.
  - To generate a PDF of the control flow graph with '-graphical_trace'
    - pdftk and graphviz (with PDF support)
 
+If runtime tools are not in $PATH, paths to some
+of them can be specified with 'configure' or via
+commandline parameters to spatch.
+
 
 
  ** Dependencies for additional tools **
diff --git a/main.ml b/main.ml
index 129c390..a67d5ea 100644 (file)
--- a/main.ml
+++ b/main.ml
  *)
 
 
+# 0 "./main.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./main.ml"
 open Common
 module FC = Flag_cocci
@@ -282,6 +309,8 @@ let short_options = [
   "   suffix to use when making a backup for inplace";
   "--out-place", Arg.Set outplace_modif,
   "   store modifications in a .cocci_res file";
+  "--reverse", Arg.Set Flag_parsing_cocci.interpret_inverted,
+  "  invert the semantic patch before applying it";
 
   "-U", Arg.Int (fun n -> Flag_parsing_c.diff_lines := Some (i_to_s n)),
   "  set number of diff context lines";
@@ -1166,7 +1195,8 @@ let main () =
                  Testing.testone "" x !compare_with_expected
                end
              else
-               pr2 (spf "ERROR: File %s does not exist" testfile)
+               Printf.fprintf stderr
+                 "ERROR: File %s does not exist\n" testfile
        end
 
     | []  when !test_all ->
@@ -1232,12 +1262,11 @@ let main_with_better_error_report () =
       main ()
     with
     | Unix.Unix_error (e, "stat", filename) ->
-        pr2
-         (spf "ERROR: File %s does not exist: %s"
-            filename (Unix.error_message e));
+        Printf.fprintf stderr "ERROR: File %s does not exist: %s\n"
+         filename (Unix.error_message e);
         raise (UnixExit (-1))
     | Parse_cocci.Bad_virt s ->
-       Common.pr2 (Printf.sprintf "virtual rule %s not supported" s);
+       Printf.fprintf stderr "virtual rule %s not supported\n" s;
         raise (UnixExit (-1))
 
 (*****************************************************************************)
index d316e40..58d7a3c 100644 (file)
@@ -28,10 +28,10 @@ SYSLIBS= str.cma unix.cma
 #for warning:  -w A
 #for profiling:  -p -inline 0   with OCAMLOPT
 OCAMLCFLAGS ?= -g -dtypes
-OPTFLAGS?=$(OCAMLCFLAGS)
+OPTFLAGS ?= -g -dtypes
 
-OCAMLC_CMD=$(OCAMLC) $(OCAMLCFLAGS) $(INCLUDES)
-OCAMLOPT_CMD=$(OCAMLOPT) $(OPTFLAGS) $(INCLUDES)
+OCAMLC_CMD=$(OCAMLC) -thread $(OCAMLCFLAGS) $(INCLUDES)
+OCAMLOPT_CMD=$(OCAMLOPT) -thread $(OPTFLAGS) $(INCLUDES)
 OCAMLDEP_CMD=$(OCAMLDEP) $(INCLUDES)
 OCAMLMKTOP_CMD=$(OCAMLMKTOP) -g -custom $(INCLUDES)
 
@@ -43,7 +43,8 @@ OPTOBJS = $(SRC:.ml=.cmx)
 # Top rules
 ##############################################################################
 all: $(TARGET).cma
-all.opt: $(TARGET).cmxa
+all.opt:
+       @$(MAKE) $(TARGET).cmxa BUILD_OPT=yes
 
 $(TARGET).cma: $(OBJS)
        $(OCAMLC_CMD) -a -o $(TARGET).cma $(OBJS)
@@ -96,3 +97,5 @@ ifneq ($(MAKECMDGOALS),cleandoc)
 endif
 endif
 endif
+
+include ../Makefile.common
index 6e81ebd..a99612f 100644 (file)
@@ -26,7 +26,7 @@ let to_opt cmd =
 
 let check_runtime () =
   let has_opt  = check_cmd (to_opt (!Flag.ocamlc) ^ " -version 2>&1 > /dev/null") in
-  let has_c    = check_cmd (to_opt (!Flag.ocamlc) ^ " -version 2>&1 > /dev/null") in
+  let has_c    = check_cmd (!Flag.ocamlc ^ " -version 2>&1 > /dev/null") in
     if has_opt then
       begin
        Flag.ocamlc   := to_opt (!Flag.ocamlc);
index 1679e7e..5fb8cfa 100644 (file)
@@ -51,9 +51,10 @@ SYSLIBS= str.cma unix.cma num.cma
 #for warning:  -w A
 #for profiling:  -p -inline 0   with OCAMLOPT
 OCAMLCFLAGS ?= -g -dtypes
+OPTFLAGS ?= -g -dtypes
 
-OCAMLC_CMD=$(OCAMLC) $(OCAMLCFLAGS) $(INCLUDES)
-OCAMLOPT_CMD=$(OCAMLOPT) $(OPTFLAGS) $(INCLUDES)
+OCAMLC_CMD=$(OCAMLC) -thread $(OCAMLCFLAGS) $(INCLUDES)
+OCAMLOPT_CMD=$(OCAMLOPT) -thread $(OPTFLAGS) $(INCLUDES)
 OCAMLDEP_CMD=$(OCAMLDEP) $(INCLUDESDEP)
 OCAMLMKTOP_CMD=$(OCAMLMKTOP) -g -custom $(INCLUDES)
 
@@ -65,7 +66,8 @@ OPTOBJS = $(SRC:.ml=.cmx)
 # Top rules
 ##############################################################################
 all: $(TARGET).cma
-all.opt: $(TARGET).cmxa
+all.opt:
+       @$(MAKE) $(TARGET).cmxa BUILD_OPT=yes
 
 $(TARGET).cma: $(OBJS)
        $(OCAMLC_CMD) -a -o $(TARGET).cma $(OBJS)
@@ -134,9 +136,6 @@ locindiv:
 .ml.cmx:
        $(OCAMLOPT_CMD) -c $<
 
-.ml.mldepend:
-       $(OCAMLC_CMD) -i $<
-
 clean::
        rm -f *.cm[ioxa] *.o *.a *.cmxa *.annot
        rm -f *~ .*~ gmon.out #*#
@@ -152,3 +151,5 @@ ifneq ($(MAKECMDGOALS),distclean)
 -include .depend
 endif
 endif
+
+include ../Makefile.common
index c0812a4..9d05efe 100644 (file)
@@ -1135,8 +1135,6 @@ let rec find_macro_lineparen xs =
       find_macro_lineparen (xs)
 
 
-
-
   (* on multiple lines *)
   | (Line
         (
@@ -1160,6 +1158,46 @@ let rec find_macro_lineparen xs =
       find_macro_lineparen (xs)
 
 
+  | (Line (* initializer case *)
+        (
+          PToken ({tok = Tstatic _}) ::
+           PToken ({tok = TIdent (s,_)} as macro) ::
+           Parenthised (xxs,info_parens) ::
+           PToken ({tok = TEq _}) :: rest
+        ))
+    ::xs
+    when (s ==~ regexp_macro) ->
+
+      msg_declare_macro s;
+      let info = TH.info_of_tok macro.tok in
+      macro.tok <- TMacroDecl (Ast_c.str_of_info info, info);
+
+      (* continue with the rest of the line *)
+      find_macro_lineparen ((Line(rest))::xs)
+
+
+  | (Line (* multi-line initializer case *)
+        (
+          (PToken ({tok = Tstatic _})::[]
+          )))
+    ::(Line
+        (
+          PToken ({tok = Tstatic _}) ::
+           PToken ({tok = TIdent (s,_)} as macro) ::
+           Parenthised (xxs,info_parens) ::
+           PToken ({tok = TEq _}) :: rest
+        ))
+    ::xs
+    when (s ==~ regexp_macro) ->
+
+      msg_declare_macro s;
+      let info = TH.info_of_tok macro.tok in
+      macro.tok <- TMacroDecl (Ast_c.str_of_info info, info);
+
+      (* continue with the rest of the line *)
+      find_macro_lineparen ((Line(rest))::xs)
+
+
   (* linuxext: ex: DECLARE_BITMAP();
    *
    * Here I use regexp_declare and not regexp_macro because
index 8b0f808..e0938e4 100644 (file)
@@ -561,8 +561,7 @@ let set_minus_comment adj = function
 
 (* don't touch ifdefs, done after *)
 let set_minus_comment_or_plus adj = function
-    T2(Parser_c.TCommentCpp (Token_c.CppIfDirective _, _),_,_)
-  | Cocci2 _ | C2 _ | Comma _ | Indent_cocci2 | Unindent_cocci2 _
+    Cocci2 _ | C2 _ | Comma _ | Indent_cocci2 | Unindent_cocci2 _
   | EatSpace2 as x -> x
   | x -> set_minus_comment adj x
 
@@ -748,50 +747,70 @@ let remove_minus_and_between_and_expanded_and_fake xs =
     | rest -> adjust_before_brace rest in
 
   let xs = List.rev (from_newline (List.rev xs)) in
-  let xs = drop_minus xs in
-  xs
 
-let cleanup_ifdefs toks =
+  let cleanup_ifdefs toks =
   (* TODO: these functions are horrid, but using tokens caused circularity *)
-  let is_ifdef0 = function
-      T2((Parser_c.TCommentCpp
-           (Token_c.CppIfDirective Token_c.IfDef0, _)),m,idx) -> true
-    | _ -> false in
-  let is_ifdef = function
-      T2((Parser_c.TCommentCpp
-           (Token_c.CppIfDirective Token_c.IfDef, _)),m,idx) -> true
-    | t -> is_ifdef0 t in
-  let is_endif = function
-      T2((Parser_c.TCommentCpp
-           (Token_c.CppIfDirective Token_c.Endif, _)),m,idx) -> true
-    | _ -> false in
-  (* only real comments *)
-let is_whitespace_or_comment if0 = function
-  | (T2 (t,_b,_i)) ->
-      (match t with
-      | Parser_c.TComment _ -> false (* previous pass chooses comments *)
-      | Parser_c.TCommentSpace _ -> true  (* only whitespace *)
-      | Parser_c.TCommentNewline _ (* newline plus whitespace *)
-      |        Parser_c.TCommentCpp (Token_c.CppIfDirective Token_c.Else, _) -> true
-      |        Parser_c.TCommentCpp (Token_c.CppPassingNormal, _) -> if0
-      | t -> false
-      )
-  | _ -> false in
-  let rec loop prev if0s = function
-      [] -> prev
-    | t::rest when is_ifdef0 t -> loop (t::prev) (true::if0s) rest
-    | t::rest when is_ifdef t -> loop (t::prev) (false::if0s) rest
-    | t::rest when is_endif t ->
-       (match if0s with
-         [] -> loop (t::prev) if0s rest
-       | tgt::if0s ->
-           let (spaces,prest) =
-             Common.span (is_whitespace_or_comment tgt) prev in
-           (match prest with
-             t1::prest when is_ifdef t1 -> loop prest if0s rest
-           | _ -> loop (t::prev) [] rest)) (* failed, so drop if0 info *)
-    | x::xs -> loop (x::prev) if0s xs in
-  List.rev (loop [] [] toks)
+    let is_ifdef = function
+       T2((Parser_c.TCommentCpp
+             (Token_c.CppIfDirective Token_c.IfDef, _)),m,idx) -> true
+      | T2((Parser_c.TCommentCpp
+             (Token_c.CppIfDirective Token_c.IfDef0, _)),m,idx) -> true
+      | t -> false in
+    let is_else = function
+       T2((Parser_c.TCommentCpp
+             (Token_c.CppIfDirective Token_c.Else, _)),m,idx) -> true
+      | _ -> false in
+    let is_endif = function
+       T2((Parser_c.TCommentCpp
+             (Token_c.CppIfDirective Token_c.Endif, _)),m,idx) -> true
+      | _ -> false in
+    let add t = function
+       l::rest -> (t::l)::rest
+      |        _ -> failwith "not possible" in
+    let rec parse_ifdef acc_keywords acc_code stack = function
+       [] -> (None,acc_keywords,acc_code)
+      | t::rest when is_else t ->
+         (match stack with
+           [] -> parse_ifdef (t::acc_keywords) ([]::acc_code) stack rest
+         | _ -> parse_ifdef acc_keywords (add t acc_code) stack rest)
+      | t::rest when is_endif t ->
+         (match stack with
+           [] -> ((Some (t,rest)),acc_keywords,acc_code)
+         | _::stack -> parse_ifdef acc_keywords (add t acc_code) stack rest)
+      | t::rest when is_ifdef t ->
+         parse_ifdef acc_keywords (add t acc_code) (()::stack) rest
+      | t::rest -> parse_ifdef acc_keywords (add t acc_code) stack rest in
+    let unminus = function
+       T2 (t,Min adj,idx) -> T2 (t,Ctx,idx)
+      | x -> x in
+    let is_minus = function
+       T2 (t,Min adj,idx) -> true
+      | x -> false in
+    let rec loop = function
+       [] -> []
+      | t::rest when is_ifdef t ->
+         let (ender,acc_keywords,acc_code) =
+           parse_ifdef [t] [[]] [] rest in
+         let acc_code = List.map loop acc_code in
+         let merge = (* args reversed *)
+           List.fold_left2
+             (fun prev kwd code -> kwd :: (List.rev code) @ prev)
+             [] in
+         (match ender with
+           None -> merge (List.map unminus acc_keywords) acc_code
+         | Some(endif,rest) ->
+             let rest = loop rest in
+             if List.for_all is_minus (endif::acc_keywords)
+             then (merge acc_keywords acc_code) @ (endif :: rest)
+             else
+               (merge (List.map unminus acc_keywords) acc_code) @
+               ((unminus endif) :: rest))
+      | x::xs -> x :: loop xs in
+    loop toks in
+      
+  let xs = cleanup_ifdefs xs in
+  let xs = drop_minus xs in
+  xs
 
 (* things that should not be followed by space - boundary between SmPL
    code and C code *)
@@ -1345,7 +1364,6 @@ let pp_program2 xs outfile  =
              let toks = paren_to_space toks in
              let toks = drop_end_comma toks in
              let toks = remove_minus_and_between_and_expanded_and_fake toks in
-             let toks = cleanup_ifdefs toks in
               (* assert Origin + Cocci + C and no minus *)
              let toks = add_space toks in
              let toks = add_newlines toks tu in
index 1236a72..d241f6e 100644 (file)
@@ -272,6 +272,8 @@ let rec ident i =
                               | _ -> raise Impossible
                            )
 
+    | Ast.AsIdent(id,asid) -> ident id
+
     | Ast.DisjId(id_list) ->
        if generating
        then print_disj_list ident id_list
index ee96b84..02e2b30 100644 (file)
@@ -28,6 +28,9 @@ endif
 
 TARGET=cocci_parser
 
+OCAMLCFLAGS ?= -g -dtypes
+OPTFLAGS ?= -g -dtypes
+
 LEXER_SOURCES = lexer_cocci.mll
 CLI_LEXER_SOURCES = lexer_cli.mll
 SCRIPT_LEXER_SOURCES = lexer_script.mll
@@ -73,18 +76,19 @@ OPTOBJS = $(OBJS:.cmo=.cmx)
 all: $(LIB)
 local: $(EXEC)
 
-all.opt: $(OPTLIB)
+all.opt:
+       @$(MAKE) $(OPTLIB) BUILD_OPT=yes
 
 $(LIB): $(GENERATED) $(OBJS)
-       $(OCAMLC) $(OCAMLCFLAGS) $(INCLUDES) -I $(MENHIRDIR) -a -o $(LIB) $(MENHIRMOD) $(OBJS)
+       $(OCAMLC) -thread $(OCAMLCFLAGS) $(INCLUDES) -I $(MENHIRDIR) -a -o $(LIB) $(MENHIRMOD) $(OBJS)
 
 
 $(OPTLIB): $(GENERATED) $(OPTOBJS)
-       $(OCAMLOPT) $(OPTFLAGS) $(INCLUDES) -I $(MENHIRDIR) -a -o $(OPTLIB) $(MENHIROMOD) $(OPTOBJS)
+       $(OCAMLOPT) -thread $(OPTFLAGS) $(INCLUDES) -I $(MENHIRDIR) -a -o $(OPTLIB) $(MENHIROMOD) $(OPTOBJS)
 
 
 $(EXEC): $(OBJS) main.cmo $(LIBS)
-       $(OCAMLC) $(OCAMLCFLAGS) $(INCLUDES) -o $(EXEC) $(SYSLIBS) $(LIBS) $(OBJS) main.cmo
+       $(OCAMLC) -thread $(OCAMLCFLAGS) $(INCLUDES) -o $(EXEC) $(SYSLIBS) $(LIBS) $(OBJS) main.cmo
 
 clean::
        rm -f $(LIB)
@@ -96,13 +100,13 @@ clean::
 .SUFFIXES: .ml .mli .cmo .cmi .cmx
 
 .ml.cmo:
-       $(OCAMLC) $(OCAMLCFLAGS) $(INCLUDES) -c $<
+       $(OCAMLC) -thread $(OCAMLCFLAGS) $(INCLUDES) -c $<
 
 .mli.cmi:
-       $(OCAMLC) $(OCAMLCFLAGS) $(INCLUDES) -c $<
+       $(OCAMLC) -thread $(OCAMLCFLAGS) $(INCLUDES) -c $<
 
 .ml.cmx:
-       $(OCAMLOPT) $(OPTFLAGS) $(INCLUDES) -c $<
+       $(OCAMLOPT) -thread $(OPTFLAGS) $(INCLUDES) -c $<
 
 $(LEXER_SOURCES:.mll=.ml) :    $(LEXER_SOURCES)
        $(OCAMLLEX) $(LEXER_SOURCES)
@@ -142,3 +146,5 @@ ifneq ($(MAKECMDGOALS),distclean)
 -include .depend
 endif
 endif
+
+include ../Makefile.common
index cdbf37e..25fcacd 100644 (file)
  *)
 
 
+# 0 "./adjacency.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./adjacency.ml"
 module Ast0 = Ast0_cocci
 module V0 = Visitor_ast0
index 20a2cc4..5062156 100644 (file)
  *)
 
 
+# 0 "./adjacency.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./adjacency.mli"
 val compute_adjacency : Ast0_cocci.rule -> Ast0_cocci.rule
index 9fa77cd..3f789d6 100644 (file)
  *)
 
 
+# 0 "./adjust_pragmas.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./adjust_pragmas.ml"
 (* Find a directive or comment at the end of a statement.  Things with aft
 given None, because they can accomodate their own directives or comments *)
@@ -242,6 +269,7 @@ let rec left_ident i =
       call_right left_ident id i (function id -> Ast0.OptIdent(id))
   | Ast0.UniqueIdent(id) ->
       call_right left_ident id i (function id -> Ast0.UniqueIdent(id))
+  | Ast0.AsIdent(id,asid) -> failwith "not possible"
 
 let left_fundecl name fninfo =
   let fncall_right processor data cont =
index 42e9857..e4e953a 100644 (file)
  *)
 
 
+# 0 "./adjust_pragmas.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./adjust_pragmas.mli"
 val process : Ast0_cocci.rule -> Ast0_cocci.rule
index af2f2ae..1b089ea 100644 (file)
  *)
 
 
+# 0 "./arity.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./arity.ml"
 (* Arities matter for the minus slice, but not for the plus slice. *)
 
@@ -192,7 +219,7 @@ let rec ident opt_allowed tgt i =
          then fail i "opt only allowed in the last disjunct"
       |        _ -> ());
       Ast0.rewrap i (Ast0.DisjId(starter,id_list,mids,ender))
-  | Ast0.OptIdent(_) | Ast0.UniqueIdent(_) ->
+  | Ast0.OptIdent(_) | Ast0.UniqueIdent(_) | Ast0.AsIdent _ ->
       failwith "unexpected code"
        
 (* --------------------------------------------------------------------- *)
index 40a2163..81ed23d 100644 (file)
  *)
 
 
+# 0 "./arity.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./arity.mli"
 val minus_arity : Ast0_cocci.rule -> Ast0_cocci.rule
index 2438b5d..3af2123 100644 (file)
  *)
 
 
+# 0 "./ast0_cocci.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./ast0_cocci.ml"
 module Ast = Ast_cocci
 module TC = Type_cocci
@@ -110,6 +137,7 @@ and base_ident =
   | MetaId        of Ast.meta_name mcode * Ast.idconstraint * Ast.seed * pure
   | MetaFunc      of Ast.meta_name mcode * Ast.idconstraint * pure
   | MetaLocalFunc of Ast.meta_name mcode * Ast.idconstraint * pure
+  | AsIdent       of ident * ident (* as ident, always metavar *)
   | DisjId        of string mcode * ident list *
                      string mcode list (* the |s *) * string mcode
   | OptIdent      of ident
@@ -578,6 +606,10 @@ let rec meta_pos_name = function
        (* totally fake, just drop the rest, only for isos *)
       meta_pos_name (List.hd vars)
   | MetaPosTag(MetaPos(name,constraints,_)) -> name
+  | IdentTag(i) ->
+      (match unwrap i with
+       MetaId(name,constraints,seed,pure) -> name
+      | _ -> failwith "bad metavariable")
   | ExprTag(e) ->
       (match unwrap e with
        MetaExpr(name,constraints,ty,form,pure) -> name
index 53f7a57..ec2a92d 100644 (file)
  *)
 
 
+# 0 "./ast0_cocci.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./ast0_cocci.mli"
 (* --------------------------------------------------------------------- *)
 (* Modified code *)
@@ -101,6 +128,7 @@ and base_ident =
        Ast_cocci.seed * pure
   | MetaFunc      of Ast_cocci.meta_name mcode * Ast_cocci.idconstraint * pure
   | MetaLocalFunc of Ast_cocci.meta_name mcode * Ast_cocci.idconstraint * pure
+  | AsIdent       of ident * ident (* as ident, always metavar *)
   | DisjId        of string mcode * ident list *
                      string mcode list (* the |s *) * string mcode
   | OptIdent      of ident
index 74ed4da..457eec0 100644 (file)
  *)
 
 
+# 0 "./ast0toast.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./ast0toast.ml"
 (* Arities matter for the minus slice, but not for the plus slice. *)
 
@@ -218,6 +245,7 @@ let check_allminus =
     match Ast0.unwrap e with
       Ast0.DisjId(starter,id_list,mids,ender) ->
        List.for_all r.VT0.combiner_rec_ident id_list
+    | Ast0.AsIdent(id,asid) -> k id
     | _ -> k e in
 
   let expression r k e =
@@ -402,6 +430,8 @@ and ident i =
        Ast.MetaFunc(mcode name,constraints,unitary,false)
     | Ast0.MetaLocalFunc(name,constraints,_) ->
        Ast.MetaLocalFunc(mcode name,constraints,unitary,false)
+    | Ast0.AsIdent(id,asid) ->
+       Ast.AsIdent(ident id,ident asid)
     | Ast0.OptIdent(id) -> Ast.OptIdent(ident id)
     | Ast0.UniqueIdent(id) -> Ast.UniqueIdent(ident id))
 
index f9c116a..f69bd03 100644 (file)
  *)
 
 
+# 0 "./ast0toast.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./ast0toast.mli"
 val ast0toast :
     string -> Ast_cocci.dependency -> string list (* dropped isos *) ->
index 949bb0b..7a2a42b 100644 (file)
  *)
 
 
+# 0 "./ast_cocci.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./ast_cocci.ml"
 (* --------------------------------------------------------------------- *)
 (* Modified code *)
@@ -159,6 +186,7 @@ and base_ident =
   | MetaId        of meta_name mcode * idconstraint * keep_binding * inherited
   | MetaFunc      of meta_name mcode * idconstraint * keep_binding * inherited
   | MetaLocalFunc of meta_name mcode * idconstraint * keep_binding * inherited
+  | AsIdent       of ident * ident (* as ident, always metavar *)
 
   | DisjId        of ident list
   | OptIdent      of ident
index 4492379..aa02ed6 100644 (file)
  *)
 
 
+# 0 "./ast_cocci.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./ast_cocci.mli"
 (* --------------------------------------------------------------------- *)
 (* Modified code *)
@@ -145,6 +172,7 @@ and base_ident =
   | MetaId        of meta_name mcode * idconstraint * keep_binding * inherited
   | MetaFunc      of meta_name mcode * idconstraint * keep_binding * inherited
   | MetaLocalFunc of meta_name mcode * idconstraint * keep_binding * inherited
+  | AsIdent       of ident * ident (* as ident, always metavar *)
 
   | DisjId        of ident list
   | OptIdent      of ident
index 0a4e7f8..2338ae4 100644 (file)
  *)
 
 
+# 0 "./check_meta.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./check_meta.ml"
 (* For minus fragment, checks that all of the identifier metavariables that
 are used are not declared as fresh, and check that all declared variables
@@ -115,6 +142,7 @@ let rec ident context old_metas table minus i =
       seed table minus seedval
   | Ast0.MetaFunc(name,_,_) -> check_table table minus name
   | Ast0.MetaLocalFunc(name,_,_) -> check_table table minus name
+  | Ast0.AsIdent(id,asid) -> failwith "not generated yet"
   | Ast0.DisjId(_,id_list,_,_) ->
       List.iter (ident context old_metas table minus) id_list
   | Ast0.OptIdent(_) | Ast0.UniqueIdent(_) ->
index 815d5e1..f6fc587 100644 (file)
  *)
 
 
+# 0 "./check_meta.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./check_meta.mli"
 val check_meta :
     string ->
index dbe9ec6..c4d86de 100644 (file)
  *)
 
 
+# 0 "./comm_assoc.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./comm_assoc.ml"
 (* searches for E op ..., for any commutative and associative binary
 operator.  When this satisfies the isomorphism conditions (ie all minus, or
index 5c60773..7503d8b 100644 (file)
  *)
 
 
+# 0 "./comm_assoc.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./comm_assoc.mli"
 val comm_assoc :
     Ast0_cocci.rule -> string (* rule name *) ->
index 2182af9..8c5d119 100644 (file)
  *)
 
 
+# 0 "./command_line.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./command_line.ml"
 (* ---------------------------------------------------------------------- *)
 (* useful functions *)
index 77ef158..1e6ca71 100644 (file)
  *)
 
 
+# 0 "./command_line.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./command_line.mli"
 val command_line : string list -> string list
index df41966..85f7710 100644 (file)
  *)
 
 
+# 0 "./compute_lines.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./compute_lines.ml"
 (* Computes starting and ending logical lines for statements and
 expressions.  every node gets an index as well. *)
@@ -280,6 +307,7 @@ let rec full_ident i =
       let (id,r) = full_ident id in mkidres i (Ast0.OptIdent(id)) id id r
   | Ast0.UniqueIdent(id) ->
       let (id,r) = full_ident id in mkidres i (Ast0.UniqueIdent(id)) id id r
+  | Ast0.AsIdent _ -> failwith "not possible"
 and ident i = let (id,_) = full_ident i in id
 
 (* --------------------------------------------------------------------- *)
index 564aaa1..5f66f96 100644 (file)
  *)
 
 
+# 0 "./compute_lines.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./compute_lines.mli"
 val compute_lines : bool -> Ast0_cocci.rule -> Ast0_cocci.rule
 
index 5f9b8e7..3b644d7 100644 (file)
  *)
 
 
+# 0 "./context_neg.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./context_neg.ml"
 (* Detects subtrees that are all minus/plus and nodes that are "binding
 context nodes".  The latter is a node whose structure and immediate tokens
index 054902f..7ab5d2f 100644 (file)
  *)
 
 
+# 0 "./context_neg.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./context_neg.mli"
 val context_neg :
     Ast0_cocci.rule -> Ast0_cocci.rule ->
index a056742..8580017 100644 (file)
  *)
 
 
+# 0 "./data.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./data.ml"
 module Ast0 = Ast0_cocci
 module Ast = Ast_cocci
index 5b96fc2..752a31b 100644 (file)
  *)
 
 
+# 0 "./data.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./data.mli"
 (* types that clutter the .mly file *)
 (* for iso metavariables, true if they can only match nonmodified, unitary
index a6dbfef..279bda9 100644 (file)
  *)
 
 
+# 0 "./disjdistr.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./disjdistr.ml"
 module Ast = Ast_cocci
 module V = Visitor_ast
index 3d44657..6bb4ed1 100644 (file)
  *)
 
 
+# 0 "./disjdistr.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./disjdistr.mli"
 val disj :
     Ast_cocci.rule_with_metavars list -> Ast_cocci.rule_with_metavars list
index 60974b4..cda6922 100644 (file)
  *)
 
 
+# 0 "./flag_parsing_cocci.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./flag_parsing_cocci.ml"
 (* uses E rather than A and adds comments indicating the start and end of
 each matched term *)
@@ -33,6 +60,9 @@ let sgrep_mode = ref false (* no longer supported, subsumed by sgrep2 *)
 let show_SP = ref false
 let show_iso_failures = ref true
 
+(* interpret the patch in an inverted way *)
+let interpret_inverted = ref false
+
 let iso_limit = ref (None : int option) (*(Some 3)*)
 let disabled_isos = ref ([] : string list)
 
index 80900e6..1895de7 100644 (file)
  *)
 
 
+# 0 "./free_vars.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./free_vars.ml"
 (* For each rule return the list of variables that are used after it.
 Also augment various parts of each rule with unitary, inherited, and freshness
index fd3134e..1558b65 100644 (file)
  *)
 
 
+# 0 "./free_vars.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./free_vars.mli"
 (* Used after things can only have one binding.  Positions can have many
 bindings.  These are combined in ctlcocciintegration, ie after the CTL
index 0ef454b..e626293 100644 (file)
  *)
 
 
+# 0 "./function_prototypes.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./function_prototypes.ml"
 module Ast0 = Ast0_cocci
 module Ast = Ast_cocci
@@ -37,6 +64,7 @@ let rec get_name name =
     Ast0.Id(nm) -> [Id(Ast0.unwrap_mcode nm)]
   | Ast0.MetaId(nm,_,_,_) | Ast0.MetaFunc(nm,_,_)
   | Ast0.MetaLocalFunc(nm,_,_) -> [Meta(Ast0.unwrap_mcode nm)]
+  | Ast0.AsIdent(id1,id2) -> failwith "not supported"
   | Ast0.DisjId(_,id_list,_,_) -> List.concat (List.map get_name id_list)
   | Ast0.OptIdent(id) | Ast0.UniqueIdent(id) ->
       get_name id
index b18105c..f78e00b 100644 (file)
  *)
 
 
+# 0 "./function_prototypes.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./function_prototypes.mli"
 val process : string (* name *) -> Ast_cocci.metavar list ->
   string list (* dropped isos *) ->
index 95c1742..6549787 100644 (file)
  *)
 
 
+# 0 "./get_constants.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./get_constants.ml"
 (* get a list of all of the constants in the - slice of a SmPL file, to be
 used to select which files to process *)
index 0e95ee3..1d50ee3 100644 (file)
  *)
 
 
+# 0 "./get_constants.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./get_constants.mli"
 val get_constants : Ast_cocci.rule list -> string list list
index ed95fd3..de76530 100644 (file)
  *)
 
 
+# 0 "./get_constants2.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./get_constants2.ml"
 module Ast = Ast_cocci
 module V = Visitor_ast
@@ -57,6 +84,13 @@ wanted *)
 type combine =
     And of combine list | Or of combine list | Elem of string | False | True
 
+let rec dep2c = function
+    And l -> Printf.sprintf "(%s)" (String.concat "&" (List.map dep2c l))
+  | Or l -> Printf.sprintf "(%s)" (String.concat "|" (List.map dep2c l))
+  | Elem x -> x
+  | False -> "false"
+  | True -> "true"
+
 (* glimpse often fails on large queries.  We can safely remove arguments of
 && as long as we don't remove all of them (note that there is no negation).
 This tries just removing one of them and then orders the results by
@@ -263,10 +297,11 @@ let drop x = True
 let do_get_constants constants keywords env neg_pos =
   let donothing r k e = k e in
   let option_default = True in
+  let bad_default = False in
   let bind = build_and in
   let inherited ((nm1,_) as x) =
-    (* ignore virtuals *)
-    if nm1 = "virtual" then option_default
+    (* ignore virtuals, can never match *)
+    if nm1 = "virtual" then bad_default
     (* perhaps inherited, but value not required, so no constraints *)
     else if List.mem x neg_pos then option_default
     else (try List.assoc nm1 env with Not_found -> False) in
@@ -288,7 +323,8 @@ let do_get_constants constants keywords env neg_pos =
            "NULL" -> keywords "NULL"
          | nm -> constants nm)
     | Ast.MetaId(name,_,_,_) | Ast.MetaFunc(name,_,_,_)
-    | Ast.MetaLocalFunc(name,_,_,_) -> bind (k i) (minherited name)
+    | Ast.MetaLocalFunc(name,_,_,_) ->
+       bind (k i) (minherited name)
     | Ast.DisjId(ids) -> disj_union_all (List.map r.V.combiner_ident ids)
     | _ -> k i in
 
@@ -629,7 +665,8 @@ let run rules neg_pos_vars =
                      else Ast.AndDep (Ast.Dep rule,prev))
                  deps mv in
              (match dependencies env extra_deps with
-               False -> (rest_info, in_plus, (nm,True)::env, nm::locals)
+               False ->
+                 (rest_info, in_plus, (nm,True)::env, nm::locals)
              | dependencies ->
                  (build_or dependencies rest_info, in_plus, env, locals))
           | (Ast.InitialScriptRule (_,_,deps,_),_)
index 2e0dad3..0819391 100644 (file)
  *)
 
 
+# 0 "./get_constants2.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./get_constants2.mli"
 type combine =
     And of combine list | Or of combine list | Elem of string | False | True
index ce453a2..66ac64b 100644 (file)
  *)
 
 
+# 0 "./get_metas.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./get_metas.ml"
 (* --------------------------------------------------------------------- *)
 (* creates AsExpr, etc *)
@@ -86,6 +113,7 @@ let dots fn d =
        let (n,l) = map_split_bind fn l in (n, Ast0.STARS(l)))
     
 let rec ident i =
+  let (metas,i) =
   rewrap i
     (match Ast0.unwrap i with
       Ast0.Id(name) ->
@@ -99,6 +127,7 @@ let rec ident i =
     | Ast0.MetaLocalFunc(name,constraints,pure) ->
        let (n,name) = mcode name in
        (n,Ast0.MetaLocalFunc(name,constraints,pure))
+    | Ast0.AsIdent _ -> failwith "not possible"
     | Ast0.DisjId(starter,id_list,mids,ender) ->
        do_disj starter id_list mids ender ident
          (fun starter id_list mids ender ->
@@ -106,8 +135,15 @@ let rec ident i =
     | Ast0.OptIdent(id) ->
        let (n,id) = ident id in (n,Ast0.OptIdent(id))
     | Ast0.UniqueIdent(id) ->
-       let (n,id) = ident id in (n,Ast0.UniqueIdent(id)))
-    
+       let (n,id) = ident id in (n,Ast0.UniqueIdent(id))) in
+    List.fold_left
+      (function (other_metas,id) ->
+       function
+           Ast0.IdentTag(id_meta) ->
+             (other_metas,Ast0.rewrap id (Ast0.AsIdent(id,id_meta)))
+         | x -> (x::other_metas,id))
+      ([],i) metas
+
 and expression e =
   let (metas,e) =
     rewrap e
@@ -257,6 +293,10 @@ and expression e =
        function
            Ast0.ExprTag(exp_meta) ->
              (other_metas,Ast0.rewrap exp (Ast0.AsExpr(exp,exp_meta)))
+         | Ast0.IdentTag(id_meta) ->
+             (other_metas,
+              Ast0.rewrap exp
+                (Ast0.AsExpr(exp,Ast0.rewrap exp (Ast0.Ident(id_meta)))))
          | x -> (x::other_metas,exp))
       ([],e) metas
 
index 2e226a9..4aeac86 100644 (file)
  *)
 
 
+# 0 "./get_metas.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./get_metas.mli"
 val process : Ast0_cocci.rule -> Ast0_cocci.rule
index dc65cf4..ca4fe77 100644 (file)
  *)
 
 
+# 0 "./id_utils.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./id_utils.ml"
 (* evaluation of nested and and or using id-utils *)
 
index f1387e1..a8b0785 100644 (file)
  *)
 
 
+# 0 "./id_utils.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./id_utils.mli"
 val interpret : string -> Get_constants2.combine -> string list
index 62a2180..063a460 100644 (file)
  *)
 
 
+# 0 "./index.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./index.ml"
 (* create an index for each constructor *)
 (* current max is 157 *)
@@ -88,6 +115,7 @@ let ident i =
     | Ast0.DisjId(_,id_list,_,_) -> [152]
     | Ast0.OptIdent(id) -> [14]
     | Ast0.UniqueIdent(id) -> [15]
+    | Ast0.AsIdent _ -> failwith "not possible"
 
 let expression e =
   match Ast0.unwrap e with
index e6c0539..de11f31 100644 (file)
  *)
 
 
+# 0 "./index.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./index.mli"
 val expression_dots : Ast0_cocci.expression Ast0_cocci.dots -> int list
 val initialiser_dots : Ast0_cocci.initialiser Ast0_cocci.dots -> int list
index 199b04c..0a7f36f 100644 (file)
  *)
 
 
+# 0 "./insert_plus.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./insert_plus.ml"
 (* The error message "no available token to attach to" often comes in an
 argument list of unbounded length.  In this case, one should move a comma so
index a060474..e43adda 100644 (file)
  *)
 
 
+# 0 "./insert_plus.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./insert_plus.mli"
 val insert_plus : Ast0_cocci.rule -> Ast0_cocci.rule -> bool -> unit
 (* bool is true if no isos *)
index ce4e542..2cb1567 100644 (file)
  *)
 
 
+# 0 "./iso_compile.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./iso_compile.ml"
 module V0 = Visitor_ast0
 module VT0 = Visitor_ast0_types
index 8a7e183..58c6fb1 100644 (file)
  *)
 
 
+# 0 "./iso_compile.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./iso_compile.mli"
 val process : Iso_pattern.isomorphism -> unit
 
index a91ee67..8866940 100644 (file)
  *)
 
 
+# 0 "./iso_pattern.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./iso_pattern.ml"
 (* Potential problem: offset of mcode is not updated when an iso is
 instantiated, implying that a term may end up with many mcodes with the
index e6b4271..c86eff7 100644 (file)
  *)
 
 
+# 0 "./iso_pattern.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./iso_pattern.mli"
 type isomorphism =
     Ast_cocci.metavar list * Ast0_cocci.anything list list * string(*iso name*)
index 911959a..a4f6668 100644 (file)
  *)
 
 
+# 0 "./lexer_cli.mll"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./lexer_cli.mll"
 (* Lexer for the command line mode *)
 
index 096239d..f051200 100644 (file)
@@ -5,6 +5,7 @@ module D = Data
 module Ast = Ast_cocci
 module Ast0 = Ast0_cocci
 module P = Parse_aux
+module FC = Flag_parsing_cocci
 exception Lexical of string
 let tok = Lexing.lexeme
 
@@ -59,8 +60,19 @@ let pass_zero _ = col_zero := false
 
 let lexerr s1 s2 = raise (Lexical (Printf.sprintf "%s%s" s1 s2))
 
+let opt_reverse_token token =
+  if !FC.interpret_inverted
+  then match token with
+         D.MINUS        -> D.PLUSPLUS  (* maybe too liberal *)
+       | D.OPTMINUS     -> lexerr "cannot invert token ?- (an optional minus line), which is needed for reversing the patch" ""  
+       | D.UNIQUEMINUS  -> D.PLUS
+       | D.PLUS         -> D.MINUS
+       | D.PLUSPLUS     -> D.MINUS (* may not be sufficient *)
+       | _              -> token
+  else token
+
 let add_current_line_type x =
-  match (x,!current_line_type) with
+  match (opt_reverse_token x,!current_line_type) with
     (D.MINUS,(D.CONTEXT,ln,lln))  ->
       current_line_type := (D.MINUS,ln,lln)
   | (D.MINUS,(D.UNIQUE,ln,lln))   ->
@@ -471,7 +483,7 @@ let drop_spaces s =
   let start = loop 0 in
   String.sub s start (len - start)
 
-# 475 "lexer_cocci.ml"
+# 487 "lexer_cocci.ml"
 let __ocaml_lex_tables = {
   Lexing.lex_base = 
    "\000\000\175\255\176\255\081\000\119\000\181\255\182\255\192\000\
@@ -1459,7 +1471,7 @@ let rec token lexbuf =
 and __ocaml_lex_token_rec lexbuf __ocaml_lex_state =
   match Lexing.new_engine __ocaml_lex_tables __ocaml_lex_state lexbuf with
       | 0 ->
-# 496 "lexer_cocci.mll"
+# 508 "lexer_cocci.mll"
     ( let cls = !current_line_started in
 
       if not cls
@@ -1473,20 +1485,20 @@ and __ocaml_lex_token_rec lexbuf __ocaml_lex_state =
          | _ -> reset_line lexbuf; token lexbuf
        end
       else (reset_line lexbuf; token lexbuf) )
-# 1477 "lexer_cocci.ml"
+# 1489 "lexer_cocci.ml"
 
   | 1 ->
-# 510 "lexer_cocci.mll"
+# 522 "lexer_cocci.mll"
                    ( start_line false; token lexbuf )
-# 1482 "lexer_cocci.ml"
+# 1494 "lexer_cocci.ml"
 
   | 2 ->
 let
-# 512 "lexer_cocci.mll"
+# 524 "lexer_cocci.mll"
                                        after
-# 1488 "lexer_cocci.ml"
+# 1500 "lexer_cocci.ml"
 = Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_mem.(0) lexbuf.Lexing.lex_curr_pos in
-# 512 "lexer_cocci.mll"
+# 524 "lexer_cocci.mll"
                                               (
     match !current_line_type with
       (D.PLUS,_,_) | (D.PLUSPLUS,_,_) ->
@@ -1497,88 +1509,88 @@ let
        start_line true;
        TPragma (Ast.Indent str, get_current_line_type lexbuf)
     | _ -> start_line false; token lexbuf )
-# 1501 "lexer_cocci.ml"
+# 1513 "lexer_cocci.ml"
 
   | 3 ->
-# 524 "lexer_cocci.mll"
+# 536 "lexer_cocci.mll"
    ( match !current_line_type with
       (D.PLUS,_,_) | (D.PLUSPLUS,_,_) ->
        start_line true;
        TPragma (Ast.Space (tok lexbuf), get_current_line_type lexbuf)
     | _ -> failwith "attributes only allowedin + code" )
-# 1510 "lexer_cocci.ml"
+# 1522 "lexer_cocci.ml"
 
   | 4 ->
-# 530 "lexer_cocci.mll"
+# 542 "lexer_cocci.mll"
          ( start_line true; TArobArob )
-# 1515 "lexer_cocci.ml"
+# 1527 "lexer_cocci.ml"
 
   | 5 ->
-# 531 "lexer_cocci.mll"
+# 543 "lexer_cocci.mll"
          ( pass_zero();
           if !Data.in_rule_name or not !current_line_started
           then (start_line true; TArob)
           else (check_minus_context_linetype "@";
                 TPArob (get_current_line_type lexbuf)) )
-# 1524 "lexer_cocci.ml"
+# 1536 "lexer_cocci.ml"
 
   | 6 ->
-# 537 "lexer_cocci.mll"
+# 549 "lexer_cocci.mll"
           ( start_line true; TTildeEq (get_current_line_type lexbuf) )
-# 1529 "lexer_cocci.ml"
+# 1541 "lexer_cocci.ml"
 
   | 7 ->
-# 538 "lexer_cocci.mll"
+# 550 "lexer_cocci.mll"
          ( start_line true; TTildeExclEq (get_current_line_type lexbuf) )
-# 1534 "lexer_cocci.ml"
+# 1546 "lexer_cocci.ml"
 
   | 8 ->
-# 540 "lexer_cocci.mll"
+# 552 "lexer_cocci.mll"
       ( start_line true; check_minus_context_linetype (tok lexbuf);
        TWhen (get_current_line_type lexbuf) )
-# 1540 "lexer_cocci.ml"
+# 1552 "lexer_cocci.ml"
 
   | 9 ->
-# 544 "lexer_cocci.mll"
+# 556 "lexer_cocci.mll"
       ( start_line true; check_minus_context_linetype (tok lexbuf);
        TEllipsis (get_current_line_type lexbuf) )
-# 1546 "lexer_cocci.ml"
+# 1558 "lexer_cocci.ml"
 
   | 10 ->
-# 555 "lexer_cocci.mll"
+# 567 "lexer_cocci.mll"
            ( start_line true; check_context_linetype (tok lexbuf);
             TOEllipsis (get_current_line_type lexbuf) )
-# 1552 "lexer_cocci.ml"
+# 1564 "lexer_cocci.ml"
 
   | 11 ->
-# 557 "lexer_cocci.mll"
+# 569 "lexer_cocci.mll"
            ( start_line true; check_context_linetype (tok lexbuf);
             TCEllipsis (get_current_line_type lexbuf) )
-# 1558 "lexer_cocci.ml"
+# 1570 "lexer_cocci.ml"
 
   | 12 ->
-# 559 "lexer_cocci.mll"
+# 571 "lexer_cocci.mll"
             ( start_line true; check_minus_context_linetype (tok lexbuf);
             TPOEllipsis (get_current_line_type lexbuf) )
-# 1564 "lexer_cocci.ml"
+# 1576 "lexer_cocci.ml"
 
   | 13 ->
-# 561 "lexer_cocci.mll"
+# 573 "lexer_cocci.mll"
             ( start_line true; check_minus_context_linetype (tok lexbuf);
             TPCEllipsis (get_current_line_type lexbuf) )
-# 1570 "lexer_cocci.ml"
+# 1582 "lexer_cocci.ml"
 
   | 14 ->
-# 574 "lexer_cocci.mll"
+# 586 "lexer_cocci.mll"
         ( pass_zero();
          if !current_line_started
          then (start_line true; TMinus (get_current_line_type lexbuf))
           else (patch_or_match PATCH;
                add_current_line_type D.MINUS; token lexbuf) )
-# 1579 "lexer_cocci.ml"
+# 1591 "lexer_cocci.ml"
 
   | 15 ->
-# 579 "lexer_cocci.mll"
+# 591 "lexer_cocci.mll"
         ( pass_zero();
          if !current_line_started
          then (start_line true; TPlus (get_current_line_type lexbuf))
@@ -1586,118 +1598,118 @@ let
          then TPlus0
           else (patch_or_match PATCH;
                add_current_line_type D.PLUS; token lexbuf) )
-# 1590 "lexer_cocci.ml"
+# 1602 "lexer_cocci.ml"
 
   | 16 ->
-# 586 "lexer_cocci.mll"
+# 598 "lexer_cocci.mll"
         ( pass_zero();
          if !current_line_started
          then (start_line true; TWhy (get_current_line_type lexbuf))
           else if !Data.in_meta
          then TWhy0
           else (add_current_line_type D.OPT; token lexbuf) )
-# 1600 "lexer_cocci.ml"
+# 1612 "lexer_cocci.ml"
 
   | 17 ->
-# 592 "lexer_cocci.mll"
+# 604 "lexer_cocci.mll"
         ( pass_zero();
          if !current_line_started
          then (start_line true; TBang (get_current_line_type lexbuf))
           else if !Data.in_meta
          then TBang0
           else (add_current_line_type D.UNIQUE; token lexbuf) )
-# 1610 "lexer_cocci.ml"
+# 1622 "lexer_cocci.ml"
 
   | 18 ->
-# 598 "lexer_cocci.mll"
+# 610 "lexer_cocci.mll"
         ( if !Data.in_meta or not !col_zero
          then (start_line true; TOPar (get_current_line_type lexbuf))
           else
             (start_line true; check_context_linetype (tok lexbuf);
             TOPar0 (get_current_line_type lexbuf)))
-# 1619 "lexer_cocci.ml"
+# 1631 "lexer_cocci.ml"
 
   | 19 ->
-# 603 "lexer_cocci.mll"
+# 615 "lexer_cocci.mll"
           ( start_line true;
            TOPar0 (contextify(get_current_line_type lexbuf)) )
-# 1625 "lexer_cocci.ml"
+# 1637 "lexer_cocci.ml"
 
   | 20 ->
-# 605 "lexer_cocci.mll"
+# 617 "lexer_cocci.mll"
         ( if not (!col_zero)
          then (start_line true; TOr(get_current_line_type lexbuf))
           else (start_line true;
                check_context_linetype (tok lexbuf);
                TMid0 (get_current_line_type lexbuf)))
-# 1634 "lexer_cocci.ml"
+# 1646 "lexer_cocci.ml"
 
   | 21 ->
-# 610 "lexer_cocci.mll"
+# 622 "lexer_cocci.mll"
           ( start_line true;
            TMid0 (contextify(get_current_line_type lexbuf)) )
-# 1640 "lexer_cocci.ml"
+# 1652 "lexer_cocci.ml"
 
   | 22 ->
-# 612 "lexer_cocci.mll"
+# 624 "lexer_cocci.mll"
         ( if not !col_zero
          then (start_line true; TCPar (get_current_line_type lexbuf))
           else
             (start_line true; check_context_linetype (tok lexbuf);
             TCPar0 (get_current_line_type lexbuf)))
-# 1649 "lexer_cocci.ml"
+# 1661 "lexer_cocci.ml"
 
   | 23 ->
-# 617 "lexer_cocci.mll"
+# 629 "lexer_cocci.mll"
           ( start_line true;
            TCPar0 (contextify(get_current_line_type lexbuf)) )
-# 1655 "lexer_cocci.ml"
+# 1667 "lexer_cocci.ml"
 
   | 24 ->
-# 620 "lexer_cocci.mll"
+# 632 "lexer_cocci.mll"
         ( start_line true; TOCro (get_current_line_type lexbuf)   )
-# 1660 "lexer_cocci.ml"
+# 1672 "lexer_cocci.ml"
 
   | 25 ->
-# 621 "lexer_cocci.mll"
+# 633 "lexer_cocci.mll"
         ( start_line true; TCCro (get_current_line_type lexbuf)   )
-# 1665 "lexer_cocci.ml"
+# 1677 "lexer_cocci.ml"
 
   | 26 ->
-# 622 "lexer_cocci.mll"
+# 634 "lexer_cocci.mll"
         ( start_line true; TOBrace (get_current_line_type lexbuf) )
-# 1670 "lexer_cocci.ml"
+# 1682 "lexer_cocci.ml"
 
   | 27 ->
-# 623 "lexer_cocci.mll"
+# 635 "lexer_cocci.mll"
         ( start_line true; TCBrace (get_current_line_type lexbuf) )
-# 1675 "lexer_cocci.ml"
+# 1687 "lexer_cocci.ml"
 
   | 28 ->
-# 625 "lexer_cocci.mll"
+# 637 "lexer_cocci.mll"
                    ( start_line true; TPtrOp (get_current_line_type lexbuf)  )
-# 1680 "lexer_cocci.ml"
+# 1692 "lexer_cocci.ml"
 
   | 29 ->
-# 626 "lexer_cocci.mll"
+# 638 "lexer_cocci.mll"
                    ( start_line true; TDot (get_current_line_type lexbuf)    )
-# 1685 "lexer_cocci.ml"
+# 1697 "lexer_cocci.ml"
 
   | 30 ->
-# 627 "lexer_cocci.mll"
+# 639 "lexer_cocci.mll"
                    ( start_line true; TComma (get_current_line_type lexbuf)  )
-# 1690 "lexer_cocci.ml"
+# 1702 "lexer_cocci.ml"
 
   | 31 ->
-# 628 "lexer_cocci.mll"
+# 640 "lexer_cocci.mll"
                    ( start_line true;
                     if !Data.in_meta
                     then TMPtVirg (* works better with tokens_all *)
                     else TPtVirg (get_current_line_type lexbuf) )
-# 1698 "lexer_cocci.ml"
+# 1710 "lexer_cocci.ml"
 
   | 32 ->
-# 634 "lexer_cocci.mll"
+# 646 "lexer_cocci.mll"
                    ( pass_zero();
                     if !current_line_started
                     then
@@ -1705,185 +1717,185 @@ let
                     else
                       (patch_or_match MATCH;
                        add_current_line_type D.MINUS; token lexbuf) )
-# 1709 "lexer_cocci.ml"
+# 1721 "lexer_cocci.ml"
 
   | 33 ->
-# 641 "lexer_cocci.mll"
+# 653 "lexer_cocci.mll"
                    ( start_line true;
                     TDmOp (Ast.Div,get_current_line_type lexbuf) )
-# 1715 "lexer_cocci.ml"
+# 1727 "lexer_cocci.ml"
 
   | 34 ->
-# 643 "lexer_cocci.mll"
+# 655 "lexer_cocci.mll"
                    ( start_line true;
                     TDmOp (Ast.Mod,get_current_line_type lexbuf) )
-# 1721 "lexer_cocci.ml"
+# 1733 "lexer_cocci.ml"
 
   | 35 ->
-# 645 "lexer_cocci.mll"
+# 657 "lexer_cocci.mll"
                    ( start_line true;  TTilde (get_current_line_type lexbuf) )
-# 1726 "lexer_cocci.ml"
+# 1738 "lexer_cocci.ml"
 
   | 36 ->
-# 647 "lexer_cocci.mll"
+# 659 "lexer_cocci.mll"
                    ( pass_zero();
                     if !current_line_started
                     then
                       (start_line true; TInc (get_current_line_type lexbuf))
                     else (patch_or_match PATCH;
                           add_current_line_type D.PLUSPLUS; token lexbuf) )
-# 1736 "lexer_cocci.ml"
+# 1748 "lexer_cocci.ml"
 
   | 37 ->
-# 653 "lexer_cocci.mll"
+# 665 "lexer_cocci.mll"
                    ( start_line true;  TDec (get_current_line_type lexbuf) )
-# 1741 "lexer_cocci.ml"
+# 1753 "lexer_cocci.ml"
 
   | 38 ->
-# 655 "lexer_cocci.mll"
+# 667 "lexer_cocci.mll"
                    ( start_line true; TEq (get_current_line_type lexbuf) )
-# 1746 "lexer_cocci.ml"
+# 1758 "lexer_cocci.ml"
 
   | 39 ->
-# 657 "lexer_cocci.mll"
+# 669 "lexer_cocci.mll"
                    ( start_line true; mkassign Ast.Minus lexbuf )
-# 1751 "lexer_cocci.ml"
+# 1763 "lexer_cocci.ml"
 
   | 40 ->
-# 658 "lexer_cocci.mll"
+# 670 "lexer_cocci.mll"
                    ( start_line true; mkassign Ast.Plus lexbuf )
-# 1756 "lexer_cocci.ml"
+# 1768 "lexer_cocci.ml"
 
   | 41 ->
-# 660 "lexer_cocci.mll"
+# 672 "lexer_cocci.mll"
                    ( start_line true; mkassign Ast.Mul lexbuf )
-# 1761 "lexer_cocci.ml"
+# 1773 "lexer_cocci.ml"
 
   | 42 ->
-# 661 "lexer_cocci.mll"
+# 673 "lexer_cocci.mll"
                    ( start_line true; mkassign Ast.Div lexbuf )
-# 1766 "lexer_cocci.ml"
+# 1778 "lexer_cocci.ml"
 
   | 43 ->
-# 662 "lexer_cocci.mll"
+# 674 "lexer_cocci.mll"
                    ( start_line true; mkassign Ast.Mod lexbuf )
-# 1771 "lexer_cocci.ml"
+# 1783 "lexer_cocci.ml"
 
   | 44 ->
-# 664 "lexer_cocci.mll"
+# 676 "lexer_cocci.mll"
                    ( start_line true; mkassign Ast.And lexbuf )
-# 1776 "lexer_cocci.ml"
+# 1788 "lexer_cocci.ml"
 
   | 45 ->
-# 665 "lexer_cocci.mll"
+# 677 "lexer_cocci.mll"
                    ( start_line true; mkassign Ast.Or lexbuf )
-# 1781 "lexer_cocci.ml"
+# 1793 "lexer_cocci.ml"
 
   | 46 ->
-# 666 "lexer_cocci.mll"
+# 678 "lexer_cocci.mll"
                    ( start_line true; mkassign Ast.Xor lexbuf )
-# 1786 "lexer_cocci.ml"
+# 1798 "lexer_cocci.ml"
 
   | 47 ->
-# 668 "lexer_cocci.mll"
+# 680 "lexer_cocci.mll"
                    ( start_line true; mkassign Ast.DecLeft lexbuf )
-# 1791 "lexer_cocci.ml"
+# 1803 "lexer_cocci.ml"
 
   | 48 ->
-# 669 "lexer_cocci.mll"
+# 681 "lexer_cocci.mll"
                    ( start_line true; mkassign Ast.DecRight lexbuf )
-# 1796 "lexer_cocci.ml"
+# 1808 "lexer_cocci.ml"
 
   | 49 ->
-# 671 "lexer_cocci.mll"
+# 683 "lexer_cocci.mll"
                    ( start_line true; TDotDot (get_current_line_type lexbuf) )
-# 1801 "lexer_cocci.ml"
+# 1813 "lexer_cocci.ml"
 
   | 50 ->
-# 673 "lexer_cocci.mll"
+# 685 "lexer_cocci.mll"
                    ( start_line true; TEqEq    (get_current_line_type lexbuf) )
-# 1806 "lexer_cocci.ml"
+# 1818 "lexer_cocci.ml"
 
   | 51 ->
-# 674 "lexer_cocci.mll"
+# 686 "lexer_cocci.mll"
                    ( start_line true; TNotEq   (get_current_line_type lexbuf) )
-# 1811 "lexer_cocci.ml"
+# 1823 "lexer_cocci.ml"
 
   | 52 ->
-# 675 "lexer_cocci.mll"
+# 687 "lexer_cocci.mll"
                    ( start_line true;
                     TLogOp(Ast.SupEq,get_current_line_type lexbuf) )
-# 1817 "lexer_cocci.ml"
+# 1829 "lexer_cocci.ml"
 
   | 53 ->
-# 677 "lexer_cocci.mll"
+# 689 "lexer_cocci.mll"
                    ( start_line true;
                     if !Data.in_meta
                     then TSub(get_current_line_type lexbuf)
                     else TLogOp(Ast.InfEq,get_current_line_type lexbuf) )
-# 1825 "lexer_cocci.ml"
+# 1837 "lexer_cocci.ml"
 
   | 54 ->
-# 681 "lexer_cocci.mll"
+# 693 "lexer_cocci.mll"
                    ( start_line true;
                     TLogOp(Ast.Inf,get_current_line_type lexbuf) )
-# 1831 "lexer_cocci.ml"
+# 1843 "lexer_cocci.ml"
 
   | 55 ->
-# 683 "lexer_cocci.mll"
+# 695 "lexer_cocci.mll"
                    ( start_line true;
                     TLogOp(Ast.Sup,get_current_line_type lexbuf) )
-# 1837 "lexer_cocci.ml"
+# 1849 "lexer_cocci.ml"
 
   | 56 ->
-# 686 "lexer_cocci.mll"
+# 698 "lexer_cocci.mll"
                    ( start_line true; TAndLog (get_current_line_type lexbuf) )
-# 1842 "lexer_cocci.ml"
+# 1854 "lexer_cocci.ml"
 
   | 57 ->
-# 687 "lexer_cocci.mll"
+# 699 "lexer_cocci.mll"
                    ( start_line true; TOrLog  (get_current_line_type lexbuf) )
-# 1847 "lexer_cocci.ml"
+# 1859 "lexer_cocci.ml"
 
   | 58 ->
-# 689 "lexer_cocci.mll"
+# 701 "lexer_cocci.mll"
                    ( start_line true;
                     TShROp(Ast.DecRight,get_current_line_type lexbuf) )
-# 1853 "lexer_cocci.ml"
+# 1865 "lexer_cocci.ml"
 
   | 59 ->
-# 691 "lexer_cocci.mll"
+# 703 "lexer_cocci.mll"
                    ( start_line true;
                     TShLOp(Ast.DecLeft,get_current_line_type lexbuf) )
-# 1859 "lexer_cocci.ml"
+# 1871 "lexer_cocci.ml"
 
   | 60 ->
-# 694 "lexer_cocci.mll"
+# 706 "lexer_cocci.mll"
                    ( start_line true; TAnd    (get_current_line_type lexbuf) )
-# 1864 "lexer_cocci.ml"
+# 1876 "lexer_cocci.ml"
 
   | 61 ->
-# 695 "lexer_cocci.mll"
+# 707 "lexer_cocci.mll"
                    ( start_line true; TXor(get_current_line_type lexbuf) )
-# 1869 "lexer_cocci.ml"
+# 1881 "lexer_cocci.ml"
 
   | 62 ->
-# 697 "lexer_cocci.mll"
+# 709 "lexer_cocci.mll"
                     ( start_line true; TCppConcatOp )
-# 1874 "lexer_cocci.ml"
+# 1886 "lexer_cocci.ml"
 
   | 63 ->
 let
-# 698 "lexer_cocci.mll"
+# 710 "lexer_cocci.mll"
                                                   def
-# 1880 "lexer_cocci.ml"
+# 1892 "lexer_cocci.ml"
 = Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos lexbuf.Lexing.lex_mem.(0)
 and
-# 699 "lexer_cocci.mll"
+# 711 "lexer_cocci.mll"
                                    ident
-# 1885 "lexer_cocci.ml"
+# 1897 "lexer_cocci.ml"
 = Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_mem.(0) lexbuf.Lexing.lex_curr_pos in
-# 700 "lexer_cocci.mll"
+# 712 "lexer_cocci.mll"
       ( start_line true;
        let (arity,line,lline,offset,col,strbef,straft,pos) as lt =
          get_current_line_type lexbuf in
@@ -1893,20 +1905,20 @@ and
          (lt,
           check_var ident
             (arity,line,lline,offset+off,col+off,[],[],[])) )
-# 1897 "lexer_cocci.ml"
+# 1909 "lexer_cocci.ml"
 
   | 64 ->
 let
-# 709 "lexer_cocci.mll"
+# 721 "lexer_cocci.mll"
                                                    def
-# 1903 "lexer_cocci.ml"
+# 1915 "lexer_cocci.ml"
 = Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos lexbuf.Lexing.lex_mem.(0)
 and
-# 710 "lexer_cocci.mll"
+# 722 "lexer_cocci.mll"
                                    ident
-# 1908 "lexer_cocci.ml"
+# 1920 "lexer_cocci.ml"
 = Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_mem.(0) lexbuf.Lexing.lex_curr_pos in
-# 711 "lexer_cocci.mll"
+# 723 "lexer_cocci.mll"
       ( start_line true;
        let (arity,line,lline,offset,col,strbef,straft,pos) as lt =
          get_current_line_type lexbuf in
@@ -1916,20 +1928,20 @@ and
          (lt,
           check_var ident
             (arity,line,lline,offset+off,col+off,[],[],[])) )
-# 1920 "lexer_cocci.ml"
+# 1932 "lexer_cocci.ml"
 
   | 65 ->
 let
-# 720 "lexer_cocci.mll"
+# 732 "lexer_cocci.mll"
                                                    def
-# 1926 "lexer_cocci.ml"
+# 1938 "lexer_cocci.ml"
 = Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos lexbuf.Lexing.lex_mem.(0)
 and
-# 721 "lexer_cocci.mll"
+# 733 "lexer_cocci.mll"
                                     ident
-# 1931 "lexer_cocci.ml"
+# 1943 "lexer_cocci.ml"
 = Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_mem.(0) (lexbuf.Lexing.lex_curr_pos + -1) in
-# 723 "lexer_cocci.mll"
+# 735 "lexer_cocci.mll"
       ( start_line true;
        let (arity,line,lline,offset,col,strbef,straft,pos) as lt =
          get_current_line_type lexbuf in
@@ -1941,36 +1953,36 @@ and
           (arity,line,lline,offset+off,col+off,strbef,straft,pos),
         offset + off + (String.length ident),
         col + off + (String.length ident)) )
-# 1945 "lexer_cocci.ml"
+# 1957 "lexer_cocci.ml"
 
   | 66 ->
-# 735 "lexer_cocci.mll"
+# 747 "lexer_cocci.mll"
       ( TIncludeL
          (let str = tok lexbuf in
          let start = String.index str '"' in
          let finish = String.rindex str '"' in
          start_line true;
          (process_include start finish str,get_current_line_type lexbuf)) )
-# 1955 "lexer_cocci.ml"
+# 1967 "lexer_cocci.ml"
 
   | 67 ->
-# 742 "lexer_cocci.mll"
+# 754 "lexer_cocci.mll"
       ( TIncludeNL
          (let str = tok lexbuf in
          let start = String.index str '<' in
          let finish = String.rindex str '>' in
          start_line true;
          (process_include start finish str,get_current_line_type lexbuf)) )
-# 1965 "lexer_cocci.ml"
+# 1977 "lexer_cocci.ml"
 
   | 68 ->
-# 757 "lexer_cocci.mll"
+# 769 "lexer_cocci.mll"
       ( start_line true; check_plus_linetype (tok lexbuf);
        TPragma (Ast.Noindent(tok lexbuf), get_current_line_type lexbuf) )
-# 1971 "lexer_cocci.ml"
+# 1983 "lexer_cocci.ml"
 
   | 69 ->
-# 760 "lexer_cocci.mll"
+# 772 "lexer_cocci.mll"
       (
        match !current_line_type with
         (D.PLUS,_,_) | (D.PLUSPLUS,_,_) ->
@@ -1981,10 +1993,10 @@ and
        TPragma (Ast.Indent("/*"^(comment check_comment lexbuf)),
                 get_current_line_type lexbuf)
       |        _ -> let _ = comment (fun _ -> ()) lexbuf in token lexbuf )
-# 1985 "lexer_cocci.ml"
+# 1997 "lexer_cocci.ml"
 
   | 70 ->
-# 771 "lexer_cocci.mll"
+# 783 "lexer_cocci.mll"
       ( (if !current_line_started
       then lexerr "--- must be at the beginning of the line" "");
        start_line true;
@@ -1992,10 +2004,10 @@ and
          (let str = tok lexbuf in
          (drop_spaces(String.sub str 3 (String.length str - 3)),
           (get_current_line_type lexbuf))) )
-# 1996 "lexer_cocci.ml"
+# 2008 "lexer_cocci.ml"
 
   | 71 ->
-# 779 "lexer_cocci.mll"
+# 791 "lexer_cocci.mll"
       ( (if !current_line_started
       then lexerr "+++ must be at the beginning of the line" "");
        start_line true;
@@ -2003,65 +2015,65 @@ and
          (let str = tok lexbuf in
          (drop_spaces(String.sub str 3 (String.length str - 3)),
           (get_current_line_type lexbuf))) )
-# 2007 "lexer_cocci.ml"
+# 2019 "lexer_cocci.ml"
 
   | 72 ->
-# 788 "lexer_cocci.mll"
+# 800 "lexer_cocci.mll"
       ( start_line true; id_tokens lexbuf )
-# 2012 "lexer_cocci.ml"
+# 2024 "lexer_cocci.ml"
 
   | 73 ->
-# 790 "lexer_cocci.mll"
+# 802 "lexer_cocci.mll"
         ( start_line true;
          TChar(char lexbuf,get_current_line_type lexbuf) )
-# 2018 "lexer_cocci.ml"
+# 2030 "lexer_cocci.ml"
 
   | 74 ->
-# 792 "lexer_cocci.mll"
+# 804 "lexer_cocci.mll"
         ( start_line true;
          TString(string lexbuf,(get_current_line_type lexbuf)) )
-# 2024 "lexer_cocci.ml"
+# 2036 "lexer_cocci.ml"
 
   | 75 ->
 let
-# 794 "lexer_cocci.mll"
+# 806 "lexer_cocci.mll"
              x
-# 2030 "lexer_cocci.ml"
+# 2042 "lexer_cocci.ml"
 = Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos lexbuf.Lexing.lex_curr_pos in
-# 794 "lexer_cocci.mll"
+# 806 "lexer_cocci.mll"
                    ( start_line true;
                     TFloat(x,(get_current_line_type lexbuf)) )
-# 2035 "lexer_cocci.ml"
+# 2047 "lexer_cocci.ml"
 
   | 76 ->
 let
-# 804 "lexer_cocci.mll"
+# 816 "lexer_cocci.mll"
          x
-# 2041 "lexer_cocci.ml"
+# 2053 "lexer_cocci.ml"
 = Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos lexbuf.Lexing.lex_curr_pos in
-# 804 "lexer_cocci.mll"
+# 816 "lexer_cocci.mll"
             ( start_line true; TInt(x,(get_current_line_type lexbuf)) )
-# 2045 "lexer_cocci.ml"
+# 2057 "lexer_cocci.ml"
 
   | 77 ->
-# 806 "lexer_cocci.mll"
+# 818 "lexer_cocci.mll"
                    ( TIso )
-# 2050 "lexer_cocci.ml"
+# 2062 "lexer_cocci.ml"
 
   | 78 ->
-# 807 "lexer_cocci.mll"
+# 819 "lexer_cocci.mll"
                    ( TRightIso )
-# 2055 "lexer_cocci.ml"
+# 2067 "lexer_cocci.ml"
 
   | 79 ->
-# 809 "lexer_cocci.mll"
+# 821 "lexer_cocci.mll"
                    ( EOF )
-# 2060 "lexer_cocci.ml"
+# 2072 "lexer_cocci.ml"
 
   | 80 ->
-# 811 "lexer_cocci.mll"
+# 823 "lexer_cocci.mll"
       ( lexerr "unrecognised symbol, in token rule: " (tok lexbuf) )
-# 2065 "lexer_cocci.ml"
+# 2077 "lexer_cocci.ml"
 
   | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; __ocaml_lex_token_rec lexbuf __ocaml_lex_state
 
@@ -2071,46 +2083,46 @@ and __ocaml_lex_char_rec lexbuf __ocaml_lex_state =
   match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with
       | 0 ->
 let
-# 815 "lexer_cocci.mll"
+# 827 "lexer_cocci.mll"
           x
-# 2077 "lexer_cocci.ml"
+# 2089 "lexer_cocci.ml"
 = Lexing.sub_lexeme_char lexbuf lexbuf.Lexing.lex_start_pos in
-# 815 "lexer_cocci.mll"
+# 827 "lexer_cocci.mll"
                                        ( String.make 1 x ^ restchars lexbuf )
-# 2081 "lexer_cocci.ml"
+# 2093 "lexer_cocci.ml"
 
   | 1 ->
 let
-# 817 "lexer_cocci.mll"
+# 829 "lexer_cocci.mll"
                                              x
-# 2087 "lexer_cocci.ml"
+# 2099 "lexer_cocci.ml"
 = Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos lexbuf.Lexing.lex_curr_pos in
-# 817 "lexer_cocci.mll"
+# 829 "lexer_cocci.mll"
                                                      ( x ^ restchars lexbuf )
-# 2091 "lexer_cocci.ml"
+# 2103 "lexer_cocci.ml"
 
   | 2 ->
 let
-# 821 "lexer_cocci.mll"
+# 833 "lexer_cocci.mll"
                                   x
-# 2097 "lexer_cocci.ml"
+# 2109 "lexer_cocci.ml"
 = Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos lexbuf.Lexing.lex_curr_pos in
-# 821 "lexer_cocci.mll"
+# 833 "lexer_cocci.mll"
                                                      ( x ^ restchars lexbuf )
-# 2101 "lexer_cocci.ml"
+# 2113 "lexer_cocci.ml"
 
   | 3 ->
 let
-# 822 "lexer_cocci.mll"
+# 834 "lexer_cocci.mll"
                  v
-# 2107 "lexer_cocci.ml"
+# 2119 "lexer_cocci.ml"
 = Lexing.sub_lexeme_char lexbuf (lexbuf.Lexing.lex_start_pos + 1)
 and
-# 822 "lexer_cocci.mll"
+# 834 "lexer_cocci.mll"
                                   x
-# 2112 "lexer_cocci.ml"
+# 2124 "lexer_cocci.ml"
 = Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos (lexbuf.Lexing.lex_start_pos + 2) in
-# 823 "lexer_cocci.mll"
+# 835 "lexer_cocci.mll"
  (
           (match v with (* Machine specific ? *)
           | 'n' -> ()  | 't' -> ()   | 'v' -> ()  | 'b' -> () | 'r' -> ()
@@ -2122,14 +2134,14 @@ and
          );
           x ^ restchars lexbuf
        )
-# 2126 "lexer_cocci.ml"
+# 2138 "lexer_cocci.ml"
 
   | 4 ->
-# 835 "lexer_cocci.mll"
+# 847 "lexer_cocci.mll"
       ( Common.pr2 ("LEXER: unrecognised symbol in char:"^tok lexbuf);
         tok lexbuf ^ restchars lexbuf
       )
-# 2133 "lexer_cocci.ml"
+# 2145 "lexer_cocci.ml"
 
   | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; __ocaml_lex_char_rec lexbuf __ocaml_lex_state
 
@@ -2138,52 +2150,52 @@ and restchars lexbuf =
 and __ocaml_lex_restchars_rec lexbuf __ocaml_lex_state =
   match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with
       | 0 ->
-# 840 "lexer_cocci.mll"
+# 852 "lexer_cocci.mll"
                                        ( "" )
-# 2144 "lexer_cocci.ml"
+# 2156 "lexer_cocci.ml"
 
   | 1 ->
 let
-# 841 "lexer_cocci.mll"
+# 853 "lexer_cocci.mll"
           x
-# 2150 "lexer_cocci.ml"
+# 2162 "lexer_cocci.ml"
 = Lexing.sub_lexeme_char lexbuf lexbuf.Lexing.lex_start_pos in
-# 841 "lexer_cocci.mll"
+# 853 "lexer_cocci.mll"
                                        ( String.make 1 x ^ restchars lexbuf )
-# 2154 "lexer_cocci.ml"
+# 2166 "lexer_cocci.ml"
 
   | 2 ->
 let
-# 843 "lexer_cocci.mll"
+# 855 "lexer_cocci.mll"
                                              x
-# 2160 "lexer_cocci.ml"
+# 2172 "lexer_cocci.ml"
 = Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos lexbuf.Lexing.lex_curr_pos in
-# 843 "lexer_cocci.mll"
+# 855 "lexer_cocci.mll"
                                                      ( x ^ restchars lexbuf )
-# 2164 "lexer_cocci.ml"
+# 2176 "lexer_cocci.ml"
 
   | 3 ->
 let
-# 847 "lexer_cocci.mll"
+# 859 "lexer_cocci.mll"
                                   x
-# 2170 "lexer_cocci.ml"
+# 2182 "lexer_cocci.ml"
 = Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos lexbuf.Lexing.lex_curr_pos in
-# 847 "lexer_cocci.mll"
+# 859 "lexer_cocci.mll"
                                                      ( x ^ restchars lexbuf )
-# 2174 "lexer_cocci.ml"
+# 2186 "lexer_cocci.ml"
 
   | 4 ->
 let
-# 848 "lexer_cocci.mll"
+# 860 "lexer_cocci.mll"
                  v
-# 2180 "lexer_cocci.ml"
+# 2192 "lexer_cocci.ml"
 = Lexing.sub_lexeme_char lexbuf (lexbuf.Lexing.lex_start_pos + 1)
 and
-# 848 "lexer_cocci.mll"
+# 860 "lexer_cocci.mll"
                                   x
-# 2185 "lexer_cocci.ml"
+# 2197 "lexer_cocci.ml"
 = Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos (lexbuf.Lexing.lex_start_pos + 2) in
-# 849 "lexer_cocci.mll"
+# 861 "lexer_cocci.mll"
  (
           (match v with (* Machine specific ? *)
           | 'n' -> ()  | 't' -> ()   | 'v' -> ()  | 'b' -> () | 'r' -> ()
@@ -2195,14 +2207,14 @@ and
          );
           x ^ restchars lexbuf
        )
-# 2199 "lexer_cocci.ml"
+# 2211 "lexer_cocci.ml"
 
   | 5 ->
-# 861 "lexer_cocci.mll"
+# 873 "lexer_cocci.mll"
       ( Common.pr2 ("LEXER: unrecognised symbol in char:"^tok lexbuf);
         tok lexbuf ^ restchars lexbuf
       )
-# 2206 "lexer_cocci.ml"
+# 2218 "lexer_cocci.ml"
 
   | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; __ocaml_lex_restchars_rec lexbuf __ocaml_lex_state
 
@@ -2211,52 +2223,52 @@ and string lexbuf =
 and __ocaml_lex_string_rec lexbuf __ocaml_lex_state =
   match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with
       | 0 ->
-# 866 "lexer_cocci.mll"
+# 878 "lexer_cocci.mll"
                                               ( "" )
-# 2217 "lexer_cocci.ml"
+# 2229 "lexer_cocci.ml"
 
   | 1 ->
 let
-# 867 "lexer_cocci.mll"
+# 879 "lexer_cocci.mll"
           x
-# 2223 "lexer_cocci.ml"
+# 2235 "lexer_cocci.ml"
 = Lexing.sub_lexeme_char lexbuf lexbuf.Lexing.lex_start_pos in
-# 867 "lexer_cocci.mll"
+# 879 "lexer_cocci.mll"
                                ( Common.string_of_char x ^ string lexbuf )
-# 2227 "lexer_cocci.ml"
+# 2239 "lexer_cocci.ml"
 
   | 2 ->
 let
-# 868 "lexer_cocci.mll"
+# 880 "lexer_cocci.mll"
                                             x
-# 2233 "lexer_cocci.ml"
+# 2245 "lexer_cocci.ml"
 = Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos lexbuf.Lexing.lex_curr_pos in
-# 868 "lexer_cocci.mll"
+# 880 "lexer_cocci.mll"
                                               ( x ^ string lexbuf )
-# 2237 "lexer_cocci.ml"
+# 2249 "lexer_cocci.ml"
 
   | 3 ->
 let
-# 869 "lexer_cocci.mll"
+# 881 "lexer_cocci.mll"
                                x
-# 2243 "lexer_cocci.ml"
+# 2255 "lexer_cocci.ml"
 = Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos lexbuf.Lexing.lex_curr_pos in
-# 869 "lexer_cocci.mll"
+# 881 "lexer_cocci.mll"
                                               ( x ^ string lexbuf )
-# 2247 "lexer_cocci.ml"
+# 2259 "lexer_cocci.ml"
 
   | 4 ->
 let
-# 870 "lexer_cocci.mll"
+# 882 "lexer_cocci.mll"
                 v
-# 2253 "lexer_cocci.ml"
+# 2265 "lexer_cocci.ml"
 = Lexing.sub_lexeme_char lexbuf (lexbuf.Lexing.lex_start_pos + 1)
 and
-# 870 "lexer_cocci.mll"
+# 882 "lexer_cocci.mll"
                        x
-# 2258 "lexer_cocci.ml"
+# 2270 "lexer_cocci.ml"
 = Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos (lexbuf.Lexing.lex_start_pos + 2) in
-# 871 "lexer_cocci.mll"
+# 883 "lexer_cocci.mll"
        (
          (match v with
            | 'n' -> ()  | 't' -> ()   | 'v' -> ()  | 'b' -> () | 'r' -> ()
@@ -2269,12 +2281,12 @@ and
         );
           x ^ string lexbuf
        )
-# 2273 "lexer_cocci.ml"
+# 2285 "lexer_cocci.ml"
 
   | 5 ->
-# 883 "lexer_cocci.mll"
+# 895 "lexer_cocci.mll"
       ( lexerr "unrecognised symbol: " (tok lexbuf) )
-# 2278 "lexer_cocci.ml"
+# 2290 "lexer_cocci.ml"
 
   | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; __ocaml_lex_string_rec lexbuf __ocaml_lex_state
 
@@ -2283,46 +2295,46 @@ and comment check_comment lexbuf =
 and __ocaml_lex_comment_rec check_comment lexbuf __ocaml_lex_state =
   match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with
       | 0 ->
-# 886 "lexer_cocci.mll"
+# 898 "lexer_cocci.mll"
          ( let s = tok lexbuf in check_comment s; start_line true; s )
-# 2289 "lexer_cocci.ml"
+# 2301 "lexer_cocci.ml"
 
   | 1 ->
-# 888 "lexer_cocci.mll"
+# 900 "lexer_cocci.mll"
       ( let s = tok lexbuf in
         (* even blank line should have a + *)
         check_comment s;
         reset_line lexbuf; s ^ comment check_comment lexbuf )
-# 2297 "lexer_cocci.ml"
+# 2309 "lexer_cocci.ml"
 
   | 2 ->
-# 892 "lexer_cocci.mll"
+# 904 "lexer_cocci.mll"
         ( pass_zero();
          if !current_line_started
          then (start_line true;
                let s = tok lexbuf in s^(comment check_comment lexbuf))
          else (start_line true; comment check_comment lexbuf) )
-# 2306 "lexer_cocci.ml"
+# 2318 "lexer_cocci.ml"
 
   | 3 ->
-# 899 "lexer_cocci.mll"
+# 911 "lexer_cocci.mll"
       ( let s = tok lexbuf in
         check_comment s; start_line true; s ^ comment check_comment lexbuf )
-# 2312 "lexer_cocci.ml"
+# 2324 "lexer_cocci.ml"
 
   | 4 ->
-# 902 "lexer_cocci.mll"
+# 914 "lexer_cocci.mll"
       ( let s = tok lexbuf in
         check_comment s; start_line true; s ^ comment check_comment lexbuf )
-# 2318 "lexer_cocci.ml"
+# 2330 "lexer_cocci.ml"
 
   | 5 ->
-# 905 "lexer_cocci.mll"
+# 917 "lexer_cocci.mll"
       ( start_line true; let s = tok lexbuf in
         Common.pr2 ("LEXER: unrecognised symbol in comment:"^s);
         s ^ comment check_comment lexbuf
       )
-# 2326 "lexer_cocci.ml"
+# 2338 "lexer_cocci.ml"
 
   | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; __ocaml_lex_comment_rec check_comment lexbuf __ocaml_lex_state
 
index 132d7f2..10aad7c 100644 (file)
  *)
 
 
+# 0 "./lexer_cocci.mll"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./lexer_cocci.mll"
 {
 open Parser_cocci_menhir
@@ -31,6 +58,7 @@ module D = Data
 module Ast = Ast_cocci
 module Ast0 = Ast0_cocci
 module P = Parse_aux
+module FC = Flag_parsing_cocci
 exception Lexical of string
 let tok = Lexing.lexeme
 
@@ -85,8 +113,19 @@ let pass_zero _ = col_zero := false
 
 let lexerr s1 s2 = raise (Lexical (Printf.sprintf "%s%s" s1 s2))
 
+let opt_reverse_token token =
+  if !FC.interpret_inverted
+  then match token with
+         D.MINUS        -> D.PLUSPLUS  (* maybe too liberal *)
+       | D.OPTMINUS     -> lexerr "cannot invert token ?- (an optional minus line), which is needed for reversing the patch" ""  
+       | D.UNIQUEMINUS  -> D.PLUS
+       | D.PLUS         -> D.MINUS
+       | D.PLUSPLUS     -> D.MINUS (* may not be sufficient *)
+       | _              -> token
+  else token
+
 let add_current_line_type x =
-  match (x,!current_line_type) with
+  match (opt_reverse_token x,!current_line_type) with
     (D.MINUS,(D.CONTEXT,ln,lln))  ->
       current_line_type := (D.MINUS,ln,lln)
   | (D.MINUS,(D.UNIQUE,ln,lln))   ->
index afe4cb5..ed8ccf9 100644 (file)
@@ -5,9 +5,11 @@ module D = Data
 module Ast = Ast_cocci
 exception Lexical of string
 let tok = Lexing.lexeme
+let file = ref ""
+let language = ref ""
 let inc_line _ = Lexer_cocci.line := !Lexer_cocci.line + 1
 
-# 11 "lexer_script.ml"
+# 13 "lexer_script.ml"
 let __ocaml_lex_tables = {
   Lexing.lex_base = 
    "\000\000\247\255\248\255\249\255\001\000\001\000\254\255\004\000\
@@ -110,54 +112,62 @@ let rec token lexbuf =
 and __ocaml_lex_token_rec lexbuf __ocaml_lex_state =
   match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with
       | 0 ->
-# 17 "lexer_script.mll"
+# 19 "lexer_script.mll"
            ( TScriptData (tok lexbuf) )
-# 116 "lexer_script.ml"
+# 118 "lexer_script.ml"
 
   | 1 ->
-# 18 "lexer_script.mll"
-                              ( inc_line(); TScriptData (tok lexbuf) )
-# 121 "lexer_script.ml"
+# 21 "lexer_script.mll"
+      ( inc_line();
+       let text = tok lexbuf in
+       let text =
+         if !language = "ocaml"
+         then
+           Printf.sprintf "%s# %d \"%s\"%s"
+             text !Lexer_cocci.line !file text
+         else text in
+       TScriptData text )
+# 131 "lexer_script.ml"
 
   | 2 ->
-# 19 "lexer_script.mll"
+# 30 "lexer_script.mll"
          ( TArobArob )
-# 126 "lexer_script.ml"
+# 136 "lexer_script.ml"
 
   | 3 ->
-# 20 "lexer_script.mll"
+# 31 "lexer_script.mll"
          ( TArob )
-# 131 "lexer_script.ml"
+# 141 "lexer_script.ml"
 
   | 4 ->
-# 21 "lexer_script.mll"
+# 32 "lexer_script.mll"
          ( TScriptData (tok lexbuf) )
-# 136 "lexer_script.ml"
+# 146 "lexer_script.ml"
 
   | 5 ->
-# 22 "lexer_script.mll"
+# 33 "lexer_script.mll"
                    ( token lexbuf )
-# 141 "lexer_script.ml"
+# 151 "lexer_script.ml"
 
   | 6 ->
-# 23 "lexer_script.mll"
+# 34 "lexer_script.mll"
          ( TScriptData (Printf.sprintf "\"%s\"" (string lexbuf)) )
-# 146 "lexer_script.ml"
+# 156 "lexer_script.ml"
 
   | 7 ->
-# 24 "lexer_script.mll"
+# 35 "lexer_script.mll"
          ( TScriptData (Printf.sprintf "'%s'" (cstring lexbuf)) )
-# 151 "lexer_script.ml"
+# 161 "lexer_script.ml"
 
   | 8 ->
-# 25 "lexer_script.mll"
+# 36 "lexer_script.mll"
          ( EOF )
-# 156 "lexer_script.ml"
+# 166 "lexer_script.ml"
 
   | 9 ->
-# 26 "lexer_script.mll"
+# 37 "lexer_script.mll"
       ( raise (Lexical ("unrecognised symbol, in token rule:"^tok lexbuf)) )
-# 161 "lexer_script.ml"
+# 171 "lexer_script.ml"
 
   | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; __ocaml_lex_token_rec lexbuf __ocaml_lex_state
 
@@ -166,19 +176,19 @@ and string lexbuf =
 and __ocaml_lex_string_rec lexbuf __ocaml_lex_state =
   match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with
       | 0 ->
-# 30 "lexer_script.mll"
+# 41 "lexer_script.mll"
                         ( "" )
-# 172 "lexer_script.ml"
+# 182 "lexer_script.ml"
 
   | 1 ->
 let
-# 31 "lexer_script.mll"
+# 42 "lexer_script.mll"
           x
-# 178 "lexer_script.ml"
+# 188 "lexer_script.ml"
 = Lexing.sub_lexeme_char lexbuf lexbuf.Lexing.lex_start_pos in
-# 31 "lexer_script.mll"
+# 42 "lexer_script.mll"
                         ( (String.make 1 x) ^ string lexbuf )
-# 182 "lexer_script.ml"
+# 192 "lexer_script.ml"
 
   | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; __ocaml_lex_string_rec lexbuf __ocaml_lex_state
 
@@ -187,19 +197,19 @@ and cstring lexbuf =
 and __ocaml_lex_cstring_rec lexbuf __ocaml_lex_state =
   match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with
       | 0 ->
-# 34 "lexer_script.mll"
+# 45 "lexer_script.mll"
                         ( "" )
-# 193 "lexer_script.ml"
+# 203 "lexer_script.ml"
 
   | 1 ->
 let
-# 35 "lexer_script.mll"
+# 46 "lexer_script.mll"
           x
-# 199 "lexer_script.ml"
+# 209 "lexer_script.ml"
 = Lexing.sub_lexeme_char lexbuf lexbuf.Lexing.lex_start_pos in
-# 35 "lexer_script.mll"
+# 46 "lexer_script.mll"
                         ( (String.make 1 x) ^ cstring lexbuf )
-# 203 "lexer_script.ml"
+# 213 "lexer_script.ml"
 
   | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; __ocaml_lex_cstring_rec lexbuf __ocaml_lex_state
 
index b319ac6..4f411f8 100644 (file)
  *)
 
 
+# 0 "./lexer_script.mll"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./lexer_script.mll"
 {
 open Parser_cocci_menhir
@@ -31,6 +58,8 @@ module D = Data
 module Ast = Ast_cocci
 exception Lexical of string
 let tok = Lexing.lexeme
+let file = ref ""
+let language = ref ""
 let inc_line _ = Lexer_cocci.line := !Lexer_cocci.line + 1
 }
 (* ---------------------------------------------------------------------- *)
@@ -43,7 +72,16 @@ let myrule = [^'\'''"''@''/''\n''\r''\011''\012']+
 
 rule token = parse
   | myrule { TScriptData (tok lexbuf) }
-  | ['\n' '\r' '\011' '\012'] { inc_line(); TScriptData (tok lexbuf) }
+  | ['\n' '\r' '\011' '\012']
+      { inc_line();
+       let text = tok lexbuf in
+       let text =
+         if !language = "ocaml"
+         then
+           Printf.sprintf "%s# %d \"%s\"%s"
+             text !Lexer_cocci.line !file text
+         else text in
+       TScriptData text }
   | "@@" { TArobArob }
   | "@"  { TArob }
   | "/"  { TScriptData (tok lexbuf) }
index db29505..d45fa26 100644 (file)
  *)
 
 
+# 0 "./main.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./main.ml"
 (* ----------------------------------------------------------------------- *)
 (* Entry point *)
index 36e5b58..d007f12 100644 (file)
  *)
 
 
+# 0 "./merge.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./merge.ml"
 (* given parsed minus code and a stream of + code, figure out where to put
 the + code in the mcode of the minus code *)
index 3ebb0a8..6505606 100644 (file)
  *)
 
 
+# 0 "./merge.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./merge.mli"
 val do_merge :
     Ast0_cocci.rule ->
index 082d3f1..dae83bf 100644 (file)
  *)
 
 
+# 0 "./parse_aux.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./parse_aux.ml"
 (* exports everything, used only by parser_cocci_menhir.mly *)
 module Ast0 = Ast0_cocci
index 80483de..91424a1 100644 (file)
  *)
 
 
+# 0 "./parse_cocci.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./parse_cocci.ml"
 (* splits the entire file into minus and plus fragments, and parses each
 separately (thus duplicating work for the parsing of the context elements) *)
@@ -1462,6 +1489,14 @@ let rec consume_minus_positions toks =
       [] -> []
     | ((PC.TOPar0(_),_) as x)::xs | ((PC.TCPar0(_),_) as x)::xs
     | ((PC.TMid0(_),_) as x)::xs -> x::loop_other xs
+    | x::(PC.TPArob _,_)::(PC.TMetaId(name,constraints,seed,pure,clt),_)::xs ->
+       let x =
+         process_minus_positions x name clt
+           (function name ->
+             Ast0.IdentTag
+               (Ast0.wrap
+                  (Ast0.MetaId(name,constraints,seed,pure)))) in
+       (loop_other (x::xs))
     | x::(PC.TPArob _,_)::(PC.TMetaExp(name,constraints,pure,ty,clt),_)::xs ->
        let x =
          process_minus_positions x name clt
@@ -1659,11 +1694,11 @@ let parse_iso_files existing_isos iso_files extra_path =
     List.fold_left
       (function (prev,names) ->
        function file ->
-         Lexer_cocci.init ();
          let file =
            match file with
              Common.Left(fl)  -> Filename.concat extra_path fl
            | Common.Right(fl) -> Filename.concat Config.path fl in
+         Lexer_cocci.init ();
          let current = parse_iso file in
          let new_names = get_names current in
          if List.exists (function x -> List.mem x names) new_names
@@ -1708,7 +1743,7 @@ let eval_depend dep virt =
   loop dep
 
 let parse file =
-  Lexer_cocci.init();
+  Lexer_cocci.init ();
   let rec parse_loop file =
   Lexer_cocci.include_init ();
   let table = Common.full_charpos_to_pos file in
@@ -1854,6 +1889,8 @@ let parse file =
                failwith "Malformed script rule" in
 
           let parse_script_rule name language old_metas deps =
+           Lexer_script.file := file;
+           Lexer_script.language := language;
             let get_tokens = tokens_script_all table file false lexbuf in
 
               (* meta-variables *)
@@ -1907,6 +1944,8 @@ let parse file =
             [],tokens) in
 
           let parse_if_script_rule k name language _ deps =
+           Lexer_script.file := file;
+           Lexer_script.language := language;
             let get_tokens = tokens_script_all table file false lexbuf in
 
               (* script code *)
index 9d90dcb..19e33a3 100644 (file)
  *)
 
 
+# 0 "./parse_cocci.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./parse_cocci.mli"
 exception Bad_virt of string
 
index 4d26105..a7de7f5 100644 (file)
@@ -2,155 +2,155 @@ exception Error
 
 type token = 
   | Tvolatile of (
-# 122 "parser_cocci_menhir.mly"
+# 148 "parser_cocci_menhir.mly"
       (Data.clt)
 # 8 "parser_cocci_menhir.ml"
 )
   | Tvoid of (
-# 118 "parser_cocci_menhir.mly"
+# 144 "parser_cocci_menhir.mly"
       (Data.clt)
 # 13 "parser_cocci_menhir.ml"
 )
   | Tunsigned of (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
 # 18 "parser_cocci_menhir.ml"
 )
   | Tunion of (
-# 118 "parser_cocci_menhir.mly"
+# 144 "parser_cocci_menhir.mly"
       (Data.clt)
 # 23 "parser_cocci_menhir.ml"
 )
   | Ttypedef of (
-# 121 "parser_cocci_menhir.mly"
+# 147 "parser_cocci_menhir.mly"
       (Data.clt)
 # 28 "parser_cocci_menhir.ml"
 )
   | Tstruct of (
-# 118 "parser_cocci_menhir.mly"
+# 144 "parser_cocci_menhir.mly"
       (Data.clt)
 # 33 "parser_cocci_menhir.ml"
 )
   | Tstatic of (
-# 121 "parser_cocci_menhir.mly"
+# 147 "parser_cocci_menhir.mly"
       (Data.clt)
 # 38 "parser_cocci_menhir.ml"
 )
   | Tssize_t of (
-# 117 "parser_cocci_menhir.mly"
+# 143 "parser_cocci_menhir.mly"
       (Data.clt)
 # 43 "parser_cocci_menhir.ml"
 )
   | Tsize_t of (
-# 117 "parser_cocci_menhir.mly"
+# 143 "parser_cocci_menhir.mly"
       (Data.clt)
 # 48 "parser_cocci_menhir.ml"
 )
   | Tsigned of (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
 # 53 "parser_cocci_menhir.ml"
 )
   | Tshort of (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 58 "parser_cocci_menhir.ml"
 )
   | Tregister of (
-# 121 "parser_cocci_menhir.mly"
+# 147 "parser_cocci_menhir.mly"
       (Data.clt)
 # 63 "parser_cocci_menhir.ml"
 )
   | Tptrdiff_t of (
-# 117 "parser_cocci_menhir.mly"
+# 143 "parser_cocci_menhir.mly"
       (Data.clt)
 # 68 "parser_cocci_menhir.ml"
 )
   | Tlong of (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 73 "parser_cocci_menhir.ml"
 )
   | Tlist
   | Tint of (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 79 "parser_cocci_menhir.ml"
 )
   | Tinline of (
-# 121 "parser_cocci_menhir.mly"
+# 147 "parser_cocci_menhir.mly"
       (Data.clt)
 # 84 "parser_cocci_menhir.ml"
 )
   | Tfloat of (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 89 "parser_cocci_menhir.ml"
 )
   | Textern of (
-# 121 "parser_cocci_menhir.mly"
+# 147 "parser_cocci_menhir.mly"
       (Data.clt)
 # 94 "parser_cocci_menhir.ml"
 )
   | Tenum of (
-# 118 "parser_cocci_menhir.mly"
+# 144 "parser_cocci_menhir.mly"
       (Data.clt)
 # 99 "parser_cocci_menhir.ml"
 )
   | Tdouble of (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 104 "parser_cocci_menhir.ml"
 )
   | Tconst of (
-# 122 "parser_cocci_menhir.mly"
+# 148 "parser_cocci_menhir.mly"
       (Data.clt)
 # 109 "parser_cocci_menhir.ml"
 )
   | Tchar of (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 114 "parser_cocci_menhir.ml"
 )
   | Tauto of (
-# 121 "parser_cocci_menhir.mly"
+# 147 "parser_cocci_menhir.mly"
       (Data.clt)
 # 119 "parser_cocci_menhir.ml"
 )
   | Tattr of (
-# 123 "parser_cocci_menhir.mly"
+# 149 "parser_cocci_menhir.mly"
       (string * Data.clt)
 # 124 "parser_cocci_menhir.ml"
 )
   | TXor of (
-# 164 "parser_cocci_menhir.mly"
+# 190 "parser_cocci_menhir.mly"
        (Data.clt)
 # 129 "parser_cocci_menhir.ml"
 )
   | TWords
   | TWhy0
   | TWhy of (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
 # 136 "parser_cocci_menhir.ml"
 )
   | TWhile of (
-# 125 "parser_cocci_menhir.mly"
+# 151 "parser_cocci_menhir.mly"
        (Data.clt)
 # 141 "parser_cocci_menhir.ml"
 )
   | TWhenTrue of (
-# 146 "parser_cocci_menhir.mly"
+# 172 "parser_cocci_menhir.mly"
        (Data.clt)
 # 146 "parser_cocci_menhir.ml"
 )
   | TWhenFalse of (
-# 146 "parser_cocci_menhir.mly"
+# 172 "parser_cocci_menhir.mly"
        (Data.clt)
 # 151 "parser_cocci_menhir.ml"
 )
   | TWhen of (
-# 146 "parser_cocci_menhir.mly"
+# 172 "parser_cocci_menhir.mly"
        (Data.clt)
 # 156 "parser_cocci_menhir.ml"
 )
@@ -158,340 +158,340 @@ type token =
   | TUsing
   | TUnderscore
   | TUndef of (
-# 153 "parser_cocci_menhir.mly"
+# 179 "parser_cocci_menhir.mly"
        (Data.clt * token)
 # 164 "parser_cocci_menhir.ml"
 )
   | TTypedef
   | TTypeId of (
-# 127 "parser_cocci_menhir.mly"
+# 153 "parser_cocci_menhir.mly"
        (string * Data.clt)
 # 170 "parser_cocci_menhir.ml"
 )
   | TType
   | TTildeExclEq of (
-# 166 "parser_cocci_menhir.mly"
+# 192 "parser_cocci_menhir.mly"
        (Data.clt)
 # 176 "parser_cocci_menhir.ml"
 )
   | TTildeEq of (
-# 166 "parser_cocci_menhir.mly"
+# 192 "parser_cocci_menhir.mly"
        (Data.clt)
 # 181 "parser_cocci_menhir.ml"
 )
   | TTilde of (
-# 171 "parser_cocci_menhir.mly"
+# 197 "parser_cocci_menhir.mly"
        (Data.clt)
 # 186 "parser_cocci_menhir.ml"
 )
   | TSymbol
   | TSymId of (
-# 127 "parser_cocci_menhir.mly"
+# 153 "parser_cocci_menhir.mly"
        (string * Data.clt)
 # 192 "parser_cocci_menhir.ml"
 )
   | TSwitch of (
-# 125 "parser_cocci_menhir.mly"
+# 151 "parser_cocci_menhir.mly"
        (Data.clt)
 # 197 "parser_cocci_menhir.ml"
 )
   | TSub of (
-# 166 "parser_cocci_menhir.mly"
+# 192 "parser_cocci_menhir.mly"
        (Data.clt)
 # 202 "parser_cocci_menhir.ml"
 )
   | TString of (
-# 159 "parser_cocci_menhir.mly"
+# 185 "parser_cocci_menhir.mly"
        (string * Data.clt)
 # 207 "parser_cocci_menhir.ml"
 )
   | TStrict of (
-# 146 "parser_cocci_menhir.mly"
+# 172 "parser_cocci_menhir.mly"
        (Data.clt)
 # 212 "parser_cocci_menhir.ml"
 )
   | TStatement
   | TSizeof of (
-# 126 "parser_cocci_menhir.mly"
+# 152 "parser_cocci_menhir.mly"
        (Data.clt)
 # 218 "parser_cocci_menhir.ml"
 )
   | TShROp of (
-# 168 "parser_cocci_menhir.mly"
+# 194 "parser_cocci_menhir.mly"
        (Ast_cocci.arithOp * Data.clt)
 # 223 "parser_cocci_menhir.ml"
 )
   | TShLOp of (
-# 168 "parser_cocci_menhir.mly"
+# 194 "parser_cocci_menhir.mly"
        (Ast_cocci.arithOp * Data.clt)
 # 228 "parser_cocci_menhir.ml"
 )
   | TScriptData of (
-# 143 "parser_cocci_menhir.mly"
+# 169 "parser_cocci_menhir.mly"
        (string)
 # 233 "parser_cocci_menhir.ml"
 )
   | TScript
   | TRuleName of (
-# 114 "parser_cocci_menhir.mly"
+# 140 "parser_cocci_menhir.mly"
       (string)
 # 239 "parser_cocci_menhir.ml"
 )
   | TRightIso
   | TReturn of (
-# 125 "parser_cocci_menhir.mly"
+# 151 "parser_cocci_menhir.mly"
        (Data.clt)
 # 245 "parser_cocci_menhir.ml"
 )
   | TPure
   | TPtrOp of (
-# 176 "parser_cocci_menhir.mly"
+# 202 "parser_cocci_menhir.mly"
        (Data.clt)
 # 251 "parser_cocci_menhir.ml"
 )
   | TPtVirg of (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
 # 256 "parser_cocci_menhir.ml"
 )
   | TPragma of (
-# 128 "parser_cocci_menhir.mly"
+# 154 "parser_cocci_menhir.mly"
        (Ast_cocci.added_string * Data.clt)
 # 261 "parser_cocci_menhir.ml"
 )
   | TPosition
   | TPosAny
   | TPlusFile of (
-# 155 "parser_cocci_menhir.mly"
+# 181 "parser_cocci_menhir.mly"
        (string * Data.clt)
 # 268 "parser_cocci_menhir.ml"
 )
   | TPlus0
   | TPlus of (
-# 170 "parser_cocci_menhir.mly"
+# 196 "parser_cocci_menhir.mly"
        (Data.clt)
 # 274 "parser_cocci_menhir.ml"
 )
   | TPathIsoFile of (
-# 151 "parser_cocci_menhir.mly"
+# 177 "parser_cocci_menhir.mly"
        (string)
 # 279 "parser_cocci_menhir.ml"
 )
   | TParameter
   | TPOEllipsis of (
-# 145 "parser_cocci_menhir.mly"
+# 171 "parser_cocci_menhir.mly"
        (Data.clt)
 # 285 "parser_cocci_menhir.ml"
 )
   | TPCEllipsis of (
-# 145 "parser_cocci_menhir.mly"
+# 171 "parser_cocci_menhir.mly"
        (Data.clt)
 # 290 "parser_cocci_menhir.ml"
 )
   | TPArob of (
-# 142 "parser_cocci_menhir.mly"
+# 168 "parser_cocci_menhir.mly"
        (Data.clt)
 # 295 "parser_cocci_menhir.ml"
 )
   | TOrLog of (
-# 161 "parser_cocci_menhir.mly"
+# 187 "parser_cocci_menhir.mly"
        (Data.clt)
 # 300 "parser_cocci_menhir.ml"
 )
   | TOr of (
-# 163 "parser_cocci_menhir.mly"
+# 189 "parser_cocci_menhir.mly"
        (Data.clt)
 # 305 "parser_cocci_menhir.ml"
 )
   | TOn
   | TOPar0 of (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
 # 311 "parser_cocci_menhir.ml"
 )
   | TOPar of (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
 # 316 "parser_cocci_menhir.ml"
 )
   | TOInit of (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
 # 321 "parser_cocci_menhir.ml"
 )
   | TOEllipsis of (
-# 145 "parser_cocci_menhir.mly"
+# 171 "parser_cocci_menhir.mly"
        (Data.clt)
 # 326 "parser_cocci_menhir.ml"
 )
   | TOCro of (
-# 174 "parser_cocci_menhir.mly"
+# 200 "parser_cocci_menhir.mly"
        (Data.clt)
 # 331 "parser_cocci_menhir.ml"
 )
   | TOBrace of (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
 # 336 "parser_cocci_menhir.ml"
 )
   | TNothing
   | TNotEq of (
-# 166 "parser_cocci_menhir.mly"
+# 192 "parser_cocci_menhir.mly"
        (Data.clt)
 # 342 "parser_cocci_menhir.ml"
 )
   | TNever
   | TName
   | TMul of (
-# 171 "parser_cocci_menhir.mly"
+# 197 "parser_cocci_menhir.mly"
        (Data.clt)
 # 349 "parser_cocci_menhir.ml"
 )
   | TMinusFile of (
-# 155 "parser_cocci_menhir.mly"
+# 181 "parser_cocci_menhir.mly"
        (string * Data.clt)
 # 354 "parser_cocci_menhir.ml"
 )
   | TMinus of (
-# 170 "parser_cocci_menhir.mly"
+# 196 "parser_cocci_menhir.mly"
        (Data.clt)
 # 359 "parser_cocci_menhir.ml"
 )
   | TMid0 of (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
 # 364 "parser_cocci_menhir.ml"
 )
   | TMetavariable
   | TMetaType of (
-# 134 "parser_cocci_menhir.mly"
+# 160 "parser_cocci_menhir.mly"
        (Parse_aux.info)
 # 370 "parser_cocci_menhir.ml"
 )
   | TMetaStmList of (
-# 134 "parser_cocci_menhir.mly"
+# 160 "parser_cocci_menhir.mly"
        (Parse_aux.info)
 # 375 "parser_cocci_menhir.ml"
 )
   | TMetaStm of (
-# 134 "parser_cocci_menhir.mly"
+# 160 "parser_cocci_menhir.mly"
        (Parse_aux.info)
 # 380 "parser_cocci_menhir.ml"
 )
   | TMetaPos of (
-# 139 "parser_cocci_menhir.mly"
+# 165 "parser_cocci_menhir.mly"
        (Parse_aux.pos_info)
 # 385 "parser_cocci_menhir.ml"
 )
   | TMetaParamList of (
-# 136 "parser_cocci_menhir.mly"
+# 162 "parser_cocci_menhir.mly"
        (Parse_aux.list_info)
 # 390 "parser_cocci_menhir.ml"
 )
   | TMetaParam of (
-# 134 "parser_cocci_menhir.mly"
+# 160 "parser_cocci_menhir.mly"
        (Parse_aux.info)
 # 395 "parser_cocci_menhir.ml"
 )
   | TMetaLocalIdExp of (
-# 138 "parser_cocci_menhir.mly"
+# 164 "parser_cocci_menhir.mly"
        (Parse_aux.typed_expinfo)
 # 400 "parser_cocci_menhir.ml"
 )
   | TMetaLocalFunc of (
-# 131 "parser_cocci_menhir.mly"
+# 157 "parser_cocci_menhir.mly"
        (Parse_aux.idinfo)
 # 405 "parser_cocci_menhir.ml"
 )
   | TMetaIterator of (
-# 132 "parser_cocci_menhir.mly"
+# 158 "parser_cocci_menhir.mly"
        (Parse_aux.idinfo)
 # 410 "parser_cocci_menhir.ml"
 )
   | TMetaInitList of (
-# 136 "parser_cocci_menhir.mly"
+# 162 "parser_cocci_menhir.mly"
        (Parse_aux.list_info)
 # 415 "parser_cocci_menhir.ml"
 )
   | TMetaInit of (
-# 135 "parser_cocci_menhir.mly"
+# 161 "parser_cocci_menhir.mly"
        (Parse_aux.info)
 # 420 "parser_cocci_menhir.ml"
 )
   | TMetaIdExp of (
-# 138 "parser_cocci_menhir.mly"
+# 164 "parser_cocci_menhir.mly"
        (Parse_aux.typed_expinfo)
 # 425 "parser_cocci_menhir.ml"
 )
   | TMetaId of (
-# 130 "parser_cocci_menhir.mly"
+# 156 "parser_cocci_menhir.mly"
        (Parse_aux.midinfo)
 # 430 "parser_cocci_menhir.ml"
 )
   | TMetaFunc of (
-# 131 "parser_cocci_menhir.mly"
+# 157 "parser_cocci_menhir.mly"
        (Parse_aux.idinfo)
 # 435 "parser_cocci_menhir.ml"
 )
   | TMetaFieldList of (
-# 137 "parser_cocci_menhir.mly"
+# 163 "parser_cocci_menhir.mly"
        (Parse_aux.list_info)
 # 440 "parser_cocci_menhir.ml"
 )
   | TMetaField of (
-# 135 "parser_cocci_menhir.mly"
+# 161 "parser_cocci_menhir.mly"
        (Parse_aux.info)
 # 445 "parser_cocci_menhir.ml"
 )
   | TMetaExpList of (
-# 136 "parser_cocci_menhir.mly"
+# 162 "parser_cocci_menhir.mly"
        (Parse_aux.list_info)
 # 450 "parser_cocci_menhir.ml"
 )
   | TMetaExp of (
-# 138 "parser_cocci_menhir.mly"
+# 164 "parser_cocci_menhir.mly"
        (Parse_aux.typed_expinfo)
 # 455 "parser_cocci_menhir.ml"
 )
   | TMetaErr of (
-# 133 "parser_cocci_menhir.mly"
+# 159 "parser_cocci_menhir.mly"
        (Parse_aux.expinfo)
 # 460 "parser_cocci_menhir.ml"
 )
   | TMetaDeclarer of (
-# 132 "parser_cocci_menhir.mly"
+# 158 "parser_cocci_menhir.mly"
        (Parse_aux.idinfo)
 # 465 "parser_cocci_menhir.ml"
 )
   | TMetaDecl of (
-# 135 "parser_cocci_menhir.mly"
+# 161 "parser_cocci_menhir.mly"
        (Parse_aux.info)
 # 470 "parser_cocci_menhir.ml"
 )
   | TMetaConst of (
-# 138 "parser_cocci_menhir.mly"
+# 164 "parser_cocci_menhir.mly"
        (Parse_aux.typed_expinfo)
 # 475 "parser_cocci_menhir.ml"
 )
   | TMeta of (
-# 135 "parser_cocci_menhir.mly"
+# 161 "parser_cocci_menhir.mly"
        (Parse_aux.info)
 # 480 "parser_cocci_menhir.ml"
 )
   | TMPtVirg
   | TLogOp of (
-# 167 "parser_cocci_menhir.mly"
+# 193 "parser_cocci_menhir.mly"
        (Ast_cocci.logicalOp * Data.clt)
 # 486 "parser_cocci_menhir.ml"
 )
   | TLocal
   | TLineEnd of (
-# 146 "parser_cocci_menhir.mly"
+# 172 "parser_cocci_menhir.mly"
        (Data.clt)
 # 492 "parser_cocci_menhir.ml"
 )
   | TIteratorId of (
-# 127 "parser_cocci_menhir.mly"
+# 153 "parser_cocci_menhir.mly"
        (string * Data.clt)
 # 497 "parser_cocci_menhir.ml"
 )
@@ -507,60 +507,60 @@ type token =
   | TIso
   | TInvalid
   | TInt of (
-# 159 "parser_cocci_menhir.mly"
+# 185 "parser_cocci_menhir.mly"
        (string * Data.clt)
 # 513 "parser_cocci_menhir.ml"
 )
   | TInitialize
   | TInitialiser
   | TIncludeNL of (
-# 152 "parser_cocci_menhir.mly"
+# 178 "parser_cocci_menhir.mly"
        (string * Data.clt)
 # 520 "parser_cocci_menhir.ml"
 )
   | TIncludeL of (
-# 152 "parser_cocci_menhir.mly"
+# 178 "parser_cocci_menhir.mly"
        (string * Data.clt)
 # 525 "parser_cocci_menhir.ml"
 )
   | TInc of (
-# 157 "parser_cocci_menhir.mly"
+# 183 "parser_cocci_menhir.mly"
        (Data.clt)
 # 530 "parser_cocci_menhir.ml"
 )
   | TIf of (
-# 125 "parser_cocci_menhir.mly"
+# 151 "parser_cocci_menhir.mly"
        (Data.clt)
 # 535 "parser_cocci_menhir.ml"
 )
   | TIdentifier
   | TIdent of (
-# 127 "parser_cocci_menhir.mly"
+# 153 "parser_cocci_menhir.mly"
        (string * Data.clt)
 # 541 "parser_cocci_menhir.ml"
 )
   | TIdExpression
   | TGoto of (
-# 126 "parser_cocci_menhir.mly"
+# 152 "parser_cocci_menhir.mly"
        (Data.clt)
 # 547 "parser_cocci_menhir.ml"
 )
   | TGenerated
   | TFunction
   | TFunDecl of (
-# 126 "parser_cocci_menhir.mly"
+# 152 "parser_cocci_menhir.mly"
        (Data.clt)
 # 554 "parser_cocci_menhir.ml"
 )
   | TFresh
   | TForall
   | TFor of (
-# 125 "parser_cocci_menhir.mly"
+# 151 "parser_cocci_menhir.mly"
        (Data.clt)
 # 561 "parser_cocci_menhir.ml"
 )
   | TFloat of (
-# 159 "parser_cocci_menhir.mly"
+# 185 "parser_cocci_menhir.mly"
        (string * Data.clt)
 # 566 "parser_cocci_menhir.ml"
 )
@@ -572,152 +572,152 @@ type token =
   | TEver
   | TError
   | TEqEq of (
-# 166 "parser_cocci_menhir.mly"
+# 192 "parser_cocci_menhir.mly"
        (Data.clt)
 # 578 "parser_cocci_menhir.ml"
 )
   | TEq of (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
 # 583 "parser_cocci_menhir.ml"
 )
   | TElse of (
-# 125 "parser_cocci_menhir.mly"
+# 151 "parser_cocci_menhir.mly"
        (Data.clt)
 # 588 "parser_cocci_menhir.ml"
 )
   | TEllipsis of (
-# 145 "parser_cocci_menhir.mly"
+# 171 "parser_cocci_menhir.mly"
        (Data.clt)
 # 593 "parser_cocci_menhir.ml"
 )
   | TDotDot of (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
 # 598 "parser_cocci_menhir.ml"
 )
   | TDot of (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
 # 603 "parser_cocci_menhir.ml"
 )
   | TDo of (
-# 125 "parser_cocci_menhir.mly"
+# 151 "parser_cocci_menhir.mly"
        (Data.clt)
 # 608 "parser_cocci_menhir.ml"
 )
   | TDmOp of (
-# 169 "parser_cocci_menhir.mly"
+# 195 "parser_cocci_menhir.mly"
        (Ast_cocci.arithOp * Data.clt)
 # 613 "parser_cocci_menhir.ml"
 )
   | TDisable
   | TDepends
   | TDefineParam of (
-# 154 "parser_cocci_menhir.mly"
+# 180 "parser_cocci_menhir.mly"
        (Data.clt * token * int * int)
 # 620 "parser_cocci_menhir.ml"
 )
   | TDefine of (
-# 153 "parser_cocci_menhir.mly"
+# 179 "parser_cocci_menhir.mly"
        (Data.clt * token)
 # 625 "parser_cocci_menhir.ml"
 )
   | TDefault of (
-# 125 "parser_cocci_menhir.mly"
+# 151 "parser_cocci_menhir.mly"
        (Data.clt)
 # 630 "parser_cocci_menhir.ml"
 )
   | TDeclarerId of (
-# 127 "parser_cocci_menhir.mly"
+# 153 "parser_cocci_menhir.mly"
        (string * Data.clt)
 # 635 "parser_cocci_menhir.ml"
 )
   | TDeclarer
   | TDeclaration
   | TDec of (
-# 157 "parser_cocci_menhir.mly"
+# 183 "parser_cocci_menhir.mly"
        (Data.clt)
 # 642 "parser_cocci_menhir.ml"
 )
   | TCppConcatOp
   | TContinue of (
-# 126 "parser_cocci_menhir.mly"
+# 152 "parser_cocci_menhir.mly"
        (Data.clt)
 # 648 "parser_cocci_menhir.ml"
 )
   | TContext
   | TConstant
   | TComma of (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
 # 655 "parser_cocci_menhir.ml"
 )
   | TChar of (
-# 159 "parser_cocci_menhir.mly"
+# 185 "parser_cocci_menhir.mly"
        (string * Data.clt)
 # 660 "parser_cocci_menhir.ml"
 )
   | TCase of (
-# 125 "parser_cocci_menhir.mly"
+# 151 "parser_cocci_menhir.mly"
        (Data.clt)
 # 665 "parser_cocci_menhir.ml"
 )
   | TCPar0 of (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
 # 670 "parser_cocci_menhir.ml"
 )
   | TCPar of (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
 # 675 "parser_cocci_menhir.ml"
 )
   | TCEllipsis of (
-# 145 "parser_cocci_menhir.mly"
+# 171 "parser_cocci_menhir.mly"
        (Data.clt)
 # 680 "parser_cocci_menhir.ml"
 )
   | TCCro of (
-# 174 "parser_cocci_menhir.mly"
+# 200 "parser_cocci_menhir.mly"
        (Data.clt)
 # 685 "parser_cocci_menhir.ml"
 )
   | TCBrace of (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
 # 690 "parser_cocci_menhir.ml"
 )
   | TBreak of (
-# 126 "parser_cocci_menhir.mly"
+# 152 "parser_cocci_menhir.mly"
        (Data.clt)
 # 695 "parser_cocci_menhir.ml"
 )
   | TBang0
   | TBang of (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
 # 701 "parser_cocci_menhir.ml"
 )
   | TAssign of (
-# 180 "parser_cocci_menhir.mly"
+# 206 "parser_cocci_menhir.mly"
        (Ast_cocci.assignOp * Data.clt)
 # 706 "parser_cocci_menhir.ml"
 )
   | TArobArob
   | TArob
   | TAny of (
-# 146 "parser_cocci_menhir.mly"
+# 172 "parser_cocci_menhir.mly"
        (Data.clt)
 # 713 "parser_cocci_menhir.ml"
 )
   | TAndLog of (
-# 162 "parser_cocci_menhir.mly"
+# 188 "parser_cocci_menhir.mly"
        (Data.clt)
 # 718 "parser_cocci_menhir.ml"
 )
   | TAnd of (
-# 165 "parser_cocci_menhir.mly"
+# 191 "parser_cocci_menhir.mly"
        (Data.clt)
 # 723 "parser_cocci_menhir.ml"
 )
@@ -726,7 +726,7 @@ type token =
 and _menhir_jeton = token
 
 
-# 27 "parser_cocci_menhir.mly"
+# 53 "parser_cocci_menhir.mly"
   
 
 (* Not clear how to allow function declarations to specify a return type
@@ -1598,19 +1598,19 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           Obj.repr _v
   
   let default_reduction =
-    (16, "\000\000\000\000\003@\000\131\000\000\000\000\003\148\001\160\000\000\001\158\001\159\001\157\000\000\001\162\001\161\000\001\000\000\001\217\000\000\000\000\000\147\000\000\000\000\001\207\000\205\000\000\000\000\000\000\000\187\000\186\000\000\000\000\000\000\000\194\000\193\000\000\000\192\000\191\000\000\000\188\000\000\000\185\000\000\000\000\000\000\000\190\000\000\000\189\003\209\003\208\000\000\000\210\000\000\000\209\000\000\000\000\000\000\000\177\000\176\000\000\000\000\000\000\000\184\000\183\000\000\000\182\000\181\000\000\000\178\000\000\000\175\000\000\000\000\000\000\000\180\000\000\000\179\000\000\000\000\000\197\000\196\000\000\000\211\000\000\000\000\000\000\000\204\000\203\000\000\000\202\000\000\000\206\000\201\000\000\000\198\000\000\000\208\000\000\004}\000\000\000\000\0027\0026\0025\0024\000\000\001H\001G\000\000\000\000\002O\000\000\001\231\0029\000\000\000\000\000\000\000\000\000\000\001P\000\000\000\000\001i\001\153\001h\001g\001f\001e\001\152\001\151\001d\001c\002|\000\000\000\000\002{\000\000\000\000\000\000\000\159\000\000\000\000\000\158\002\127\001a\000\000\000\000\000\213\000\000\000\000\000\000\000\000\000\214\000\212\000\000\000\207\000\146\000\000\000\195\000\000\000\219\000\000\000\000\000\000\000\200\000\000\000\000\000\000\003d\000\000\003\201\003\200\003\202\000\000\003\237\000\000\003\194\000\000\000\000\000\000\000\000\001T\000\000\000\000\000\000\004t\003\007\000\000\000\000\004r\000\000\003#\000\000\000\000\000\000\000\000\000\000\000\000\004q\004s\003\r\001\147\003\012\001\146\003\011\003\n\003\t\002c\003\005\000\000\000\000\003\006\001I\000\000\000\000\000\000\003\b\000\000\000\000\003\004\004p\000\000\000\000\004Q\002\223\000\000\000\000\002\226\000\000\000\000\000\000\000u\000\000\000\000\000\000\000\000\000\000\000\000\001J\001\145\003\003\003\016\000m\000\021\000o\000\000\000\000\000Q\000\000\000\000\000\000\000\000\000\000\000\000\000R\000\000\000S\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000d\003\000\000p\000\000\000\000\000\141\001L\002\189\002\255\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\022\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\023\000\000\000\000\000\000\000\000\000\000\000n\000f\000\000\000e\000\000\002\224\002\227\000\000\002\225\002\228\004P\000\000\003+\000\000\001\011\000\000\000\000\002P\000\000\001\233\002:\000\000\000\000\002N\000\000\000\000\000\250\000\000\000\000\000\000\000\232\000\231\000\000\000\000\000\000\000\239\000\238\000\000\000\237\000\236\000\000\000\233\000\000\000\230\000\000\000\000\000\000\000\235\000\000\000\234\000\000\000\255\000\000\000\254\000\000\000\000\000\000\000\222\000\221\000\000\000\000\000\000\000\229\000\228\000\000\000\227\000\226\000\000\000\223\000\000\000\220\000\000\000\000\000\000\000\225\000\000\000\224\000\000\000\000\000\242\000\241\000\000\001\000\000\000\000\000\000\000\000\249\000\248\000\000\000\247\000\000\000\251\000\246\000\000\000\243\000\000\000\253\000\000\000\000\000\000\000\000\001\002\000\000\000\000\000\000\000\000\001\003\001\001\000\000\000\252\000\000\000\240\000\000\001\b\000\000\000\000\000\000\000\245\000\000\000\000\003\195\003\196\000\000\000\000\001\007\000\000\003\198\003c\000\000\000\000\000\173\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\162\001\017\001\018\000\000\000\000\000\000\000\000\000\000\002\144\002\161\002W\000\000\000\000\000\000\000\000\000\000\001`\001\022\000\000\002X\000\000\000\000\000\000\000\000\001\016\000\000\001\014\000\000\001\209\000\171\000\000\000\000\000\170\002\148\002\145\000\000\000\000\003\205\000\000\003\204\000\000\000\000\000\000\000\000\000\000\001\005\000\000\000\000\000\000\000\000\001\006\001\004\003\236\000\000\000\000\003\207\003\199\000\244\000\000\001\229\0028\000\000\000\000\003*\000\000\000\000\000\000\003\021\000\000\000\000\000\000\003\014\000\000\000\000\000\000\000\000\000\000\003\029\000\000\000\000\003\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001D\001C\000\000\000\000\003\027\001\177\001\176\003\026\000\000\003\025\003\024\003\023\001\179\003\019\000\000\004U\003\020\000\000\000\000\000\000\000\000\000\000\001B\000\000\004V\003\022\000\000\004X\000\000\003\018\000\000\000\000\000w\002\231\000\000\000\000\002\234\000\000\000\000\003)\003(\000\015\003'\003&\003%\003!\000\000\004\\\003\"\000\000\000\000\000\000\000\000\004]\003$\000\000\004_\000\000\003 \000\000\000y\002\239\000\000\000\000\002\242\000\000\000\000\000\000\000i\000\000\000h\001X\003,\003\031\001V\000\000\002\245\000\014\000\016\000g\0003\001\r\000q\000\000\000\000\000\000\000\000\000\000\000\000\000\143\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0005\000\000\000\000\000\000\000\000\000\000\000\000\002m\000\000\000\000\002\240\002\243\000\000\002\241\002\244\004^\000\151\002q\000\000\000\000\000\150\002n\000\000\002\237\000\000\000\000\002\232\002\235\000\000\002\233\002\236\003\030\003\017\004W\000\000\001\\\000\000\000\000\000\000\000\000\001\174\000\000\001\215\000$\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000&\000\000\000\000\000\000\000\000\001\175\000\000\001\170\000\000\000\000\002\130\000\000\000\000\000\000\000\163\000\000\000\000\000\162\002\134\001\178\001\171\000\000\001R\001\169\002\131\000\000\001\173\000\000\002\238\000x\000\000\002\230\004Y\000\000\002\246\000z\000\000\002\229\004l\004m\004k\004j\004O\000\000\000\000\004N\000\000\000\000\003\002\001n\000\000\002a\000\000\000\000\000\000\000\000\000\000\001N\002h\000\000\000\000\001\247\003\001\000\000\003\015\000\000\000\000\000v\000\000\000\000\000\000\004`\000\000\002b\000\000\000\000\000\000\004n\000\000\000\000\000\000\004R\000\000\000c\001\012\000\000\003\206\000\000\000\000\000\216\000\000\000\000\000\000\000\000\000\217\000\215\000\000\000\000\002V\000\000\001\245\002A\000\000\003\203\000\000\000\000\000\000\000\218\000\199\000\000\000\000\001\183\000\000\001\182\000\000\001\197\000\000\001\219\000\000\000\000\000\000\004\012\000\000\000\000\000\000\003\250\003\249\000\000\000\000\000\000\004\001\004\000\000\000\003\255\003\254\000\000\003\251\000\000\003\248\000\000\000\000\000\000\003\253\000\000\003\252\000\000\004\017\000\000\004\016\000\000\000\000\000\000\003\240\003\239\000\000\000\000\000\000\003\247\003\246\000\000\003\245\003\244\000\000\003\241\000\000\003\238\000\000\000\000\000\000\003\243\000\000\003\242\000\000\000\000\004\004\004\003\000\000\004\018\000\000\000\000\000\000\004\011\004\n\000\000\004\t\000\000\004\r\004\b\000\000\004\005\000\000\004\015\000\000\000\000\000\000\000\000\004\020\000\000\000\000\000\000\000\000\004\021\004\019\000\000\004\014\000\000\004\002\000\000\004\026\000\000\000\000\000\000\004\007\000\000\002\b\000\000\004H\000\000\000\000\002S\002\t\000\000\001\239\002>\000\000\000\000\000\000\000\000\004\025\004\006\004I\000\000\004L\004K\000\000\000\000\003\164\004J\000\139\000\000\0014\000\000\000\000\000\000\000\000\004\023\000\000\000\000\000\000\000\000\004\024\004\022\000\000\000\000\0049\000\000\000\000\000\000\004'\004&\000\000\000\000\000\000\004.\004-\000\000\004,\004+\000\000\004(\000\000\004%\000\000\000\000\000\000\004*\000\000\004)\000\000\004>\000\000\004=\000\000\000\000\000\000\004\029\004\028\000\000\000\000\000\000\004$\004#\000\000\004\"\004!\000\000\004\030\000\000\004\027\000\000\000\000\000\000\004 \000\000\004\031\000\000\000\000\0041\0040\000\000\004?\000\000\000\000\000\000\0048\0047\000\000\0046\000\000\004:\0045\000\000\0042\000\000\004<\000\000\000\000\000\000\000\000\004A\000\000\000\000\000\000\000\000\004B\004@\000\000\004;\000\000\004/\000\000\004G\000\000\000\000\000\000\0044\000\000\000\000\000\000\000\000\004F\0043\000\000\000\000\000\000\000\000\004D\000\000\000\000\000\000\000\000\004E\004C\003\190\003\192\003\193\003\191\000\000\000\000\000\000\000\000\000\000\001\165\000\000\000\000\000\000\000\000\000\000\001\020\001 \001\019\000\000\000\000\000\128\000\000\000\000\000\000\001,\000\000\003\142\000\000\000\000\001(\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001/\000\000\000\000\0013\001x\001w\000\000\000\000\000\000\000\000\001\150\000\000\000\000\000\000\000\000\001%\000\000\001\"\000\000\000\000\000\000\000\000\000\000\001-\000\000\001)\000\000\000\000\000\000\000\000\001*\000\000\001&\000\000\000\000\000\000\000\000\0031\000\000\000\000\000\000\000\000\004g\000\000\003\181\000\000\003\180\000\000\000\000\000\000\000\000\004{\000\000\000\000\000\000\004|\000\000\000\018\000\000\000\000\000\000\000\000\0038\000\000\000\000\000\000\0037\0036\0035\0034\0033\003/\000\000\004c\0030\000\000\004d\0032\000\000\004f\000\000\003.\000\000\000{\002\247\000\000\000\000\002\250\000\000\000\000\002\253\000\000\000\000\002\248\002\251\000\000\002\249\002\252\003:\003-\004e\000\000\000\000\000l\000\000\000k\000\000\0039\000\000\002;\000j\000B\001m\000r\000\000\000\000\000\000\000\000\000\000\000\000\000\145\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000C\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000D\000\000\000\000\000\000\000\000\000\000\000\000\002\254\000|\000\000\004w\000\000\001\249\000\000\000\000\000\000\001\023\003\171\001\205\000\000\001\204\001\164\001\163\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\185\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\155\001K\000\000\000\000\002t\000\000\000\000\000\154\002x\002u\001Z\0015\000\000\0017\0016\000\000\003\183\000\000\003\182\003\167\000\000\000\000\000\000\000\000\000\000\003\177\000\000\003\172\000\000\003\184\000\000\000\000\000\000\000\000\003\178\003\169\002\191\000\000\001\027\001\166\000\000\003\187\000\000\001\168\000\000\000\000\003\215\000\000\003\222\001\029\000\000\001#\000\000\003\216\001\028\000\000\003\217\000\000\003\224\000\000\000\000\000\000\000\000\0010\000\000\000\000\0011\000\000\001\031\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001.\000\000\000\000\0012\000\000\000\000\000\000\000\000\001\149\000\000\000\000\000\000\001$\000\000\001!\000\000\000\000\000\000\000\000\000\000\001+\000\000\001'\001\025\001\024\000\000\003\225\003\226\000\000\003\227\000\000\003\228\000\000\001\167\003\175\000\000\000\000\002U\000\000\001\243\002@\000\000\003\168\000\000\000\000\000\000\003\174\000\000\000\000\000\000\001\138\000\000\001\132\000\000\001\133\000\000\001\143\001\131\001\142\000\000\003\186\001\144\000\000\001\030\000\000\000\000\000\000\000\000\001\140\001\135\002Q\000\000\001\136\000\000\001\137\000\000\001\235\002<\000\000\000\000\000\000\002]\000\000\002[\000\000\000\000\002_\002Y\000\000\002`\002Z\000\000\003\188\002d\000\000\001\026\000\000\000\000\002R\000\000\001\237\002=\000\000\004x\000\000\004u\000\000\004v\000\019\000\020\000\000\000\000\003p\000\000\003o\000\000\002\164\000\000\003r\000\000\003q\000\000\000\000\000\000\002\172\000\000\000\000\002\176\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\179\000\000\000\000\002\183\000\000\002\166\000\000\000\000\002\169\000\000\000\000\000\000\002\173\000\000\000\000\002\177\000\000\000\000\002T\000\000\000\000\002\170\000\000\000\000\002\174\000\000\000\000\003n\003m\002\167\000\000\000\000\000\000\000\000\002\180\000\000\000\000\002\181\000\000\002\163\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\178\000\000\000\000\002\182\000\000\002\165\000\000\000\000\002\168\000\000\000\000\000\000\002\171\000\000\000\000\002\175\000\000\001\241\002?\000\000\003s\000\000\000\000\004y\000\017\000~\000\000\004z\000\000\000\000\003\138\000\000\000\000\003\189\000s\000\000\000\000\000\000\000t\000\000\003\179\000\000\001\211\000\000\001\213\003\176\000\000\000\000\001\191\000\000\001\190\000\000\001\198\000\000\001\227\000\000\000\000\000\000\001\187\000\000\001\186\000\000\001\195\000\000\001\223\000\000\000\000\000\000\001\194\000\000\000\000\001\202\000\000\000\000\001\189\001\203\000\000\001\188\000\000\001\196\000\000\001\225\000\000\000\000\000\000\001\192\000\000\000\000\000\000\001\185\000\000\001\184\000\000\001\199\000\000\001\221\000\000\000\000\000\000\001\193\000\002\000\000\000`\000\000\000\000\0023\000a\000\000\000\000\003J\003N\003R\003F\003W\003C\000\000\000\000\003O\003V\003G\003U\003E\003T\003I\003A\003H\003Q\003D\003K\003B\003M\003S\003P\003L\002\014\002\r\000\137\000\000\000\000\003\160\000\000\000\000\000\000\000\000\003\133\003\130\000\000\000\000\003\134\003\131\003\132\003a\000\000\000\000\003\166\003Y\003X\003Z\000\000\002\031\000_\001\200\000\003\000\000\000\000\003=\000\000\002\187\000\000\000\138\000\000\000\000\003\162\000\000\000\000\000\000\000\130\000\000\000\000\003\146\000\000\002\158\002\157\002\005\003b\000\000\002.\000\000\003>\000\000\000\000\000\132\000\000\000\000\003\150\000\000\002\028\000\000\000\000\002\020\000\000\000\000\000\000\002\027\000\000\002\023\000\000\000\000\000\000\001\251\001\250\000\000\000\000\000\000\002/\000\000\002\018\000\000\002\017\000\000\000\127\000\000\000\000\003\140\000\000\000\000\002\012\000\000\000\000\002\016\000\000\000\000\000\135\000\000\000\000\003\156\000\000\000\000\003k\000\000\003j\000\000\000\000\000\000\002\156\002\155\003h\002\197\003]\003i\000\000\002\"\000\000\000\000\000\000\002\030\000\000\002$\000\000\000\000\000\000\000\000\000\000\000\000\0022\000\000\002\022\000\000\002\021\000\000\000\000\000\000\003_\000\136\000\000\000\000\003\158\000\000\003^\000\000\002 \000\000\000\000\002!\000\000\000\000\000\000\000\000\000\000\000\000\0021\000\000\002\026\000\000\002\025\000\000\000\000\001r\000\000\001q\000\000\000\000\000\000\000\000\000\000\0020\000\000\002\019\000\000\001p\000\000\002j\000\133\000\000\000\000\003\152\000\000\000\000\000\000\000\000\003\211\003\210\000\000\000\000\001\156\001\155\000\129\001\154\000\000\000\000\003\144\000\000\002\150\002\149\002\152\003[\002\193\002\151\001o\000\000\000\134\000\000\000\000\003\154\000\000\000\000\000\000\000\000\002\154\002\153\003g\003e\002\195\003\\\003f\000\000\002)\000\000\002,\000\000\000\000\002%\000\000\000\000\000\000\002\029\000\000\002#\000\000\000\000\002\024\000\000\000\000\000\000\000\000\000\000\000\000\002\011\000\000\000\000\002+\000\000\002*\000\000\000\000\000\000\000\000\002(\000\000\000\000\002'\000\000\002&\000\000\000\000\002-\000\000\000\000\001\201\000\004\000\000\002\015\000\005\000\000\000\000\001u\000\006\000\000\002E\002F\002D\000\000\002C\003\212\002\001\000\000\000\007\000\000\002H\002I\002G\000\000\000\000\000\000\000\000\001z\000\000\000\000\000\000\000\000\001\127\001\129\001\128\001{\001}\001|\000\000\000\000\000\000\000\000\000\000\003\218\003\231\000\000\003\219\000\000\003\220\000\000\000\000\003\213\000\000\000\000\000\000\000\000\003\230\000\000\000\000\003\229\002M\002L\000\000\000\000\002\003\002B\002J\000\000\000\000\000\000\000\000\000\000\002\160\000\000\000\000\000\000\000\000\000\000\002\137\002\159\000\000\000\000\000\000\000\167\000\000\000\000\000\166\002\141\002\138\001^\001\021\000\000\000\000\000\000\000\000\001\148\001v\000\000\003\234\000\000\003\235\000\000\000\000\002g\002e\000\000\002f\000\b\000\000\000\t\000\000\002\212\002\213\002\211\000\000\002\210\000\000\000\n\000\000\002\215\002\216\002\214\000\000\002\218\000\000\000\000\000\000\002\204\000\000\000\000\002\206\000\000\002\200\000\000\002\202\000\000\002\207\000\000\002\208\000\000\002\201\002\199\002\219\002\007\002\209\000\000\002\221\000\000\002\220\000\000\002\222\000\000\003l\000\011\000\000\000\000\000\000\000\000\000\000\000\000\0018\000\000\000\000\001<\000\000\001;\000\000\0019\000\000\000\000\000\000\000\000\000\000\001=\001:\000\000\001?\000\000\000\000\000\000\003x\000\000\003w\000\000\000\000\000\000\000\000\003y\000\000\000\000\001t\000\000\000\000\000\000\000\000\000\000\003\136\000}\000\000\000\000\001F\000\000\001k\001j\000\000\001\181\000\000\003v\001\255\001\253\000\000\000\000\000\000\000\000\003z\000\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003u\000\000\000\000\000\000\000\000\000\000\000\000\003t\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\129\000\000\000\000\003\128\000\000\003}\000\000\000\000\000\000\000\000\000\000\003~\000\000\000\000\000\000\003\127\000\r\000\000\003{\000\000\003|")
+    (16, "\000\000\000\000\003C\000\131\000\000\000\000\003\151\001\160\000\000\001\158\001\159\001\157\000\000\001\162\001\161\000\001\000\000\001\218\000\000\000\000\000\147\000\000\000\000\001\208\000\205\000\000\000\000\000\000\000\187\000\186\000\000\000\000\000\000\000\194\000\193\000\000\000\192\000\191\000\000\000\188\000\000\000\185\000\000\000\000\000\000\000\190\000\000\000\189\003\212\003\211\000\000\000\210\000\000\000\209\000\000\000\000\000\000\000\177\000\176\000\000\000\000\000\000\000\184\000\183\000\000\000\182\000\181\000\000\000\178\000\000\000\175\000\000\000\000\000\000\000\180\000\000\000\179\000\000\000\000\000\197\000\196\000\000\000\211\000\000\000\000\000\000\000\204\000\203\000\000\000\202\000\000\000\206\000\201\000\000\000\198\000\000\000\208\000\000\004\128\000\000\000\000\0028\0027\0026\0025\000\000\001H\001G\000\000\000\000\002P\000\000\001\232\002:\000\000\000\000\000\000\000\000\000\000\001P\000\000\000\000\001i\001\153\001h\001g\001f\001e\001\152\001\151\001d\001c\002\127\000\000\000\000\002~\000\000\000\000\000\000\000\159\000\000\000\000\000\158\002\130\001a\000\000\000\000\000\213\000\000\000\000\000\000\000\000\000\214\000\212\000\000\000\207\000\146\000\000\000\195\000\000\000\219\000\000\000\000\000\000\000\200\000\000\000\000\000\000\003g\000\000\003\204\003\203\003\205\000\000\003\240\000\000\003\197\000\000\000\000\000\000\000\000\001T\000\000\000\000\000\000\004w\003\n\000\000\000\000\004u\000\000\003&\000\000\000\000\000\000\000\000\000\000\000\000\004t\004v\003\016\001\147\003\015\001\146\003\014\003\r\003\012\002d\003\b\000\000\000\000\003\t\001I\000\000\000\000\000\000\003\011\000\000\000\000\003\007\004s\000\000\000\000\004T\002\226\000\000\000\000\002\229\000\000\000\000\000\000\000u\000\000\000\000\000\000\000\000\000\000\000\000\001J\001\145\003\006\003\019\000m\000\021\000o\000\000\000\000\000Q\000\000\000\000\000\000\000\000\000\000\000\000\000R\000\000\000S\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000d\003\003\000p\000\000\000\000\000\141\001L\002\192\003\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\022\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\023\000\000\000\000\000\000\000\000\000\000\000n\000f\000\000\000e\000\000\002\227\002\230\000\000\002\228\002\231\004S\000\000\003.\000\000\001\011\000\000\000\000\002Q\000\000\001\234\002;\000\000\000\000\002O\000\000\000\000\000\250\000\000\000\000\000\000\000\232\000\231\000\000\000\000\000\000\000\239\000\238\000\000\000\237\000\236\000\000\000\233\000\000\000\230\000\000\000\000\000\000\000\235\000\000\000\234\000\000\000\255\000\000\000\254\000\000\000\000\000\000\000\222\000\221\000\000\000\000\000\000\000\229\000\228\000\000\000\227\000\226\000\000\000\223\000\000\000\220\000\000\000\000\000\000\000\225\000\000\000\224\000\000\000\000\000\242\000\241\000\000\001\000\000\000\000\000\000\000\000\249\000\248\000\000\000\247\000\000\000\251\000\246\000\000\000\243\000\000\000\253\000\000\000\000\000\000\000\000\001\002\000\000\000\000\000\000\000\000\001\003\001\001\000\000\000\252\000\000\000\240\000\000\001\b\000\000\000\000\000\000\000\245\000\000\000\000\003\198\003\199\000\000\000\000\001\007\000\000\003\201\003f\000\000\000\000\000\173\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\165\001\017\001\018\000\000\000\000\000\000\000\000\000\000\002\147\002\164\002X\000\000\000\000\000\000\000\000\000\000\001`\001\022\000\000\002Y\000\000\000\000\000\000\000\000\001\016\000\000\001\014\000\000\001\210\000\171\000\000\000\000\000\170\002\151\002\148\000\000\000\000\003\208\000\000\003\207\000\000\000\000\000\000\000\000\000\000\001\005\000\000\000\000\000\000\000\000\001\006\001\004\003\239\000\000\000\000\003\210\003\202\000\244\000\000\001\230\0029\000\000\000\000\003-\000\000\000\000\000\000\003\024\000\000\000\000\000\000\003\017\000\000\000\000\000\000\000\000\003,\003+\003*\003)\003(\003$\000\000\004_\003%\000\000\004`\003'\000\000\004b\000\000\003#\000\000\000y\002\242\000\000\000\000\002\245\000\000\000\000\000\015\000\000\000\000\000\000\000\000\000\000\000i\000\000\000h\000\151\003/\003\"\000\014\000\016\000g\0003\001\r\000q\000\000\000\000\000\000\000\000\000\000\000\000\000\143\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0005\000\000\000\000\000\000\000\000\000\000\000\000\002p\002t\000\000\000\000\000\150\002q\001X\001V\000\000\002\248\000\000\000\000\002\243\002\246\000\000\002\244\002\247\004a\000\000\000\000\003\005\001n\000\000\002f\000\000\000\000\000\000\000\000\000\000\001N\002k\000\000\000\000\001\248\003\004\000\000\000\000\003 \000\000\000\000\003\031\000\000\000\000\000\000\000\000\000\000\002e\000\000\000\000\000\000\000\000\001D\001C\000\000\000\000\003\030\001\178\001\177\003\029\000\000\003\028\003\027\003\026\001\180\003\022\000\000\004X\003\023\000\000\000\000\000\000\000\000\000\000\001B\000\000\004Y\003\025\000\000\004[\000\000\003\021\000\000\000\000\000w\002\234\000\000\000\000\002\237\000\000\000\000\002\240\000\000\000\000\002\235\002\238\000\000\002\236\002\239\003!\003\020\004Z\000\000\001\\\001\173\000\000\000\000\000\000\000\000\001\175\000\000\001\216\000$\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000&\000\000\000\000\000\000\000\000\001\176\000\000\001\170\000\000\000\000\002\133\000\000\000\000\000\000\000\163\000\000\000\000\000\162\002\137\001\179\001\171\000\000\001R\001\169\002\134\000\000\001\174\000\000\002\241\000x\000\000\002\233\004\\\000\000\002\249\000z\000\000\002\232\004o\004p\004n\004m\004R\000\000\000\000\004Q\000\000\002b\000\000\003\018\000\000\000\000\000v\000\000\000\000\000\000\004c\000\000\002c\000\000\000\000\000\000\004q\000\000\000\000\000\000\004U\000\000\000c\001\012\000\000\003\209\000\000\000\000\000\216\000\000\000\000\000\000\000\000\000\217\000\215\000\000\000\000\002W\000\000\001\246\002B\000\000\003\206\000\000\000\000\000\000\000\218\000\199\000\000\000\000\001\184\000\000\001\183\000\000\001\198\000\000\001\220\000\000\000\000\000\000\004\015\000\000\000\000\000\000\003\253\003\252\000\000\000\000\000\000\004\004\004\003\000\000\004\002\004\001\000\000\003\254\000\000\003\251\000\000\000\000\000\000\004\000\000\000\003\255\000\000\004\020\000\000\004\019\000\000\000\000\000\000\003\243\003\242\000\000\000\000\000\000\003\250\003\249\000\000\003\248\003\247\000\000\003\244\000\000\003\241\000\000\000\000\000\000\003\246\000\000\003\245\000\000\000\000\004\007\004\006\000\000\004\021\000\000\000\000\000\000\004\014\004\r\000\000\004\012\000\000\004\016\004\011\000\000\004\b\000\000\004\018\000\000\000\000\000\000\000\000\004\023\000\000\000\000\000\000\000\000\004\024\004\022\000\000\004\017\000\000\004\005\000\000\004\029\000\000\000\000\000\000\004\n\000\000\002\t\000\000\004K\000\000\000\000\002T\002\n\000\000\001\240\002?\000\000\000\000\000\000\000\000\004\028\004\t\004L\000\000\004O\004N\000\000\000\000\003\167\004M\000\139\000\000\0014\000\000\000\000\000\000\000\000\004\026\000\000\000\000\000\000\000\000\004\027\004\025\000\000\000\000\004<\000\000\000\000\000\000\004*\004)\000\000\000\000\000\000\0041\0040\000\000\004/\004.\000\000\004+\000\000\004(\000\000\000\000\000\000\004-\000\000\004,\000\000\004A\000\000\004@\000\000\000\000\000\000\004 \004\031\000\000\000\000\000\000\004'\004&\000\000\004%\004$\000\000\004!\000\000\004\030\000\000\000\000\000\000\004#\000\000\004\"\000\000\000\000\0044\0043\000\000\004B\000\000\000\000\000\000\004;\004:\000\000\0049\000\000\004=\0048\000\000\0045\000\000\004?\000\000\000\000\000\000\000\000\004D\000\000\000\000\000\000\000\000\004E\004C\000\000\004>\000\000\0042\000\000\004J\000\000\000\000\000\000\0047\000\000\000\000\000\000\000\000\004I\0046\000\000\000\000\000\000\000\000\004G\000\000\000\000\000\000\000\000\004H\004F\003\193\003\195\003\196\003\194\000\000\000\000\000\000\000\000\000\000\001\165\000\000\000\000\000\000\000\000\000\000\001\020\001 \001\019\000\000\000\000\000\128\000\000\000\000\000\000\001,\000\000\003\145\000\000\000\000\001(\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001/\000\000\000\000\0013\001x\001w\000\000\000\000\000\000\000\000\001\150\000\000\000\000\000\000\000\000\001%\000\000\001\"\000\000\000\000\000\000\000\000\000\000\001-\000\000\001)\000\000\000\000\000\000\000\000\001*\000\000\001&\000\000\000\000\000\000\000\000\0034\000\000\000\000\000\000\000\000\004j\000\000\003\184\000\000\003\183\000\000\000\000\000\000\000\000\004~\000\000\000\000\000\000\004\127\000\000\000\018\000\000\000\000\000\000\000\000\003;\000\000\000\000\000\000\003:\0039\0038\0037\0036\0032\000\000\004f\0033\000\000\004g\0035\000\000\004i\000\000\0031\000\000\000{\002\250\000\000\000\000\002\253\000\000\000\000\003\000\000\000\000\000\002\251\002\254\000\000\002\252\002\255\003=\0030\004h\000\000\000\000\000l\000\000\000k\000\000\003<\000\000\002<\000j\000B\001m\000r\000\000\000\000\000\000\000\000\000\000\000\000\000\145\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000C\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000D\000\000\000\000\000\000\000\000\000\000\000\000\003\001\000|\000\000\004z\000\000\001\250\000\000\000\000\000\000\001\023\003\174\001\206\000\000\001\205\001\164\001\163\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\188\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\155\001K\000\000\000\000\002w\000\000\000\000\000\154\002{\002x\001Z\0015\000\000\0017\0016\000\000\003\186\000\000\003\185\003\170\000\000\000\000\000\000\000\000\000\000\003\180\000\000\003\175\000\000\003\187\000\000\000\000\000\000\000\000\003\181\003\172\002\194\000\000\001\027\001\166\000\000\003\190\000\000\001\168\000\000\000\000\003\218\000\000\003\225\001\029\000\000\001#\000\000\003\219\001\028\000\000\003\220\000\000\003\227\000\000\000\000\000\000\000\000\0010\000\000\000\000\0011\000\000\001\031\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001.\000\000\000\000\0012\000\000\000\000\000\000\000\000\001\149\000\000\000\000\000\000\001$\000\000\001!\000\000\000\000\000\000\000\000\000\000\001+\000\000\001'\001\025\001\024\000\000\003\228\003\229\000\000\003\230\000\000\003\231\000\000\001\167\003\178\000\000\000\000\002V\000\000\001\244\002A\000\000\003\171\000\000\000\000\000\000\003\177\000\000\000\000\000\000\001\138\000\000\001\132\000\000\001\133\000\000\001\143\001\131\001\142\000\000\003\189\001\144\000\000\001\030\000\000\000\000\000\000\000\000\001\140\001\135\002R\000\000\001\136\000\000\001\137\000\000\001\236\002=\000\000\000\000\000\000\002^\000\000\002\\\000\000\000\000\002`\002Z\000\000\002a\002[\000\000\003\191\002g\000\000\001\026\000\000\000\000\002S\000\000\001\238\002>\000\000\004{\000\000\004x\000\000\004y\000\019\000\020\000\000\000\000\003s\000\000\003r\000\000\002\167\000\000\003u\000\000\003t\000\000\000\000\000\000\002\175\000\000\000\000\002\179\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\182\000\000\000\000\002\186\000\000\002\169\000\000\000\000\002\172\000\000\000\000\000\000\002\176\000\000\000\000\002\180\000\000\000\000\002U\000\000\000\000\002\173\000\000\000\000\002\177\000\000\000\000\003q\003p\002\170\000\000\000\000\000\000\000\000\002\183\000\000\000\000\002\184\000\000\002\166\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\181\000\000\000\000\002\185\000\000\002\168\000\000\000\000\002\171\000\000\000\000\000\000\002\174\000\000\000\000\002\178\000\000\001\242\002@\000\000\003v\000\000\000\000\004|\000\017\000~\000\000\004}\000\000\000\000\003\141\000\000\000\000\003\192\000s\000\000\000\000\000\000\000t\000\000\003\182\000\000\001\212\000\000\001\214\003\179\000\000\000\000\001\192\000\000\001\191\000\000\001\199\000\000\001\228\000\000\000\000\000\000\001\188\000\000\001\187\000\000\001\196\000\000\001\224\000\000\000\000\000\000\001\195\000\000\000\000\001\203\000\000\000\000\001\190\001\204\000\000\001\189\000\000\001\197\000\000\001\226\000\000\000\000\000\000\001\193\000\000\000\000\000\000\001\186\000\000\001\185\000\000\001\200\000\000\001\222\000\000\000\000\000\000\001\194\000\002\000\000\000`\000\000\000\000\0024\000a\000\000\000\000\003M\003Q\003U\003I\003Z\003F\000\000\000\000\003R\003Y\003J\003X\003H\003W\003L\003D\003K\003T\003G\003N\003E\003P\003V\003S\003O\002\015\002\014\000\137\000\000\000\000\003\163\000\000\000\000\000\000\000\000\003\136\003\133\000\000\000\000\003\137\003\134\003\135\003d\000\000\000\000\003\169\003\\\003[\003]\000\000\002 \000_\001\201\000\003\000\000\000\000\003@\000\000\002\190\000\000\000\138\000\000\000\000\003\165\000\000\000\000\000\000\000\130\000\000\000\000\003\149\000\000\002\161\002\160\002\006\003e\000\000\002/\000\000\003A\000\000\000\000\000\132\000\000\000\000\003\153\000\000\002\029\000\000\000\000\002\021\000\000\000\000\000\000\002\028\000\000\002\024\000\000\000\000\000\000\001\252\001\251\000\000\000\000\000\000\0020\000\000\002\019\000\000\002\018\000\000\000\127\000\000\000\000\003\143\000\000\000\000\002\r\000\000\000\000\002\017\000\000\000\000\000\135\000\000\000\000\003\159\000\000\000\000\003n\000\000\003m\000\000\000\000\000\000\002\159\002\158\003k\002\200\003`\003l\000\000\002#\000\000\000\000\000\000\002\031\000\000\002%\000\000\000\000\000\000\000\000\000\000\000\000\0023\000\000\002\023\000\000\002\022\000\000\000\000\000\000\003b\000\136\000\000\000\000\003\161\000\000\003a\000\000\002!\000\000\000\000\002\"\000\000\000\000\000\000\000\000\000\000\000\000\0022\000\000\002\027\000\000\002\026\000\000\000\000\001r\000\000\001q\000\000\000\000\000\000\000\000\000\000\0021\000\000\002\020\000\000\001p\000\000\002m\000\133\000\000\000\000\003\155\000\000\000\000\000\000\000\000\003\214\003\213\000\000\000\000\001\156\001\155\000\129\001\154\000\000\000\000\003\147\000\000\002\153\002\152\002\155\003^\002\196\002\154\001o\000\000\000\134\000\000\000\000\003\157\000\000\000\000\000\000\000\000\002\157\002\156\003j\003h\002\198\003_\003i\000\000\002*\000\000\002-\000\000\000\000\002&\000\000\000\000\000\000\002\030\000\000\002$\000\000\000\000\002\025\000\000\000\000\000\000\000\000\000\000\000\000\002\012\000\000\000\000\002,\000\000\002+\000\000\000\000\000\000\000\000\002)\000\000\000\000\002(\000\000\002'\000\000\000\000\002.\000\000\000\000\001\202\000\004\000\000\002\016\000\005\000\000\000\000\001u\000\006\000\000\002F\002G\002E\000\000\002D\003\215\002\002\000\000\000\007\000\000\002I\002J\002H\000\000\000\000\000\000\000\000\001z\000\000\000\000\000\000\000\000\001\127\001\129\001\128\001{\001}\001|\000\000\000\000\000\000\000\000\000\000\003\221\003\234\000\000\003\222\000\000\003\223\000\000\000\000\003\216\000\000\000\000\000\000\000\000\003\233\000\000\000\000\003\232\002N\002M\000\000\000\000\002\004\002C\002K\000\000\000\000\000\000\000\000\000\000\002\163\000\000\000\000\000\000\000\000\000\000\002\140\002\162\000\000\000\000\000\000\000\167\000\000\000\000\000\166\002\144\002\141\001^\001\021\000\000\000\000\000\000\000\000\001\148\001v\000\000\003\237\000\000\003\238\000\000\000\000\002j\002h\000\000\002i\000\b\000\000\000\t\000\000\002\215\002\216\002\214\000\000\002\213\000\000\000\n\000\000\002\218\002\219\002\217\000\000\002\221\000\000\000\000\000\000\002\207\000\000\000\000\002\209\000\000\002\203\000\000\002\205\000\000\002\210\000\000\002\211\000\000\002\204\002\202\002\222\002\b\002\212\000\000\002\224\000\000\002\223\000\000\002\225\000\000\003o\000\011\000\000\000\000\000\000\000\000\000\000\000\000\0018\000\000\000\000\001<\000\000\001;\000\000\0019\000\000\000\000\000\000\000\000\000\000\001=\001:\000\000\001?\000\000\000\000\000\000\003{\000\000\003z\000\000\000\000\000\000\000\000\003|\000\000\000\000\001t\000\000\000\000\000\000\000\000\000\000\003\139\000}\000\000\000\000\001F\000\000\001k\001j\000\000\001\182\000\000\003y\002\000\001\254\000\000\000\000\000\000\000\000\003}\000\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003x\000\000\000\000\000\000\000\000\000\000\000\000\003w\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\132\000\000\000\000\003\131\000\000\003\128\000\000\000\000\000\000\000\000\000\000\003\129\000\000\000\000\000\000\003\130\000\r\000\000\003~\000\000\003\127")
   
   let error =
-    (194, "\000\000\000\0000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\000\000\000\000\000\000\000\000 \000\002\000A\128\000\000\129\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\240\000\000\000\000\000\000\000\001\235\218\188\000\004\000\002\000\000 \000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000B\0200\000\001\000\017\000\003\000\144\b`\017\000 \b@\000\000\000&C\016\016\149\r\000(\194\rP@\200e\002\024\004\208\b\135x\018\000\0049\144\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000F\180p\000\001\0001\000\003\000\020\b`\017\000 \b@\000\000\000&C\016\016\141\012\000\000@\004@\000\192$\002\024\004@\b\002\016\000\000\000\t\144\196\004!C\000\000\016\001\016\0000\t\000\134\001\016\002\000\132\000\000\000\002d1\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\173\012\000\000@\004@\000\192$\002\024\004@\b\002\016\000\000\000\t\144\196\004#C\000\000\016\001\016\0000\t\000\134\001\016\002\000\132\000\000\000\002d1\001\bP\192\000\004\000D\000\012\002@!\128D\000\128!\000\000\000\000\153\012@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004!C\000\000\016\001\016\0000\t\000\134\001\016\002\000\132\000\000\000\002d1\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\133\012\000\000@\004@\000\192$\002\024\004@\b\002\016\000\000\000\t\144\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\bP\192\000\004\000D\000\012\002@!\128D\000\128!\000\000\000\000\153\012@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\001\bP\192\000\004\000D\000\012\002@!\128D\000\128!\000\000\000\000\153\012@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\133\012\000\000@\004@\000\192$\002\024\004@\b\002\016\000\000\000\t\144\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\133\012\000\000@\004@\000\192$\002\024\004@\b\002\016\000\000\000\t\144\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\bP\192\000\004\000D\000\012\002@!\128D\000\128!\000\000\000\000\153\012@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\173\028\000\000@\012@\000\192\005\002\024\004@\b\002\016\000\000\000\t\144\196\004#C\000\000\016\001\016\0000\t\000\134\001\016\002\000\132\000\000\000\002d1\001\bP\192\000\004\000D\000\012\002@!\128D\000\128!\000\000\000\000\153\012@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004+C\000\000\016\001\016\0000\t\000\134\001\016\002\000\132\000\000\000\002d1\001\b\208\192\000\004\000D\000\012\002@!\128D\000\128!\000\000\000\000\153\012@B\0200\000\001\000\017\000\003\000\144\b`\017\000 \b@\000\000\000&C\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\bP\192\000\004\000D\000\012\002@!\128D\000\128!\000\000\000\000\153\012@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004!C\000\000\016\001\016\0000\t\000\134\001\016\002\000\132\000\000\000\002d1\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000B\0200\000\001\000\017\000\003\000\144\b`\017\000 \b@\000\000\000&C\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000B\0200\000\001\000\017\000\003\000\144\b`\017\000 \b@\000\000\000&C\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004!C\000\000\016\001\016\0000\t\000\134\001\016\002\000\132\000\000\000\002d1\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000B40\000\001\000\017\000\003\000\144\b`\017\000 \b@\000\000\000&C\016\016\133\012\000\000@\004@\000\192$\002\024\004@\b\002\016\000\000\000\t\144\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000B\0200\000\001\000\017\000\003\000\144\b`\017\000 \b@\000\000\000&C\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004+S\000\000\016\001\016\0000\t\000\134\001\016\002\000\132\000\000\000\002d1\001\b\208\192\000\004\000D\000\012\002@!\128D\000\128!\000\000\000\000\153\012@B\0200\000\001\000\017\000\003\000\144\b`\017\000 \b@\000\000\000&C\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\bP\192\000\004\000D\000\012\002@!\128D\000\128!\000\000\000\000\153\012@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\133\012\000\000@\004@\000\192$\002\024\004@\b\002\016\000\000\000\t\144\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000B\0200\000\001\000\017\000\003\000\144\b`\017\000 \b@\000\000\000&C\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004!C\000\000\016\001\016\0000\t\000\134\001\016\002\000\132\000\000\000\002d1\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\016\000\000@\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000 \128\000\004\001\000\000\000\128\000\b\000\000\000\000\000\000\000\000\000\004\000\000\000\b\000\000\001\000@\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\001\000\000\000\002\000\000\000@\016\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\130\000\000\016\004\000\000\002\000\000 \000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\004\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\002\000\000\000@\016\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\b\000\000\129\000\000\000\000\000\000\001\000\000\000\000\000\000\000\1940\000\b\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 @\000\000\000\000\000\000@\000\000\000\130\000\000\016\004\000\000\002\000\000 \000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\129\000\000\000\000\000\000\001\000\000\000\002\b\000\000@\016\000\000\b\000\000\000\000\000@\000\000\000\000\000\000@\000\000\000\130\000\000\016\004\000\000\002\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\129\000\000\000\000\000\000\001\000\000\000\002\b\000\000@\016\000\000\b\000\000\128\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\016\133\012\000\000@\004@\000\192$\002\024\004@\b\002\016\000\000\000\t\144\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\bP\192\000\004\000D\000\012B@!\128D\000\128!\000\000\000\000\153\012@\000\000\000\000\001\000\000\000\002\b\000\000@\016\000\000\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\004!C\000\000\016\001\016\0000\t\000\134\001\016\002\000\132\000\000\000\002d1\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\133\012\000\000@\004@\000\192$\002\024\004@\b\002\016\000\000\000\t\144\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000B\0200\000\001\000\017\000\003\000\144\b`\017\000 \b@\000\000\000&C\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004!C\000\000\016\001\016\0000\t\000\134\001\016\002\000\132\000\000\000\002d1\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\004!C\000\000\016\001\016\0000\t\000\134\001\016\002\000\132\000\000\000\002d1\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\030\189\171\192\000@\000 \000\002\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\016\133\012\000\000@\004@\000\196$\002\024\004@\b\002\016\000\000\000\t\144\197\235\218\188\000\004\016\002\000\000 \128@\001\129\000\000\000\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\030\189\171\192\000A\000 \000\002\000\004\000\024\016\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000A\000\000\000\002\016\000\000@\016\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\235\218\188\000\004\016\002\000\000 \128@\001\129\000\000\000\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\030\189\171\192\016A\000 \000\002\b\004\000\024\016\000\000\b\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\001\235\218\188\000\004\016\002\000\000 \000@\001\129\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\128\000\000\016\004\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\002\000\000\000\000\000\000\000\000\000 \000\002 \000\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\002\000\016B!\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\002\000\016@!\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000\000\001\004\002\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\002\000\016@!\128\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\bg\175j\240\000\017I\b\001 \208)\0068\204\000\002\018\001\000 \001\004\002\025\235\218\188\000\004RB\000H4\nA\1423\000\000\132\128@\b\000A\000\134\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\000\000\016@!\128\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\bg\175j\240\000\017I\b\001 \208)\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\000\000\000@\000\000\000\000\000\000\016\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\000\000\003\019\004\217d\176\000\000\005\000 @\000\006\232\004'\199p\000\000\000\000\000@\000\000\000\128\000\000\016\004\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000z\246\175\000\001\020\144\128\018\r\"\144c\156\192\000! \016\002\000\016H!\158\189\171\192\000E$ \004\131@\164\024\2270\000\bH\004\000\128\004\016\b`\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000$\000\000\012L\019e\146\192\000\000\020\000\129\000\000\027\160\016\159\029\192\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\002@\000\000\196A6\017,\000\000\001@\b\000\000\001\178\000\t\225\220\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000$\000\000\012D\019a\018\192\000\000\020\000\128\000\000\027 \000\158\029\192\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\000\000\003\017\004\216D\176\000\000\005\000 \000\000\004\200\000'\131p\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000$\000\000\012D\019a\018\192\000\000\020\000\128\000\000\019 \000\158\r\192\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\002@\000\000\196A6\017,\000\000\001@\b\000\000\0012\000\t\240\220\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000$\000\000\012D\019a\018\192\000\000\020\000\128\000\000\019 \000\159\r\192\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\002@\000\000\196A6\017,\000\000\001@\b\000\000\0012\000\t\240\220\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000$\000\000\012D\019a\018\192\000\000\020\000\128\000\000\019 \000\159\r\192\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\002@\000\000\196A6\017,\000\000\001@\b\000\000\0012\000\t\240\220\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000$\000\000\012D\019a\018\192\000\000\020\000\128\000\000\019 \000\159\r\192\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\002@\000\000\196A6\017,\000\000\001@\b\000\000\0012\000\t\240\220\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000$\000\000\012D\019a\018\192\000\000\020\000\128\000\000\019 \000\159\r\192\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\192\004\016\b`\000\000\000\000\000\000\004@\000\000\004\000\000\000@\b\000\000\0000\000\t\160\196\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\002\000\016@!\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\002@\000\000\196A6\017,\000\000\001@\b\000\000\0012\000\t\224\220\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000$\000\000\012D\019a\018\192\000\000\020\000\128\000\000\019 \000\158\r\192\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\002@\000\000\196A6\017,\000\000\001@\b\000\000\0012\000\t\224\220\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000$\000\000\012D\019a\018\192\000\000\020\000\128\000\000\019 \000\158\r\192\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\002@\000\000\196A6\017,\000\000\001@\b\000\000\0012\000\t\240\220\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000$\000\000\012D\019a\018\192\000\000\020\000\128\000\000\019 \000\159\r\192\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\002@\000\000\196A6\017,\000\000\001@\b\000\000\0012\000\t\240\220\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000$\000\000\012D\019a\018\192\000\000\020\000\128\000\000\019 \000\158\r\192\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\002@\000\000\196A6\017,\000\000\001@\b\000\000\0012\000\t\224\220\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\002@\000\000\196A6\017,\000\000\001@\b\000\000\0012\000\t\224\220\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000$\000\000\012D\019a\018\192\000\000\020\000\128\000\000\019 \000\158\r\192\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\002@\000\000\196A6\017,\000\000\001@\b\000\000\0012\000\t\224\220\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\002@\000\000\196A6\017,\000\000\001@\b\000\000\0012\000\t\224\220\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000$\000\000\012D\019a\018\192\000\000\020\000\128\000\000\019 \000\158\r\192\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\002\000\016@!\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\002\000\000\000@\016\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000@\000z\246\175\000\001\000\000\128\000\b\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\175j\208\000\016\000\b\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\004!C\000\000\016\001\016\0000\t\000\134\001\016\002\000\132\000\000\000\002d1\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\160@\000\000\000 \000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\016\141\012\000\000@\004@\000\192$\002\024\004@\b\002\016\000\000\000\t\144\196\004!C\000\000\016\001\016\0000\t\000\134\001\016\002\000\132\000\000\000\002d1\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\173\012\000\000@\004@\000\192$\002\024\004@\b\002\016\000\000\000\t\144\196\004#C\000\000\016\001\016\0000\t\000\134\001\016\002\000\132\000\000\000\002d1\001\bP\192\000\004\000D\000\012\002@!\128D\000\128!\000\000\000\000\153\012@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004!C\000\000\016\001\016\0000\t\000\134\001\016\002\000\132\000\000\000\002d1\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\133\012\000\000@\004@\000\192$\002\024\004@\b\002\016\000\000\000\t\144\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\bP\192\000\004\000D\000\012\002@!\128D\000\128!\000\000\000\000\153\012@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\001\bP\192\000\004\000D\000\012\002@!\128D\000\128!\000\000\000\000\153\012@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\133\012\000\000@\004@\000\192$\002\024\004@\b\002\016\000\000\000\t\144\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\bP\192\000\004\000D\000\012\002@!\128D\000\128!\000\000\000\000\153\012@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\133\012\000\000@\004@\000\192$\002\024\004@\b\002\016\000\000\000\t\144\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\129\000\000\000\000\128\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000B40\000\001\000\017\000\003\000\144\b`\017\000 \b@\000\000\000&C\016\016\133\012\000\000@\004@\000\192$\002\024\004@\b\002\016\000\000\000\t\144\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000B\1800\000\001\000\017\000\003\000\144\b`\017\000 \b@\000\000\000&C\016\016\141\012\000\000@\004@\000\192$\002\024\004@\b\002\016\000\000\000\t\144\196\004!C\000\000\016\001\016\0000\t\000\134\001\016\002\000\132\000\000\000\002d1\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\133\012\000\000@\004@\000\192$\002\024\004@\b\002\016\000\000\000\t\144\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000B\0200\000\001\000\017\000\003\000\144\b`\017\000 \b@\000\000\000&C\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004!C\000\000\016\001\016\0000\t\000\134\001\016\002\000\132\000\000\000\002d1\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\004!C\000\000\016\001\016\0000\t\000\134\001\016\002\000\132\000\000\000\002d1\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000B\0200\000\001\000\017\000\003\000\144\b`\017\000 \b@\000\000\000&C\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004#C\000\000\016\001\016\0000\t\000\134\001\016\002\000\132\000\000\000\002d1\001\bP\192\000\004\000D\000\012\002@!\128D\000\128!\000\000\000\000\153\012@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004!C\000\000\016\001\016\0000\t\000\134\001\016\002\000\132\000\000\000\002d1\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000B\1810\000\001\000\017\000\003\000\144\b`\017\000 \b@\000\000\000&C\016\016\141\012\000\000@\004@\000\192$\002\024\004@\b\002\016\000\000\000\t\144\196\004!C\000\000\016\001\016\0000\t\000\134\001\016\002\000\132\000\000\000\002d1\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\133\012\000\000@\004@\000\192$\002\024\004@\b\002\016\000\000\000\t\144\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\bP\192\000\004\000D\000\012\002@!\128D\000\128!\000\000\000\000\153\012@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004!C\000\000\016\001\016\0000\t\000\134\001\016\002\000\132\000\000\000\002d1\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000B\0200\000\001\000\017\000\003\000\144\b`\017\000 \b@\000\000\000&C\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\001\000\000\004\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\b \000\001\000@\000\000 \000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\016\133\012\000\000@\004@\000\192$\002\024\004@\b\002\016\000\000\000\t\144\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\bP\192\000\004\000D\000\012B@!\128D\000\128!\000\000\000\000\153\012@\000\000\000\000\001\000\000\000\002\b\000\000@\016\000\000\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\004!C\000\000\016\001\016\0000\t\000\134\001\016\002\000\132\000\000\000\002d1\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\133\012\000\000@\004@\000\192$\002\024\004@\b\002\016\000\000\000\t\144\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\bP\192\000\004\000D\000\012\002@!\128D\000\128!\000\000\000\000\153\012@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\133\012\000\000@\004@\000\192$\002\024\004@\b\002\016\000\000\000\t\144\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\016\133\012\000\000@\004@\000\192$\002\024\004@\b\002\016\000\000\000\t\144\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\bP\192\000\004\000D\000\012B@!\128D\000\128!\000\000\000\000\153\012^\189\171\192\000A\000 \000\002\b\004\000\024\016\000\000\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000B\0200\000\001\000\017\000\003\000\144\b`\017\000 \b@\000\000\000&C\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\235\218\188\000\004\016\002\000\000 \128@\001\129\000\000\000\128\000\b\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\175j\240\000\016@\b\000\000\130\001\000\006\004\000\000\002\000\000\000\000\000\016\001\235\218\188\000\004\016\002\000\000 \128@\001\129\000\000\000\128\000\b\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\003\000\000\000@\016\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000 \000\000\004\001\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\175j\240\000\016\000\b\000\000\130\001\024\000\004\000\000\000\000\000 \000\000\128\001\235\218\188\000\004\000\002\000\000 \128F\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002 \000z\246\175\000\001\000\000\128\000\b \017\128\000@\000\000\000\000\000\000\000\b\000\030\189\171\192\000@\000 \000\002\b\004`\000\016\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\128\001\235\218\188\000\004\000\002\000\000 \128F\000\001\000\000\000\000\000\b\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\0000\000\000\004\001\000\000\000\128\000\000\000\002 \000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\002\000\000\000@\016\000\000\b\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\001\235\218\188\000\004\000\002\000\000 \128F\000\001\000\000\000\000\000\b\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\175j\240\000\016\000\b\000\000\130\001\024\000\004\000\000\000\000\000 \000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\"\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\002\000\000\000\000\000\000\000\000\000 \000\002 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\128\001\235\218\188\000\004\000\002\000\000 \128F\000\001\000\000\000\000\000\b\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000:\246\173\000\001\004\000\128\000\000\000\016\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000A\000\000\000\002\016\000\000@\016\000\000\b\000\000\000\000\000\000\007\175j\240\000\016@\b\000\000\130\001\000\006\004\000\000\002\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\001\bP\192\000\004\000D\000\012\002@!\128D\000\128!\000\000\000\000\153\012@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\133\012\000\000@\004@\000\196$\002\024\004@\b\002\016\000\000\000\t\144\197\235\218\188\000\004\016\002\000\000 \128@\001\129\000\000\000\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000B\0200\000\001\000\017\000\003\000\144\b`\017\000 \b@\000\000\000&C\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\002\000\000\000@\016\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\030\189\171\192\000E$ \004\131@\164\024\2270\000\bH\004\000\128\004\016\b`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\005$\000\004\131P\160\024\2270\000\bH\004\000\000\004\016\b`\000\000\000\000\001I\000\001\000\206(\006\248\204\000\006\018\001\000\168\001\004\018\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\002\000\016@!\158\189\171\192\000E$ \004\131@\164\024\2270\000\bH\004\000\128\004\016\b`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\b\000\000\003\000\004\024\020\160\000\000\004\000\000\000\000\004\b\000 @`\000\000\000\000\001I\000\001\000\206(\006\248\204\000\006\018\001\000\168\001\004\018\024\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\175j\240\000\017I\b\001 \208)\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\001I\000\001\000\196(\0068\200\000\006\018\001\000\000\001\004\002\024\000\000\000\000\000R@\000@3\138\001\1903\000\001\132\128@*\000A\004\134\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\002\000\016@!\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\128\000\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001I\000\001\000\206(\006\248\204\000\006\018\001\000\168\001\004\018\024\000\000\000\000\000R@\000@3\138\001\1903\000\001\132\128@*\000A\000\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000$\000\000\012L\019e\146\192\000\000\020\000\129\000\000\027\160\016\149\029\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 @\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000R@\000H5\n\001\1583\000\000\132\128@\b\000A\000\134\000\000\000\000\000\020\144\000\016\012\226\128o\140\192\000a \016\n\128\016A!\128\000\000\000\000\001\000\000\000\002\000\000\000@\016\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\001\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002@\000\000\196\1936Y,\000\000\001@\b\016\000\001\186\001\tQ\220\000\000\000\000\000R@\000@0\n\001\1422\000\001\132\128@\000\000A\000\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\192\129\006I(\000\000\001\000\000\016\000\001\n\001\b\016\024\000\000\000\000\000\016\000\000\000 \000\000\004\001\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\030\189\171\192\000E$ \004\131H\164\024\2310\000\bH\004\000\128\004\018\bg\175j\240\000\017I\b\001 \210)\0069\204\000\002\018\001\000 \001\004\002\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\"\000\007\175j\240\000\017I\b\001 \210)\0069\204\000\002\018\001\000\000\001\004\130\025\235\218\188\000\004RB\000H4\138A\142s\000\000\132\128@\b\000A\000\134\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\002\000\016@!\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000@\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\000\000A\000\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002@\000\000\192\129\022I(\000\000\001\000\000\016\000\001\170\001\b\193\024\000\000\000\000\000\016\000\000\000 \000\000\004\001\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\030\189\171\192\000E$ \004\131H\164\024\2310\000\bH\004\000\128\004\018\b`\000\000\002@\000\000\192\001\022\001(\000\000\001\000\000\000\000\001\162\000\b\193\024\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\144\000\0000\000E\128J\000\000\000@\000\000\000\000H\128\0020\006\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\002\000\016@!\128\000\000\t\000\000\003\000\004X\004\160\000\000\004\000\000\000\000\004\136\000#\000`\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\0000\001\004\002\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\002\000\016@!\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\144\000\0000\000E\128J\000\000\000@\000\000\000\000H\128\0020\006\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\002\000\016@!\128\000\000\t\000\000\003\000\004X\004\160\000\000\004\000\000\000\000\004\136\000#\000`\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\144\000\0000\000E\128J\000\000\000@\000\000\000\000H\128\0020\006\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\002\000\016@!\128\000\000\t\000\000\003\000\004X\004\160\000\000\004\000\000\000\000\004\136\000#\000`\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\144\000\0000\000E\128J\000\000\000@\000\000\000\000H\128\0020\006\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\002\000\016@!\128\000\000\t\000\000\003\000\004X\004\160\000\000\004\000\000\000\000\004\136\000#\000`\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\002\000\016@!\128\000\000\t\000\000\003\000\004X\004\160\000\000\004\000\000\000\000\004\136\000#\000`\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\144\000\0000\000E\128J\000\000\000@\000\000\000\000H\128\0020\006\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\002\000\016@!\128\000\000\t\000\000\003\000\004X\004\160\000\000\004\000\000\000\000\004\136\000#\000`\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\002\000\016@!\128\000\000\t\000\000\003\000\004X\004\160\000\000\004\000\000\000\000\004\136\000#\000`\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\144\000\0000\000E\128J\000\000\000@\000\000\000\000H\128\0020\006\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\136\000\030\189\171\192\000E$ \004\131H\164\024\2310\000\bH\004\000\128\004\018\b`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000 \000\000\004\001\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\"\000\007\175j\240\000\017I\b\001 \210)\0069\204\000\002\018\001\000 \001\004\130\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000 \000\000\004\001\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\000\000\003\003\004\025$\176\000\000\004\000\000@\000\006h\004$D`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\020\144\000\016\012\194\128o\140\192\000a \016\b\128\016@!\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\001I\000\001\000\204(\006\248\204\000\006\018\001\000\136\001\004\002\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\b\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\0000\000A\128J\000\000\000@\000\000\000\000@\128\002\004\006\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\002\000\016@!\128\000\000\b\000\000\003\000\004\024\004\160\000\000\004\000\000\000\000\004\b\000 @`\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\128\000\0000\000A\128J\000\000\000@\000\000\000\000@\128\002\004\006\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\002\000\016@!\128\000\000\b\000\000\003\000\004\024\004\160\000\000\004\000\000\000\000\004\b\000 @`\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\128\000\0000\000A\128J\000\000\000@\000\000\000\000@\128\002\004\006\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\002\000\016@!\128\000\000\b\000\000\003\000\004\024\004\160\000\000\004\000\000\000\000\004\b\000 @`\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\128\000\0000\000A\128J\000\000\000@\000\000\000\000@\128\002\004\006\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\002\000\016@!\128\000\000\b\000\000\003\000\004\024\004\160\000\000\004\000\000\000\000\004\b\000 @`\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\002\000\016@!\128\000\000\b\000\000\003\000\004\024\004\160\000\000\004\000\000\000\000\004\b\000 @`\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\128\000\0000\000A\128J\000\000\000@\000\000\000\000@\128\002\004\006\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\002\000\016@!\128\000\000\b\000\000\003\000\004\024\004\160\000\000\004\000\000\000\000\004\b\000 @`\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\002\000\016@!\128\000\000\b\000\000\003\000\004\024\004\160\000\000\004\000\000\000\000\004\b\000 @`\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\128\000\0000\000A\128J\000\000\000@\000\000\000\000@\128\002\004\006\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\004\000\000\000\000\000\000\020\144\000\016\012\226\128o\140\192\000a \016\n\128\016A!\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\016\000\000\000\000\000\000R@\000@3\138\001\1903\000\001\132\128@\"\000A\004\134\000\000\000\000\000\020\144\000\016\012\226\128o\140\192\000a \016\n\128\016@!\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\016\000\000\000\000\000\000R@\000@3\138\001\1903\000\001\132\128@*\000A\004\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\128\000!\000\000\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000\000\001\004\002\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\b\000\000\016\000\000\000\000\000@\020\144\000\018\r\002\128c\140\192\000! \016\000\000\016@!\128\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000\000\001\004\002\024\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\b\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\005$\000\004\131P\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\235\218\188\000\004RB\000H4\nA\1423\000\000\132\128@\b\000A\000\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\t\000\000\003\000\004X\020\160\000\000\004\000\000\000\000\006\136\000#\004`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\030\189\171\192\000E$ \004\131@\164\024\2270\000\bH\004\000\128\004\016\b`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\144\000\0001\016M\133K\000\000\000P\002\000\000\000l\128\002|w\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\030\189\171\192\000E$ \004\131@\164\024\2270\000\bH\004\000\128\004\016\b`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\144\000\0001\016M\133K\000\000\000P\002\000\000\000l\128\002|w\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\004!C\000\000\016\001\016\0000\t\000\134\001\016\002\000\132\000\000\000\002d1\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000B\0200\000\001\000\017\000\003\016\144\b`\017\000 \b@\000\000\000&C\023\175j\240\000\016@\b\000\000\130\001\000\006\004\000\000\002\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\001\bP\192\000\004\000D\000\012\002@!\128D\000\128!\000\000\000\000\153\012@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000@\000z\246\175\000\001\004\000\128\000\b\000\016\000`@\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\0000\001\000\004\001\000\000\000\128\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000B\0200\000\001\000\017\000\003\000\144\b`\017\000 \b@\000\000\000&C\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000^\189\171\192\000@\000 \000\002\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\235\218\188\000\004\000\002\000\000 \000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031\255\175\224\129E\164)\004\003\024\167\028\227\240\128\025\234\012\000\017\165\016(g\175j\240\000\016\000\b\000\000\128\001\000\000\004\000\000\000\000\000\000\000\000\000\000\000\004\000@\n0\130D\016\002\024@\000\001$\000!\218\004\128\001\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\160@\000\000\000 \000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\001\000(\194\t\016@\ba\000\000\004\144\000\135h\018\000\0040\000\000\000\004\000@\n0\130D\016\002\024@\000\001$\000!\218\004\128\001\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0008\001\000(\194\t\016@\ba\000\000\004\144\000\135h\018\000\0040\000\000\000\006\000@\n0\130D\016\002\024@\000\001$\000!\218\004\128\001\012\000\000\000\001\000\016\002\140 \145\004\000\134\016\000\000I\000\bv\129 \000C\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000@\n0\130D\016\002\024@\000\001$\000!\218\004\128\001\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\001\000(\194\t\016@\ba\000\000\004\144\000\135h\018\000\0040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\016\002\140 \145\004\000\134\016\000\000I\000\bv\129 \000C\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\001\000\016\002\140 \145\004\000\134\016\000\000I\000\bv\129 \000C\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\001\000(\194\t\016@\ba\000\000\004\144\000\135h\018\000\0040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\016\002\140 \145\004\000\134\016\000\000I\000\bv\129 \000C\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\001\000(\194\t\016@\ba\000\000\004\144\000\135h\018\000\0040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\129\000\000\000\000\128\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000`\004\000\163\b$A\000!\132\000\000\018@\002\029\160H\000\016\192\000\000\000\016\001\000(\194\t\016@\ba\000\000\004\144\000\135h\018\000\0040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\224\004\000\163\b$A\000!\132\000\000\018@\002\029\160H\000\016\192\000\000\000\024\001\000(\194\t\016@\ba\000\000\004\144\000\135h\018\000\0040\000\000\000\004\000@\n0\130D\016\002\024@\000\001$\000!\218\004\128\001\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\001\000(\194\t\016@\ba\000\000\004\144\000\135h\018\000\0040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\004\000\163\b$A\000!\132\000\000\018@\002\029\160H\000\016\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000@\n0\130D\016\002\024@\000\001$\000!\218\004\128\001\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\004\000@\n0\130D\016\002\024@\000\001$\000!\218\004\128\001\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\004\000\163\b$A\000!\132\000\000\018@\002\029\160H\000\016\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\000@\n0\130D\016\002\024@\000\001$\000!\218\004\128\001\012\000\000\000\001\000\016\002\140 \145\004\000\134\016\000\000I\000\bv\129 \000C\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000@\n0\130D\016\002\024@\000\001$\000!\218\004\128\001\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\225\004\000\163\b$A\000!\132\000\000\018@\002\029\160H\000\016\192\000\000\000\024\001\000(\194\t\016@\ba\000\000\004\144\000\135h\018\000\0040\000\000\000\004\000@\n0\130D\016\002\024@\000\001$\000!\218\004\128\001\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\001\000(\194\t\016@\ba\000\000\004\144\000\135h\018\000\0040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\016\002\140 \145\004\000\134\016\000\000I\000\bv\129 \000C\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000@\n0\130D\016\002\024@\000\001$\000!\218\004\128\001\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\004\000\163\b$A\000!\132\000\000\018@\002\029\160H\000\016\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\001\000\000\004\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\b \000\001\000@\000\000 \000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\016\001\000(\194\t\016@\ba\000\000\004\144\000\135h\018\000\0040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\016\002\140 \145\004\000\198\016\000\000I\000\bv\129 \000C\000\000\000\000\000\000\000\001\000\000\000\002\b\000\000@\016\000\000\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\004\000@\n0\130D\016\002\024@\000\001$\000!\218\004\128\001\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\001\000(\194\t\016@\ba\000\000\004\144\000\135h\018\000\0040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\016\002\140 \145\004\000\134\016\000\000I\000\bv\129 \000C\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\001\000(\194\t\016@\ba\000\000\004\144\000\135h\018\000\0040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\016\001\000(\194\t\016@\ba\000\000\004\144\000\135h\018\000\0040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000z\246\175\000\001\000\000\128\000\b\000\016\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\016\000\030\189\171\192\000@\000 \000\002\000\004\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000@\n0\130D\016\003\024@\000\001$\000!\218\004\128\001\012\000\000z\246\175\000\001\004\000\128\000\b \016\000`@\000\000 \000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\016\001\000(\194\t\016@\ba\000\000\004\144\000\135h\018\000\0040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\001\000\000\004\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000@\000\000\000\000\001\000\000\004\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\004\000\000\000\b@\000\001\000@\000\000 \000\000\000\000\000\000\030\189\171\192\000A\000 \000\002\b\004\000\024\016\000\000\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\004\000@\n0\130D\016\002\024@\000\001$\000!\218\004\128\001\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\004\000\163\b$A\0001\132\000\000\018@\002\029\160H\000\016\192\000\007\175j\240\000\016@\b\000\000\130\001\000\006\004\000\000\002\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\001\000\016\002\140 \145\004\000\134\016\000\000I\000\bv\129 \000C\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\235\218\180\000\004\000\002\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\016\002\140 \145\004\000\134\016\000\000I\000\bv\129 \000C\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001(\016\000\000\000\b\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\000@\n0\130D\016\002\024@\000\001$\000!\218\004\128\001\012\000\000\000\001\000\016\002\140 \145\004\000\134\016\000\000I\000\bv\129 \000C\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\000@\n0\130D\016\002\024@\000\001$\000!\218\004\128\001\012\000\000\000\001\128\016\002\140 \145\004\000\134\016\000\000I\000\bv\129 \000C\000\000\000\000@\004\000\163\b$A\000!\132\000\000\018@\002\029\160H\000\016\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\016\002\140 \145\004\000\134\016\000\000I\000\bv\129 \000C\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000@\n0\130D\016\002\024@\000\001$\000!\218\004\128\001\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\004\000\163\b$A\000!\132\000\000\018@\002\029\160H\000\016\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000@\004\000\163\b$A\000!\132\000\000\018@\002\029\160H\000\016\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000@\n0\130D\016\002\024@\000\001$\000!\218\004\128\001\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\004\000\163\b$A\000!\132\000\000\018@\002\029\160H\000\016\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000@\n0\130D\016\002\024@\000\001$\000!\218\004\128\001\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\160@\000\000\000 \000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\001\000(\194\t\016@\ba\000\000\004\144\000\135h\018\000\0040\000\000\000\004\000@\n0\130D\016\002\024@\000\001$\000!\218\004\128\001\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0008\001\000(\194\t\016@\ba\000\000\004\144\000\135h\018\000\0040\000\000\000\006\000@\n0\130D\016\002\024@\000\001$\000!\218\004\128\001\012\000\000\000\001\000\016\002\140 \145\004\000\134\016\000\000I\000\bv\129 \000C\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000@\n0\130D\016\002\024@\000\001$\000!\218\004\128\001\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\001\000(\194\t\016@\ba\000\000\004\144\000\135h\018\000\0040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\016\002\140 \145\004\000\134\016\000\000I\000\bv\129 \000C\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\001\000\016\002\140 \145\004\000\134\016\000\000I\000\bv\129 \000C\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\001\000(\194\t\016@\ba\000\000\004\144\000\135h\018\000\0040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\128\016\002\140 \145\004\000\134\016\000\000I\000\bv\129 \000C\000\000\000\000@\004\000\163\b$A\000!\132\000\000\018@\002\029\160H\000\016\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\016\002\140 \145\004\000\134\016\000\000I\000\bv\129 \000C\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0008A\000(\194\t\016@\ba\000\000\004\144\000\135h\018\000\0040\000\000\000\006\000@\n0\130D\016\002\024@\000\001$\000!\218\004\128\001\012\000\000\000\001\000\016\002\140 \145\004\000\134\016\000\000I\000\bv\129 \000C\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000@\n0\130D\016\002\024@\000\001$\000!\218\004\128\001\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\004\000\163\b$A\000!\132\000\000\018@\002\029\160H\000\016\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\016\002\140 \145\004\000\134\016\000\000I\000\bv\129 \000C\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\001\000(\194\t\016@\ba\000\000\004\144\000\135h\018\000\0040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000@\000\001\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\002\b\000\000@\016\000\000\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\004\000@\n0\130D\016\002\024@\000\001$\000!\218\004\128\001\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\004\000\163\b$A\0001\132\000\000\018@\002\029\160H\000\016\192\000\000\000\000\000\000\000@\000\000\000\130\000\000\016\004\000\000\002\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\001\000\016\002\140 \145\004\000\134\016\000\000I\000\bv\129 \000C\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000@\n0\130D\016\002\024@\000\001$\000!\218\004\128\001\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\004\000\163\b$A\000!\132\000\000\018@\002\029\160H\000\016\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000@\n0\130D\016\002\024@\000\001$\000!\218\004\128\001\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\004\000@\n0\130D\016\002\024@\000\001$\000!\218\004\128\001\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\004\000\163\b$A\0001\132\000\000\018@\002\029\160H\000\016\192\000\007\175j\240\000\016@\b\000\000\130\001\000\006\004\000\000\002\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\001\000\016\002\140 \145\004\000\134\016\000\000I\000\bv\129 \000C\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\016\000\000\000!\000\000\004\001\000\000\000\128\000\000\000\000\000\000z\246\175\000\001\004\000\128\000\b \016\000`@\000\000 \000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\016\001\000(\194\t\016@\ba\000\000\004\144\000\135h\018\000\0040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\016\002\140 \145\004\000\198\016\000\000I\000\bv\129 \000C\000\000\030\189\171\192\000A\000 \000\002\b\004\000\024\016\000\000\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\004\000@\n0\130D\016\002\024@\000\001$\000!\218\004\128\001\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\129\005\164\t\004\003\016\161\028\2270\128\025\234\012\000\017\133\016(`\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\127\254\191\128\001\004\000\128\000\b\000\016\000\003\000\000\000 \000\000\001\128!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000z\246\175\000\001\004\000\128\000\b\000\016\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\002\000\000\000@\016\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000 \000\002\000\000\000\000\000\000\000\020\144\000\018\rB\128g\140\192\000! \016\002\000\016@!\128\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000 \000\000\004\001\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\012\000\000!\128@\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\128\000\000\016\004\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\030\189\171\192\000@\000 \000\002\b\004`\000\016\000\000\000\000\000\128\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005$\000\004\131P\160\025\2270\000\bH\004\000\128\004\016\b`\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\001\235\218\188\000\004\000\002\000\000 \128F\000\001\000\000\000\000\000\b\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\018\000\000\000\000\000\000\000\000\000 \000\002\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\b\000\000\128\000\000\000\000\000\000\005$\000\004\131P\160\025\2270\000\bH\004\000\128\004\016\b`\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\175j\208\000\016@\b\000\000\000\001\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000 \000\000\004\001\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\b\000\000\128\000\000\000\000\000\000\005$\000\004\131P\160\025\2270\000\bH\004\000\128\004\016\b`\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\128\000\000\016\004\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000 \000\002\000\000\000\000\000\000\000\020\144\000\018\rB\128g\140\192\000! \016\002\000\016@!\128\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\b@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\001\255\250\254\b\020ZB\144H5\nq\206?\b\001\158\160\192\t\030Q\134\134\000\000\000$\000\004\012L\019m\146\192\001\000T\000\129 \000\027\160\016\020\029\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000 \001\004\002\025\235\218\188\000\004RB\000H4\nA\1423\000\000\132\128@\b\000A\000\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\t\000\000\003\017\004\216T\176\000\000\005\000 \000\000\006\136\000\005\007p\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000R@\016H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\255\250\254\015\020ZB\144@1\138q\206?\b\001\158\160\192\001\026Q\002\134\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\016\000\000\000\000\000\000\000@\136\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\255\235\248 Qi\nA\000\196)\1998\252 \006z\131\000\004iD\n\025\255\250\254\b\020ZB\144H5\011q\206?\b\001\158\160\192\t\026QB\134z\246\175\000\001\020\144\128\018\r\002\144c\140\192\000! \016\002\000\016@!\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\020\144\000\016\012B\128c\140\128\000a \016\000\000\016@!\128\000\000\000\000\005$\000\004\003\000\160\024\227 \000\024H\004\000\000\004\016\b`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\002\000\016@!\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\001\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001I\000\001\000\192(\0068\200\000\006\018\001\000\000\001\004\002\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\000\000\003\019\004\217d\176\000\000\005\000 @\000\006\168\004\005\007p\000\000\000\000\000@\000\000\000\128\000\000\016\004\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000z\246\175\000\001\020\144\128\018\r\"\144c\156\192\000! \016\002\000\016H!\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000 \000\000\004\001\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\000\000\003\017\004\216D\176\000\000\005\000 \000\000\006\136\000\005\007p\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\002\000\016@!\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002@\000\000\196A6\017,\000\000\001@\b\000\000\001\"\000\001@\220\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000$\000\000\012D\019a\018\192\000\000\020\000\128\000\000\018 \000\020\r\192\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\192\004\016\b`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\002@\000\000\196A6\017,\000\000\001@\b\000\000\001\"\000\001@\220\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000$\000\000\012D\019a\018\192\000\000\020\000\128\000\000\018 \000\020\r\192\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\002@\000\000\196A6\017,\000\000\001@\b\000\000\001\"\000\001@\220\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000$\000\000\012D\019a\018\192\000\000\020\000\128\000\000\018 \000\020\r\192\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\002@\000\000\196A6\017,\000\000\001@\b\000\000\001\"\000\001@\220\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000$\000\000\012D\019a\018\192\000\000\020\000\128\000\000\018 \000\020\r\192\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000$\000\000\012D\019a\018\192\000\000\020\000\128\000\000\018 \000\020\r\192\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\002@\000\000\196A6\017,\000\000\001@\b\000\000\001\"\000\001@\220\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000$\000\000\012D\019a\018\192\000\000\020\000\128\000\000\018 \000\020\r\192\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000$\000\000\012D\019a\018\192\000\000\020\000\128\000\000\018 \000\020\r\192\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\002@\000\000\196A6\017,\000\000\001@\b\000\000\001\"\000\001@\220\000\000\000\000\000R@\000@3\138\001\1903\000\001\132\128@*\000A\004\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\255\250\254\015\020ZB\144@1\138q\206?\b\001\158\160\192\001\026Q\002\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031\255\191\240\241E\164)\004\003\024\183\028\227\241\128\025\234L\000\017\229\028kp\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\255\250\254\b\020ZB\144@1\138q\206?\b\001\158\160\192\001\026Q\002\134\127\254\191\130\005\022\144\164\018\rB\220s\143\194\000g\1680\002F\148P\161\159\255\175\224\129E\164)\004\131P\167\028\227\240\128\025\234\012\000\145\165\016h`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031\255\191\240\129E\1649\004\195P\183\028\227\241\1289\234L\001\209\229\029kp\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\002\004\022\144$\016\012B\132s\140\194\000g\1680\000F\020@\161\128\000\000\000\129\005\164\t\004\003\016\161\028\2270\128\025\234\012\000\017\133\016(`\000\000\000\000\000@\000\000\000\128\000\000\016\004\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001I\000A \208(\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\144\004\018\r\002\128c\140\192\000! \016\002\000\016@!\128\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000 \001\004\130\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\002\004\022\144$\016\012B\132s\140\194\000g\1680\000F\020@\161\128\000\000\000\129\005\164\t\004\003\016\161\028\2270\128\025\234\012\000\017\133\016(`\000\000\000\000\000@\000\000\000\002\000\000\016\004\000\000\002\000\000 \000\000\128\000\000\000\000\000\000\016\000\000\000\000\128\000\004\001\000\000\000\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\136\000\000\000\000\000\000\001\000\000\000\000\b\000\000@\016\000\000\b\000\000\000\000\002\000\000\000\000\000\000\000@\000\000\000\002\000\000\016\004\000\000\002\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\"\000\000\000\000\000\000\000@\000\000\000\002\000\000\016\004\000\000\002\000\000 \000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\136\000\000\000\000\000\000\001\000\000\000\000\b\000\000@\016\000\000\b\000\000\128\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\175j\240\000\017I\b\001 \210)\0069\204\000\002\018\001\000 \001\004\130\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\002\004\022\144$\016\012B\132s\140\194\000g\1680\000F\020@\161\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\127\254\191\130\005\022\144\164\018\rB\156s\143\198\000g\1680\002F\148@\161\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\255\251\255\015\020ZB\144@1\139q\206?\024\001\158\164\192\001\030Q\198\183\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\255\250\254\b\020ZB\144@1\138q\206?\024\001\158\160\192\001\026Q\002\134\000\000\000\000\000\000\000\000\002\001\000\000\000\000\004\000\000\000\000\002\000\000\000\012@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\255\235\248 Qi\nA\000\198)\1998\252`\006z\131\000\004iD\n\220\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\000\001\003\019\004\219d\176\000@\021\000 H\000\006\232\004\005\007p\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\b\004\000\000\000\000\016\000\000\000\000\b\000\000\0001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\255\235\248 Qi\nA \212)\1998\252`\006z\131\000$iD\n\220\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\127\254\191\130\005\022\144\164\016\012b\156s\143\198\000g\1680\000F\148@\173\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\001\235\218\188\000\004RB\000H4\138A\142s\000\000\132\128@\b\000A \134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000R@\000H5\n\001\1583\000\000\132\128@\b\000A\000\134\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000@\000\192\000\002\024\004\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\002\000\000\000@\016\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000z\246\175\000\001\000\000\128\000\b \017\128\000@\000\000\000\000\002\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\144\000\018\rB\128g\140\192\000! \016\002\000\016@!\128\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000z\246\175\000\001\000\000\128\000\b \017\128\000@\000\000\000\000\002\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\b\000\000\128\000\000\000\000\000\000\005$\000\004\131P\160\025\2270\000\bH\004\000\128\004\016\b`\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\175j\208\000\016@\b\000\000\000\001\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000 \000\000\004\001\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\b\000\000\128\000\000\000\000\000\000\005$\000\004\131P\160\025\2270\000\bH\004\000\128\004\016\b`\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\127\254\191\130\005\022\144\164\018\rB\156s\143\198\000g\1680\002F\148@\173\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\b\004\000\000\000\000\016\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031\255\175\224\129E\164)\004\131P\167\028\227\241\128\025\234\012\000\145\165\016(`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\016\0000\000\000\134\001\016\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\b\016Z@\144@1\n\017\2063\b\001\158\160\192\001\024Q\002\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\004\000\000\000\000\000\000\000\000\000\000\001\000\001\255\251\255\b\020ZC\144L5\011q\206?\024\003\158\164\192\025\030Q\214\183\000\000\000\002\004\022\144$\016\012B\132s\140\194\000g\1680\000F\020@\161\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\255\235\248 Qi\nA\000\198-\1998\252 \006z\131\000\004yG\026\024\000\000\000\000\000\000\000\000\b\004\000\000\000\000\000\000\000\000\000\b\000\000\000\000\127\254\191\130\005\022\144\164\016\012b\220s\143\194\000g\1680\000G\148q\161\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@ \016\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\127\254\191\130\005\022\144\164\018\rB\220s\143\194\000g\1680\002G\148q\161\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\255\235\248 Qi\nA \212-\1998\252 \006z\131\000$yG\026\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000@\000\127\254\191\130\005\022\144\164\016\012b\220s\143\194\000g\1680\000F\148P\161\128\000\000\000\000\000\000\000\000\128@\016\000\000\000\000\000\000\000\000\128\000\004\000\007\255\235\248 Qi\nA\000\198-\1998\252 \006z\131\000\004iE\n\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@ \016\004\000\000\000\000\000\000\000\000 \000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\127\254\191\130\005\022\144\164\018\rB\220s\143\194\000g\1680\002F\148P\161\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\001\000\003\000\016\b`\016\000\000\b\000\000\000\000\004\000\000\000\000\000\000\000\000\004\0000\016\000\000\000\000\000\b\000\000\000 \000\000@\005\255\250\254\b\020ZB\144@1\138q\206?\b\001\158\160\192\001\026Q\002\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\000\192@\000\000\000\000\000 \000\000\000\128\000\001\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\255\250\254\b\020ZC\144L5\nq\206?\b\003\158\160\192\t\026Q\018\135\127\254\191\130\005\022\144\164\016\012b\156s\143\194\000g\1680\000F\148@\161\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\255\250\254\b\020ZC\144L5\nq\206?\b\003\158\160\192\t\026Q\018\135\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000@\000\127\254\191\130\005\022\144\164\018\rB\220s\143\194\000g\1680\002F\148P\161\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\b\004\000\000\000\000\016\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031\255\175\224\129E\164)\004\131P\167\028\227\241\128\025\234\012\000\145\165\016(`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\030\255\175\224\000E$)\004\003\000\164\024\227\224\000\024H\004\000\000%\016(`\000\000\000\000\001I\000A \208(\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\191\235\248\000\017I\nA\000\192)\0068\248\000\006\018\001\000\000\tD\n\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000z\246\175\000\001\004\000\128\000\b\000\016\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\002\000\000\000@\016\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\144\000\018\rB\128g\140\192\000! \016\002\000\016@!\128\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\0000\000\000\134\001\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\002\000\000\000@\016\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000z\246\175\000\001\000\000\128\000\b \017\128\000@\000\000\000\000\002\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\144\000\018\rB\128g\140\192\000! \016\002\000\016@!\128\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005$\000\004\131P\160\025\2270\000\bH\004\000\128\004\016\b`\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000:\246\173\000\001\004\000\128\000\000\000\016\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\002\000\000\000@\016\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\144\000\018\rB\128g\140\192\000! \016\002\000\016@!\128\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000@\000{\254\191\128\001\020\144\164\016\012\002\144c\143\128\000a \016\000\000\148@\161\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\128\000\000\016\004\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005$\000\004\131P\160\025\2270\000\bH\004\000\128\004\016\b`\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000$\000\004\012\012\016l\146\192\001\000P\000\001 \000\024\160\016\016\017\128\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\175j\240\000\017I\b\001 \210)\0069\204\000\002\018\001\000 \001\004\130\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001I\000\001 \212(\006x\204\000\002\018\001\000 \001\004\002\024\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\001\000\003\000\000\b`\016\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\b\000\000\001\000@\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\001\235\218\188\000\004\000\002\000\000 \128F\000\001\000\000\000\000\000\b\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000R@\000H5\n\001\1583\000\000\132\128@\b\000A\000\134\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\144\000\018\rB\128g\140\192\000! \016\002\000\016@!\128\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\235\218\180\000\004\016\002\000\000\000\000@\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\b\000\000\001\000@\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000R@\000H5\n\001\1583\000\000\132\128@\b\000A\000\134\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\016\0000\001\000\134\001\000\000\000\128\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\b\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\001\002\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031\255\175\224\129E\164)\004\003\024\167\028\227\240\128\025\234\012\000\017\165\016(`\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\001\255\250\254\b\020ZB\144H5\nq\206?\b\001\158\160\192\t\030Q\134\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\132\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031\255\175\224\000A\000 \000\002\000\004\000\000\192\000\000\b\000\000\000`\b@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000_\255\175\224\129E\164)\004\003\024\167\028\227\240\128\025\234\012\000\017\165\016(`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\255\250\254\b\020ZB\144@1\138q\206?\b\001\158\160\192\001\026Q\002\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\004\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\255\250\254\b\020ZB\144@1\nQ\206?\b\001\158\160\192\001\026Q\002\134z\246\175\000\001\020\144\128\016\012\002\144c\140\128\000a \016\000\000\016@!\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\005\255\250\254\b\020ZB\144@1\nQ\206?\b\001\158\160\192\001\026Q\002\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\255\235\248 Qi\nA\000\196)G8\252 \006z\131\000\004iD\n\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\002\000\016@!\128\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\127\254\191\128\001\004\000\128\000\b\000\016\000\003\000\000\000 \000\000\000\128\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\023\255\235\248\000\016@\b\000\000\128\001\000\0000\000\000\002\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\127\254\191\128\001\004\000\128\000\b\000\016\000\003\000\000\000 \000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\235\218\188 \014 \130D\144!\000\192\000\001$\000!J\020\128\001\140\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\016\001\000(\130\t\016@\000@\000\000\000\144\000\135h\018\000\0040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\016\001\000(\130\001\016@\000@\000\000\000\144\000\135h\018\000\0040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\002\000\000\000\001\000\016\002\136 \145\004\000\004\000\000\000\t\000\bv\129 \000C\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\128\000\b\000\000\000\000\000\000\128\002\002\000\000\000\000\000\004\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\136\000\000\000\000\000\000\128\002\002\000\000\000\000\000\004\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\030\189\171\192\000\224\b$A\002\016\012\000\000\018@\002\020\129H\000\024\192\000\007\175j\240\0008\002\b\000@\132\003\000\000\004\144\000\133 R\000\0060\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\016\002\136 \145\132\000\004\000\000\000\t\000\bv\129 \000C\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\001\000(\130\t\016@\000@\000\000\000\144\000\135h\018\000\0040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\128\000\000\000@\004\000\162\b$A\000\001\000\000\000\002@\002\029\160H\000\016\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\128\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\128\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\004\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\030\189\171\192\000\224\b$\001\002\016\012\000\000\018@\002\020\129H\000\024@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\235\218\188\000\014\000\130\000\016!\000\192\000\001$\000!H\020\128\001\132\000\000\000\001\000\016\002\136 \145\004\000\004\000\000\000\t\000\bv\129 \000C\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\b\016\000\000\004\000@\n \130D\016\000\016\000\000\000$\000!\218\004\128\001\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000@\n \130D\016\000\016\000\000\000$\000!\218\004\128\001\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\001\000(\130\t\016@\000@\000\000\000\144\000\135h\018\000\0040\000\000\000\004\000@\n \130D\016\000\016\000\000\000\164\000!\218\004\128\001\014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\016\002\136 \145\004\000\004\000\000\000\t\000\bv\129 \000C\000\000\000\000@\004\000\162\b$A\000!\000\000\000\n@\002\029\160H\000\016\224\000\000\000\016\001\000(\130\t\016@\000@\000\000\000\144\002\135h\018\000\0040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\016\001\000(\130\t\016@\000@\000\000\000\144\000\135h\018\000\0040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\030\189\171\192\000@\000 \000\002\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\004\000z\246\175\000\001\000\000\128\000\b\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\004\000@\n \130D\016\000\024\000\000\000$\000!\218\004\128\001\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\004\000\162\b$A\000\001\000\000\000\002@\002\029\160H\000\016\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\000\000\000\000\000\000\000\000@\004\000\162\b$A\000\001\000\000\000\002@\002\029\160H\000\016\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\002\000\000\000\001\000\016\002\136 \145\004\000\004\000\000\000\t\000\bv\129 \000C\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\000\000\000\000\001\000\000\000\002\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000@\n \130D\016\001\016\000\000\000$\000!\218\004\128\001\012\000\000\000\001\000\016\002\136 \145\004\000\004\000\000\000\t\000\bv\129 \000C\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\001\000(\130\t\016@\000@\000\000\000\144\000\135h\018\000\0040\000\000\000\004\000@\011\160\130D\016\000P\000\000\000\164\000!\218\004\128\001\014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\016\002\136 \145\004\000\004\000\000\000\t\000\bv\129 \000C\000\000\000\000@\004\000\162\b$A\000!\000\000\000\n@\002\029\160H\000\016\224\000\000\000\016\001\000(\130\t\016@\000@\000\000\000\144\002\135h\018\000\0040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\001\000\016\002\136 \145\004\000\004\000\000\000\t\000\bv\129 \000C\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000@\138 \130D\016\000\016\000\000\000$\000!\218\004\128\001\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\128\000\000\000@\004\b\162\b$A\000\001\000\000\000\002@\002\029\160H\000\016\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\128\000\000\000\000@\000\000\000\128\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000@\n \130D\016\000\016\000\000\000$\000!\218\004\128\001\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\001\000(\130\t\016@\000@\000\000\000\144\000\135h\018\000\0040\000\000\000\004\000@\n \130D\016\002\016\000\000\000\164\000!\218\004\128\001\014\000\000\000\001\000\016\002\136 \145\004\000\004\000\000\000\t\000(v\129 \000C\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\016\001\000(\130\t\016@\000@\000\000\000\144\000\135h\018\000\0040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\128B\004\000\162\b$A\000\001\128\000\000\002@\002\029\160H\000\016\192\000\000\000\016\001\000(\130\t\016@\000`\000\000\000\144\000\135h\018\000\0040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\016\002\136 \145\004\000\006\000\000\000\t\000\bv\129 \000C\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\001\000(\146\t\016@\t@\000\000\002\144\000\135h\018\000\0048\000\000\000\004\000@\n \130D\016\000\016\000\000\000$\000\161\218\004\128\001\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000@\004\000\162\b$A\000\001\000\000\000\002@\002\029\160H\000\016\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\001\000(\130\t\016@\000`\000\000\000\144\000\135h\018\000\0040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\016\002\136 \145\004\000\006\000\000\000\t\000\bv\129 \000C\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\002\000\000\000\001\000\016\002\136 \145\004\000\004\000\000\000\t\000\bv\129 \000C\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\001\000\000\000\002\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\002\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000@\000\000\000\000\000  \000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\b\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\016\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\128\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\004\000\162\b$A\000\001\000\000\000\002@\002\029\160H\000\016\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\002\000\000\000\001\000\016\002\136 \145\004\000\004\000\000\000\t\000\bv\129 \000C\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\016\000\000\000\001\000\000\000\002\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\004\000\162\b$A\000\001\000\000\000\002@\002\029\160H\000\016\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\016\002\136 \145\004\000\004\000\000\000\t\000\bv\129 \000C\000\000\000\000@\004\000\186\b$A\000\005\000\000\000\n@\002\029\160H\000\016\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\001\000(\130\t\016@\000@\000\000\000\144\000\135h\018\000\0040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\030\189\235\196\000\226\b$A\002\017\004\000\000\018@\002\029\160H\000\016\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\004\000@\n \128D\016\000\016\000\000\000$\000!\218\004\128\001\012\000\000\000\001\000\016\002\233 \145\004\000\150\000\000\000)\000\bv\129 \000C\128\000\000\000@\004\000\162\b$A\000!\000\000\000\002@\002\029\160H\000\016\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\016\002\136 \145\004\000\004\000\000\000\t\000\bv\129 \000C\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\007\175z\241\0008\130\t\016@\132a\000\000\004\144\000\135h\018\000\0040\000\000\000\004\000@\n \130D\016\000\016\000\000\000$\000!\218\004\128\001\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\001\000(\130\t\016@\000@\000\000\000\144\000\135h\018\000\0040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000@\n \130D\016\000\016\000\000\000$\000!\218\004\128\001\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\175j\240\1288\130\t\018@\132\003\000\000\004\144\000\133(R\000\0060\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005$\000\004\131@\224\024\2270\000\bH\004\000\128\004\016\b`\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031\255\191\240\129E\164)\004\131\208\231\028\227\240\128\025\234L\000\145\165\016+p\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\255\251\255\b\020ZB\144H=\nq\206?\b\001\158\164\192\t\026Q\002\183{\254\255\192\001\000\000\128\000\b\000\016\000\000\000\000\000\001\000\000\000\000\000\000\030\255\191\240\000@\000 \000\002\000\004\000\000\000\000\000\000@\000\000\000\000\000\007\191\239\252\000\016\000\b\000\000\128\001\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\bP\192\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000B\0200\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\016\133\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\004!C\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\255\235\248<Qi\nA\000\198)\1998\252 \006z\131\000\004iD\n\025\255\250\254\b\020ZB\144@1\138q\206?\b\001\158\160\192\001\026Q\002\134\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031\255\175\224\129E\164)\004\003\024\167\028\227\240\128\025\234\012\000\017\165\016+p\000\000\000\000\000\000\000\000 \016\000\000\000\000\000\000\000\000\000 \000\000\000\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\128@\000\000\000\000\000\000\000\000\000\128\000\000\003\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\255\250\254\b\020ZB\144H5\nq\206?\b\001\158\160\192\t\026Q\002\183\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005$\000\004\0038\160\027\2270\000\024H\004\002\160\004\016H`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\127\254\191\131\197\022\144\164\016\012b\156s\143\194\000g\1680\000F\148@\161\159\255\175\224\129E\164)\004\003\024\167\028\227\240\128\025\234\012\000\017\165\016(`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\001\255\250\254\b\020ZB\144@1\138q\206?\b\001\158\160\192\001\026Q\002\183\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031\255\175\224\241E\164)\004\003\024\167\028\227\240\128\025\234\012\000\017\165\016(g\255\235\248 Qi\nA\000\198)\1998\252 \006z\131\000\004iD\n\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\191\239\252\000\016@\b\000\000\128\001\000\000\000\000\000\002\016\000\000\000\000\000\000\004!C\000\000\016\000\000\0000\000\000\134\001\000\000\000\132\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\b\000\000!\128@\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\175j\240\000\016\000\b\000\000\130\001\024\000\004\000\000\000\000\000 \000\000\128\001\235\218\188\000\004\000\002\000\000 \128F\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\"\000\007\175j\240\000\016\000\b\000\000\130\001\024\000\004\000\000\000\000\000\000\000\000\128\001\235\218\188\000\004\000\002\000\000 \128F\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\136\000\030\189\171\192\000@\000 \000\002\b\004`\000\016\000\000\000\000\000\128\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\012\000\000\001\000@\000\000 \000\000\000\000\136\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\128\000\000\016\004\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\136\000\030\189\171\192\000@\000 \000\002\b\004`\000\016\000\000\000\000\000\128\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\031\255\175\224\129E\164)\004\131P\167\028\227\240\128\025\234\012\000\145\165\016h`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\128@\000\000\000\000\000\000\000\000\000\128\000\000\003\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\255\250\254\b\020ZB\144H5\nq\206?\b\001\158\160\192\t\026Q\002\183\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000B\0200\000\001\000\001\000\003\000\000\b`\016\000\000\b@\000\000\000\000\003\016\000\000\000\000\000\000  \b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\144\000\018\r\003\128c\140\192\000! \016\002\000\016@!\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\127\254\255\194\005\022\144\164\018\015C\156s\143\194\000g\1690\002F\148@\173\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\255\239\252 Qi\nA \244)\1998\252 \006z\147\000$iD\n\220\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\127\254\255\194\005\022\144\164\016\012b\156s\143\194\000g\1690\000F\148@\173\192\000\000\000\000\000\000\000\000\128@\000\000\000\000\000\000\000\000\000\128\000\000\003\023\255\239\252 Qi\nA\000\198)\1998\252 \006z\147\000\004iD\n\220\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\127\254\255\194\005\022\144\164\018\rB\156s\143\194\000g\1690\002F\148@\173\223\255\191\240\129E\164)\004\003\024\167\028\227\240\128\025\234L\000\017\165\016+p\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\b\004\000\000\000\000\000\000\000\000\000\b\000\000\0001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031\255\191\240\129E\164)\004\131P\167\028\227\240\128\025\234L\000\145\165\016+p\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\255\251\255\b\020ZB\144H5\nq\206?\b\001\158\164\192\t\026Q\002\183\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031\255\191\240\129E\164)\004\131P\167\028\227\240\128\025\234L\000\145\165\016+p\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004!C\000\000\016\000\016\0000\000\000\134\001\000\000\000\132\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031\255\191\240\129E\164)\004\131P\167\028\227\240\128\025\234L\000\145\165\016+p\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\b\004\000\000\000\000\000\000\000\000\000\b\000\000\0001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031\255\191\240\129E\164)\004\131P\167\028\227\240\128\025\234L\000\145\165\016+p\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004!C\000\000\016\000\016\0000\000\000\134\001\000\000\000\132\000\000\000\000\0001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\016\000\000\000\000\000\000\000\000\001\002D\184\001\128\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\002\000\000\001\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\016 \000\000\000\000\000\000\000\001\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\001\002\000\000\000\000\000\000\000\000\016\000\000\000\b\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\004\b\000\000\000\000\000\000\000\000@\000\000\000 \000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\002\000@\000\000\000\000\000\000\b\000\000@\128\000\000\000\000\000\000\000\004\000\000\000\002\000\000\000\000\000@\000\000\000\001\000\000\000\000\000\000\000\000\001\006\000@\000 \020\000\000\000\000\000\000\000\128\000\004\b\000\000\000\000\000\000\000\000@\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\016\000\000\000\000\000\000\000\000\016`\004\000\000\001@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000C\128\024\000\000\004\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\001\006\000`\000\000\016\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000A\128\016\000\000\004\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\024\001\000\b\000@\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\024\001\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016`\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000C\128\024\000\000\004\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\016`\006\000\000\001\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\004\024\001\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\006\000@\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000A\128\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000A\128\024\000\000\004\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\016`\004\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\024\001\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\006\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000")
+    (194, "\000\000\000\0000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\000\000\000\000\000\000\000\000 \000\002\000A\128\000\000\129\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\240\000\000\000\000\000\000\000\001\235\218\188\000\004\000\002\000\000 \000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000B\0200\000\001\000\017\000\003\000\144\b`\017\000 \b@\000\000\000&C\016\016\149\r\000(\194\rP@\200e\002\024\004\208\b\135x\018\000\0049\144\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000F\180p\000\001\0001\000\003\000\020\b`\017\000 \b@\000\000\000&C\016\016\141\012\000\000@\004@\000\192$\002\024\004@\b\002\016\000\000\000\t\144\196\004!C\000\000\016\001\016\0000\t\000\134\001\016\002\000\132\000\000\000\002d1\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\173\012\000\000@\004@\000\192$\002\024\004@\b\002\016\000\000\000\t\144\196\004#C\000\000\016\001\016\0000\t\000\134\001\016\002\000\132\000\000\000\002d1\001\bP\192\000\004\000D\000\012\002@!\128D\000\128!\000\000\000\000\153\012@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004!C\000\000\016\001\016\0000\t\000\134\001\016\002\000\132\000\000\000\002d1\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\133\012\000\000@\004@\000\192$\002\024\004@\b\002\016\000\000\000\t\144\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\bP\192\000\004\000D\000\012\002@!\128D\000\128!\000\000\000\000\153\012@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\001\bP\192\000\004\000D\000\012\002@!\128D\000\128!\000\000\000\000\153\012@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\133\012\000\000@\004@\000\192$\002\024\004@\b\002\016\000\000\000\t\144\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\133\012\000\000@\004@\000\192$\002\024\004@\b\002\016\000\000\000\t\144\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\bP\192\000\004\000D\000\012\002@!\128D\000\128!\000\000\000\000\153\012@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\173\028\000\000@\012@\000\192\005\002\024\004@\b\002\016\000\000\000\t\144\196\004#C\000\000\016\001\016\0000\t\000\134\001\016\002\000\132\000\000\000\002d1\001\bP\192\000\004\000D\000\012\002@!\128D\000\128!\000\000\000\000\153\012@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004+C\000\000\016\001\016\0000\t\000\134\001\016\002\000\132\000\000\000\002d1\001\b\208\192\000\004\000D\000\012\002@!\128D\000\128!\000\000\000\000\153\012@B\0200\000\001\000\017\000\003\000\144\b`\017\000 \b@\000\000\000&C\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\bP\192\000\004\000D\000\012\002@!\128D\000\128!\000\000\000\000\153\012@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004!C\000\000\016\001\016\0000\t\000\134\001\016\002\000\132\000\000\000\002d1\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000B\0200\000\001\000\017\000\003\000\144\b`\017\000 \b@\000\000\000&C\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000B\0200\000\001\000\017\000\003\000\144\b`\017\000 \b@\000\000\000&C\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004!C\000\000\016\001\016\0000\t\000\134\001\016\002\000\132\000\000\000\002d1\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000B40\000\001\000\017\000\003\000\144\b`\017\000 \b@\000\000\000&C\016\016\133\012\000\000@\004@\000\192$\002\024\004@\b\002\016\000\000\000\t\144\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000B\0200\000\001\000\017\000\003\000\144\b`\017\000 \b@\000\000\000&C\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004+S\000\000\016\001\016\0000\t\000\134\001\016\002\000\132\000\000\000\002d1\001\b\208\192\000\004\000D\000\012\002@!\128D\000\128!\000\000\000\000\153\012@B\0200\000\001\000\017\000\003\000\144\b`\017\000 \b@\000\000\000&C\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\bP\192\000\004\000D\000\012\002@!\128D\000\128!\000\000\000\000\153\012@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\133\012\000\000@\004@\000\192$\002\024\004@\b\002\016\000\000\000\t\144\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000B\0200\000\001\000\017\000\003\000\144\b`\017\000 \b@\000\000\000&C\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004!C\000\000\016\001\016\0000\t\000\134\001\016\002\000\132\000\000\000\002d1\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\016\000\000@\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000 \128\000\004\001\000\000\000\128\000\b\000\000\000\000\000\000\000\000\000\004\000\000\000\b\000\000\001\000@\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\001\000\000\000\002\000\000\000@\016\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\130\000\000\016\004\000\000\002\000\000 \000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\004\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\002\000\000\000@\016\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\b\000\000\129\000\000\000\000\000\000\001\000\000\000\000\000\000\000\1940\000\b\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 @\000\000\000\000\000\000@\000\000\000\130\000\000\016\004\000\000\002\000\000 \000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\129\000\000\000\000\000\000\001\000\000\000\002\b\000\000@\016\000\000\b\000\000\000\000\000@\000\000\000\000\000\000@\000\000\000\130\000\000\016\004\000\000\002\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\129\000\000\000\000\000\000\001\000\000\000\002\b\000\000@\016\000\000\b\000\000\128\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\016\133\012\000\000@\004@\000\192$\002\024\004@\b\002\016\000\000\000\t\144\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\bP\192\000\004\000D\000\012B@!\128D\000\128!\000\000\000\000\153\012@\000\000\000\000\001\000\000\000\002\b\000\000@\016\000\000\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\004!C\000\000\016\001\016\0000\t\000\134\001\016\002\000\132\000\000\000\002d1\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\133\012\000\000@\004@\000\192$\002\024\004@\b\002\016\000\000\000\t\144\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000B\0200\000\001\000\017\000\003\000\144\b`\017\000 \b@\000\000\000&C\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004!C\000\000\016\001\016\0000\t\000\134\001\016\002\000\132\000\000\000\002d1\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\004!C\000\000\016\001\016\0000\t\000\134\001\016\002\000\132\000\000\000\002d1\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\030\189\171\192\000@\000 \000\002\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\016\133\012\000\000@\004@\000\196$\002\024\004@\b\002\016\000\000\000\t\144\197\235\218\188\000\004\016\002\000\000 \128@\001\129\000\000\000\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\030\189\171\192\000A\000 \000\002\000\004\000\024\016\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000A\000\000\000\002\016\000\000@\016\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\235\218\188\000\004\016\002\000\000 \128@\001\129\000\000\000\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\030\189\171\192\016A\000 \000\002\b\004\000\024\016\000\000\b\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\001\235\218\188\000\004\016\002\000\000 \000@\001\129\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\128\000\000\016\004\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\002\000\000\000\000\000\000\000\000\000 \000\002 \000\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\002\000\016B!\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\002\000\016@!\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000\000\001\004\002\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\002\000\016@!\128\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\bg\175j\240\000\017I\b\001 \208)\0068\204\000\002\018\001\000 \001\004\002\025\235\218\188\000\004RB\000H4\nA\1423\000\000\132\128@\b\000A\000\134\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\000\000\016@!\128\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\bg\175j\240\000\017I\b\001 \208)\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\000\000\000@\000\000\000\000\000\000\016\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\000\000\003\019\004\217d\176\000\000\005\000 @\000\006\232\004'\199p\000\000\000\000\000@\000\000\000\128\000\000\016\004\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000z\246\175\000\001\020\144\128\018\r\"\144c\156\192\000! \016\002\000\016H!\158\189\171\192\000E$ \004\131@\164\024\2270\000\bH\004\000\128\004\016\b`\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000$\000\000\012L\019e\146\192\000\000\020\000\129\000\000\027\160\016\159\029\192\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\002@\000\000\196A6\017,\000\000\001@\b\000\000\001\178\000\t\225\220\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000$\000\000\012D\019a\018\192\000\000\020\000\128\000\000\027 \000\158\029\192\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\000\000\003\017\004\216D\176\000\000\005\000 \000\000\004\200\000'\131p\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000$\000\000\012D\019a\018\192\000\000\020\000\128\000\000\019 \000\158\r\192\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\002@\000\000\196A6\017,\000\000\001@\b\000\000\0012\000\t\240\220\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000$\000\000\012D\019a\018\192\000\000\020\000\128\000\000\019 \000\159\r\192\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\002@\000\000\196A6\017,\000\000\001@\b\000\000\0012\000\t\240\220\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000$\000\000\012D\019a\018\192\000\000\020\000\128\000\000\019 \000\159\r\192\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\002@\000\000\196A6\017,\000\000\001@\b\000\000\0012\000\t\240\220\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000$\000\000\012D\019a\018\192\000\000\020\000\128\000\000\019 \000\159\r\192\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\002@\000\000\196A6\017,\000\000\001@\b\000\000\0012\000\t\240\220\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000$\000\000\012D\019a\018\192\000\000\020\000\128\000\000\019 \000\159\r\192\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\192\004\016\b`\000\000\000\000\000\000\004@\000\000\004\000\000\000@\b\000\000\0000\000\t\160\196\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\002\000\016@!\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\002@\000\000\196A6\017,\000\000\001@\b\000\000\0012\000\t\224\220\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000$\000\000\012D\019a\018\192\000\000\020\000\128\000\000\019 \000\158\r\192\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\002@\000\000\196A6\017,\000\000\001@\b\000\000\0012\000\t\224\220\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000$\000\000\012D\019a\018\192\000\000\020\000\128\000\000\019 \000\158\r\192\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\002@\000\000\196A6\017,\000\000\001@\b\000\000\0012\000\t\240\220\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000$\000\000\012D\019a\018\192\000\000\020\000\128\000\000\019 \000\159\r\192\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\002@\000\000\196A6\017,\000\000\001@\b\000\000\0012\000\t\240\220\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000$\000\000\012D\019a\018\192\000\000\020\000\128\000\000\019 \000\158\r\192\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\002@\000\000\196A6\017,\000\000\001@\b\000\000\0012\000\t\224\220\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\002@\000\000\196A6\017,\000\000\001@\b\000\000\0012\000\t\224\220\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000$\000\000\012D\019a\018\192\000\000\020\000\128\000\000\019 \000\158\r\192\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\002@\000\000\196A6\017,\000\000\001@\b\000\000\0012\000\t\224\220\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\002@\000\000\196A6\017,\000\000\001@\b\000\000\0012\000\t\224\220\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000$\000\000\012D\019a\018\192\000\000\020\000\128\000\000\019 \000\158\r\192\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\002\000\016@!\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\002\000\000\000@\016\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000@\000z\246\175\000\001\000\000\128\000\b\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\175j\208\000\016\000\b\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\004!C\000\000\016\001\016\0000\t\000\134\001\016\002\000\132\000\000\000\002d1\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\160@\000\000\000 \000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\016\141\012\000\000@\004@\000\192$\002\024\004@\b\002\016\000\000\000\t\144\196\004!C\000\000\016\001\016\0000\t\000\134\001\016\002\000\132\000\000\000\002d1\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\173\012\000\000@\004@\000\192$\002\024\004@\b\002\016\000\000\000\t\144\196\004#C\000\000\016\001\016\0000\t\000\134\001\016\002\000\132\000\000\000\002d1\001\bP\192\000\004\000D\000\012\002@!\128D\000\128!\000\000\000\000\153\012@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004!C\000\000\016\001\016\0000\t\000\134\001\016\002\000\132\000\000\000\002d1\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\133\012\000\000@\004@\000\192$\002\024\004@\b\002\016\000\000\000\t\144\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\bP\192\000\004\000D\000\012\002@!\128D\000\128!\000\000\000\000\153\012@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\001\bP\192\000\004\000D\000\012\002@!\128D\000\128!\000\000\000\000\153\012@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\133\012\000\000@\004@\000\192$\002\024\004@\b\002\016\000\000\000\t\144\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\bP\192\000\004\000D\000\012\002@!\128D\000\128!\000\000\000\000\153\012@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\133\012\000\000@\004@\000\192$\002\024\004@\b\002\016\000\000\000\t\144\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\129\000\000\000\000\128\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000B40\000\001\000\017\000\003\000\144\b`\017\000 \b@\000\000\000&C\016\016\133\012\000\000@\004@\000\192$\002\024\004@\b\002\016\000\000\000\t\144\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000B\1800\000\001\000\017\000\003\000\144\b`\017\000 \b@\000\000\000&C\016\016\141\012\000\000@\004@\000\192$\002\024\004@\b\002\016\000\000\000\t\144\196\004!C\000\000\016\001\016\0000\t\000\134\001\016\002\000\132\000\000\000\002d1\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\133\012\000\000@\004@\000\192$\002\024\004@\b\002\016\000\000\000\t\144\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000B\0200\000\001\000\017\000\003\000\144\b`\017\000 \b@\000\000\000&C\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004!C\000\000\016\001\016\0000\t\000\134\001\016\002\000\132\000\000\000\002d1\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\004!C\000\000\016\001\016\0000\t\000\134\001\016\002\000\132\000\000\000\002d1\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000B\0200\000\001\000\017\000\003\000\144\b`\017\000 \b@\000\000\000&C\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004#C\000\000\016\001\016\0000\t\000\134\001\016\002\000\132\000\000\000\002d1\001\bP\192\000\004\000D\000\012\002@!\128D\000\128!\000\000\000\000\153\012@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004!C\000\000\016\001\016\0000\t\000\134\001\016\002\000\132\000\000\000\002d1\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000B\1810\000\001\000\017\000\003\000\144\b`\017\000 \b@\000\000\000&C\016\016\141\012\000\000@\004@\000\192$\002\024\004@\b\002\016\000\000\000\t\144\196\004!C\000\000\016\001\016\0000\t\000\134\001\016\002\000\132\000\000\000\002d1\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\133\012\000\000@\004@\000\192$\002\024\004@\b\002\016\000\000\000\t\144\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\bP\192\000\004\000D\000\012\002@!\128D\000\128!\000\000\000\000\153\012@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004!C\000\000\016\001\016\0000\t\000\134\001\016\002\000\132\000\000\000\002d1\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000B\0200\000\001\000\017\000\003\000\144\b`\017\000 \b@\000\000\000&C\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\001\000\000\004\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\b \000\001\000@\000\000 \000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\016\133\012\000\000@\004@\000\192$\002\024\004@\b\002\016\000\000\000\t\144\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\bP\192\000\004\000D\000\012B@!\128D\000\128!\000\000\000\000\153\012@\000\000\000\000\001\000\000\000\002\b\000\000@\016\000\000\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\004!C\000\000\016\001\016\0000\t\000\134\001\016\002\000\132\000\000\000\002d1\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\133\012\000\000@\004@\000\192$\002\024\004@\b\002\016\000\000\000\t\144\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\bP\192\000\004\000D\000\012\002@!\128D\000\128!\000\000\000\000\153\012@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\133\012\000\000@\004@\000\192$\002\024\004@\b\002\016\000\000\000\t\144\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\016\133\012\000\000@\004@\000\192$\002\024\004@\b\002\016\000\000\000\t\144\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\bP\192\000\004\000D\000\012B@!\128D\000\128!\000\000\000\000\153\012^\189\171\192\000A\000 \000\002\b\004\000\024\016\000\000\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000B\0200\000\001\000\017\000\003\000\144\b`\017\000 \b@\000\000\000&C\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\235\218\188\000\004\016\002\000\000 \128@\001\129\000\000\000\128\000\b\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\175j\240\000\016@\b\000\000\130\001\000\006\004\000\000\002\000\000\000\000\000\016\001\235\218\188\000\004\016\002\000\000 \128@\001\129\000\000\000\128\000\b\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\003\000\000\000@\016\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000 \000\000\004\001\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\175j\240\000\016\000\b\000\000\130\001\024\000\004\000\000\000\000\000 \000\000\128\001\235\218\188\000\004\000\002\000\000 \128F\000\001\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002 \000z\246\175\000\001\000\000\128\000\b \017\128\000@\000\000\000\000\000\000\000\b\000\030\189\171\192\000@\000 \000\002\b\004`\000\016\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\128\001\235\218\188\000\004\000\002\000\000 \128F\000\001\000\000\000\000\000\b\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\0000\000\000\004\001\000\000\000\128\000\000\000\002 \000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\002\000\000\000@\016\000\000\b\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\001\235\218\188\000\004\000\002\000\000 \128F\000\001\000\000\000\000\000\b\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\175j\240\000\016\000\b\000\000\130\001\024\000\004\000\000\000\000\000 \000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\"\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\002\000\000\000\000\000\000\000\000\000 \000\002 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\128\001\235\218\188\000\004\000\002\000\000 \128F\000\001\000\000\000\000\000\b\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000:\246\173\000\001\004\000\128\000\000\000\016\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000A\000\000\000\002\016\000\000@\016\000\000\b\000\000\000\000\000\000\007\175j\240\000\016@\b\000\000\130\001\000\006\004\000\000\002\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\001\bP\192\000\004\000D\000\012\002@!\128D\000\128!\000\000\000\000\153\012@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\133\012\000\000@\004@\000\196$\002\024\004@\b\002\016\000\000\000\t\144\197\235\218\188\000\004\016\002\000\000 \128@\001\129\000\000\000\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000B\0200\000\001\000\017\000\003\000\144\b`\017\000 \b@\000\000\000&C\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\002\000\000\000@\016\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\030\189\171\192\000E$ \004\131@\164\024\2270\000\bH\004\000\128\004\016\b`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\005$\000\004\131P\160\024\2270\000\bH\004\000\000\004\016\b`\000\000\000\000\001I\000\001 \222(\006\248\204\000\006\018\001\000\168\001\004\018\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\002\000\016@!\158\189\171\192\000E$ \004\131@\164\024\2270\000\bH\004\000\128\004\016\b`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\b\000\000\003\000\004\024\020\160\000\000\004\000\000\000\000\004\b\000 @`\000\000\000\000\001I\000\001 \222(\006\248\204\000\006\018\001\000\168\001\004\018\024\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\000\000A\000\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\002\000\016@!\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\016\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\000\000\016@!\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\144\000\0000 E\146J\000\000\000@\000\004\000\000j\128B0F\000\000\000\000\000\004\000\000\000\b\000\000\001\000@\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\175j\240\000\017I\b\001 \210)\0069\204\000\002\018\001\000 \001\004\130\025\235\218\188\000\004RB\000H4\138A\142s\000\000\132\128@\b\000A\000\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\"\000\007\175j\240\000\017I\b\001 \210)\0069\204\000\002\018\001\000\000\001\004\130\025\235\218\188\000\004RB\000H4\138A\142s\000\000\132\128@\b\000A\000\134\000\000\000$\000\000\012\000\017`\018\128\000\000\016\000\000\000\000\026 \000\140\017\128\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002@\000\000\192\001\022\001(\000\000\001\000\000\000\000\001\"\000\b\192\024\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000$\000\000\012\000\017`\018\128\000\000\016\000\000\000\000\018 \000\140\001\128\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\192\004\016\b`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\002@\000\000\192\001\022\001(\000\000\001\000\000\000\000\001\"\000\b\192\024\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000$\000\000\012\000\017`\018\128\000\000\016\000\000\000\000\018 \000\140\001\128\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\002@\000\000\192\001\022\001(\000\000\001\000\000\000\000\001\"\000\b\192\024\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000$\000\000\012\000\017`\018\128\000\000\016\000\000\000\000\018 \000\140\001\128\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\002@\000\000\192\001\022\001(\000\000\001\000\000\000\000\001\"\000\b\192\024\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000$\000\000\012\000\017`\018\128\000\000\016\000\000\000\000\018 \000\140\001\128\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000$\000\000\012\000\017`\018\128\000\000\016\000\000\000\000\018 \000\140\001\128\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\002@\000\000\192\001\022\001(\000\000\001\000\000\000\000\001\"\000\b\192\024\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000$\000\000\012\000\017`\018\128\000\000\016\000\000\000\000\018 \000\140\001\128\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000$\000\000\012\000\017`\018\128\000\000\016\000\000\000\000\018 \000\140\001\128\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\002@\000\000\192\001\022\001(\000\000\001\000\000\000\000\001\"\000\b\192\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002 \000z\246\175\000\001\020\144\128\018\r\"\144c\156\192\000! \016\002\000\016H!\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002 \000z\246\175\000\001\020\144\128\018\r\"\144c\156\192\000! \016\002\000\016H!\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000 \000\000\004\001\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\b\000\002\016\000\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\000\000\016@!\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\128\000\001\000\000\000\000\000\004\001I\000\001 \208(\0068\204\000\002\018\001\000\000\001\004\002\024\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\002\000\016@!\128\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\000\000\016@!\128\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\128\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\002\000\016@!\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\235\218\188\000\004RB\000H4\nA\1423\000\000\132\128@\b\000A\000\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000R@\000@1\n\001\1422\000\001\132\128@\000\000A\000\134\000\000\000\000\000\020\144\000\018\r\226\128o\140\192\000a \016\n\128\016A!\128\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\000\004\016\b`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\002\000\016@!\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\128\000\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001I\000\001 \222(\006\248\204\000\006\018\001\000\168\001\004\018\024\000\000\000\000\000R@\000H7\138\001\1903\000\001\132\128@*\000A\000\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000$\000\000\012L\019e\146\192\000\000\020\000\129\000\000\027\160\016\149\029\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 @\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000R@\000H5\n\001\1583\000\000\132\128@\b\000A\000\134\000\000\000\000\000\020\144\000\018\r\226\128o\140\192\000a \016\n\128\016A!\128\000\000\000\000\001\000\000\000\002\000\000\000@\016\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\001\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002@\000\000\196\1936Y,\000\000\001@\b\016\000\001\186\001\tQ\220\000\000\000\000\000R@\000@0\n\001\1422\000\001\132\128@\000\000A\000\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\192\129\006I(\000\000\001\000\000\016\000\001\n\001\b\016\024\000\000\000\000\000\016\000\000\000 \000\000\004\001\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\030\189\171\192\000E$ \004\131H\164\024\2310\000\bH\004\000\128\004\018\b`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\002\000\016@!\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\b\000\000\001\000@\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002@\000\000\192\193\006I,\000\000\001\000\000\016\000\001\154\001\t\017\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\001I\000\001 \220(\006\248\204\000\006\018\001\000\136\001\004\002\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\020\144\000\018\r\194\128o\140\192\000a \016\b\128\016@!\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\136\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\003\000\004\024\004\160\000\000\004\000\000\000\000\004\b\000 @`\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\128\000\0000\000A\128J\000\000\000@\000\000\000\000@\128\002\004\006\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\002\000\016@!\128\000\000\b\000\000\003\000\004\024\004\160\000\000\004\000\000\000\000\004\b\000 @`\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\128\000\0000\000A\128J\000\000\000@\000\000\000\000@\128\002\004\006\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\002\000\016@!\128\000\000\b\000\000\003\000\004\024\004\160\000\000\004\000\000\000\000\004\b\000 @`\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\128\000\0000\000A\128J\000\000\000@\000\000\000\000@\128\002\004\006\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\002\000\016@!\128\000\000\b\000\000\003\000\004\024\004\160\000\000\004\000\000\000\000\004\b\000 @`\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\128\000\0000\000A\128J\000\000\000@\000\000\000\000@\128\002\004\006\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\002\000\016@!\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\128\000\0000\000A\128J\000\000\000@\000\000\000\000@\128\002\004\006\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\002\000\016@!\128\000\000\b\000\000\003\000\004\024\004\160\000\000\004\000\000\000\000\004\b\000 @`\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\128\000\0000\000A\128J\000\000\000@\000\000\000\000@\128\002\004\006\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\002\000\016@!\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\128\000\0000\000A\128J\000\000\000@\000\000\000\000@\128\002\004\006\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\002\000\016@!\128\000\000\b\000\000\003\000\004\024\004\160\000\000\004\000\000\000\000\004\b\000 @`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 @\000\000\000\000\000\001I\000\001 \222(\006\248\204\000\006\018\001\000\168\001\004\018\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\129\000\000\000\000\000\000\005$\000\004\131x\160\027\2270\000\024H\004\002 \004\016H`\000\000\000\000\001I\000\001 \222(\006\248\204\000\006\018\001\000\168\001\004\002\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\129\000\000\000\000\000\000\005$\000\004\131x\160\027\2270\000\024H\004\002\160\004\016H`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\020\144\000\018\rB\128c\140\192\000! \016\002\000\016@!\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\175j\240\000\017I\b\001 \208)\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000$\000\000\012\000\017`R\128\000\000\016\000\000\000\000\026 \000\140\017\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000z\246\175\000\001\020\144\128\018\r\002\144c\140\192\000! \016\002\000\016@!\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\002@\000\000\196A6\021,\000\000\001@\b\000\000\001\178\000\t\241\220\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000z\246\175\000\001\020\144\128\018\r\002\144c\140\192\000! \016\002\000\016@!\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\002@\000\000\196A6\021,\000\000\001@\b\000\000\001\178\000\t\241\220\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\016\133\012\000\000@\004@\000\192$\002\024\004@\b\002\016\000\000\000\t\144\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\bP\192\000\004\000D\000\012B@!\128D\000\128!\000\000\000\000\153\012^\189\171\192\000A\000 \000\002\b\004\000\024\016\000\000\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\004!C\000\000\016\001\016\0000\t\000\134\001\016\002\000\132\000\000\000\002d1\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\001\000\001\235\218\188\000\004\016\002\000\000 \000@\001\129\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\192\004\000\016\004\000\000\002\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\001\bP\192\000\004\000D\000\012\002@!\128D\000\128!\000\000\000\000\153\012@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\001z\246\175\000\001\000\000\128\000\b\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\175j\240\000\016\000\b\000\000\128\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\127\254\191\130\005\022\144\164\016\012b\156s\143\194\000g\1680\000F\148@\161\158\189\171\192\000@\000 \000\002\000\004\000\000\016\000\000\000\000\000\000\000\000\000\000\000\016\001\000(\194\t\016@\ba\000\000\004\144\000\135h\018\000\0040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\129\000\000\000\000\128\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000`\004\000\163\b$A\000!\132\000\000\018@\002\029\160H\000\016\192\000\000\000\016\001\000(\194\t\016@\ba\000\000\004\144\000\135h\018\000\0040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\224\004\000\163\b$A\000!\132\000\000\018@\002\029\160H\000\016\192\000\000\000\024\001\000(\194\t\016@\ba\000\000\004\144\000\135h\018\000\0040\000\000\000\004\000@\n0\130D\016\002\024@\000\001$\000!\218\004\128\001\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\001\000(\194\t\016@\ba\000\000\004\144\000\135h\018\000\0040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\004\000\163\b$A\000!\132\000\000\018@\002\029\160H\000\016\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000@\n0\130D\016\002\024@\000\001$\000!\218\004\128\001\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\004\000@\n0\130D\016\002\024@\000\001$\000!\218\004\128\001\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\004\000\163\b$A\000!\132\000\000\018@\002\029\160H\000\016\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000@\n0\130D\016\002\024@\000\001$\000!\218\004\128\001\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\004\000\163\b$A\000!\132\000\000\018@\002\029\160H\000\016\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000J\004\000\000\000\002\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\001\128\016\002\140 \145\004\000\134\016\000\000I\000\bv\129 \000C\000\000\000\000@\004\000\163\b$A\000!\132\000\000\018@\002\029\160H\000\016\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\128\016\002\140 \145\004\000\134\016\000\000I\000\bv\129 \000C\000\000\000\000`\004\000\163\b$A\000!\132\000\000\018@\002\029\160H\000\016\192\000\000\000\016\001\000(\194\t\016@\ba\000\000\004\144\000\135h\018\000\0040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\004\000\163\b$A\000!\132\000\000\018@\002\029\160H\000\016\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\016\002\140 \145\004\000\134\016\000\000I\000\bv\129 \000C\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\001\000(\194\t\016@\ba\000\000\004\144\000\135h\018\000\0040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\016\001\000(\194\t\016@\ba\000\000\004\144\000\135h\018\000\0040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\016\002\140 \145\004\000\134\016\000\000I\000\bv\129 \000C\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\001\000(\194\t\016@\ba\000\000\004\144\000\135h\018\000\0040\000\000\000\004\000@\n0\130D\016\002\024@\000\001$\000!\218\004\128\001\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\001\000(\194\t\016@\ba\000\000\004\144\000\135h\018\000\0040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\132\016\002\140 \145\004\000\134\016\000\000I\000\bv\129 \000C\000\000\000\000`\004\000\163\b$A\000!\132\000\000\018@\002\029\160H\000\016\192\000\000\000\016\001\000(\194\t\016@\ba\000\000\004\144\000\135h\018\000\0040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\004\000\163\b$A\000!\132\000\000\018@\002\029\160H\000\016\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000@\n0\130D\016\002\024@\000\001$\000!\218\004\128\001\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\001\000(\194\t\016@\ba\000\000\004\144\000\135h\018\000\0040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\016\002\140 \145\004\000\134\016\000\000I\000\bv\129 \000C\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\004\000\000\016\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000 \128\000\004\001\000\000\000\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000@\004\000\163\b$A\000!\132\000\000\018@\002\029\160H\000\016\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000@\n0\130D\016\003\024@\000\001$\000!\218\004\128\001\012\000\000\000\000\000\000\000\004\000\000\000\b \000\001\000@\000\000 \000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\016\001\000(\194\t\016@\ba\000\000\004\144\000\135h\018\000\0040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\004\000\163\b$A\000!\132\000\000\018@\002\029\160H\000\016\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000@\n0\130D\016\002\024@\000\001$\000!\218\004\128\001\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\004\000\163\b$A\000!\132\000\000\018@\002\029\160H\000\016\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000@\004\000\163\b$A\000!\132\000\000\018@\002\029\160H\000\016\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\235\218\188\000\004\000\002\000\000 \000@\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000@\000z\246\175\000\001\000\000\128\000\b\000\016\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\001\000(\194\t\016@\012a\000\000\004\144\000\135h\018\000\0040\000\001\235\218\188\000\004\016\002\000\000 \128@\001\129\000\000\000\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000@\004\000\163\b$A\000!\132\000\000\018@\002\029\160H\000\016\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\004\000\000\016\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\001\000\000\000\000\000\004\000\000\016\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\016\000\000\000!\000\000\004\001\000\000\000\128\000\000\000\000\000\000z\246\175\000\001\004\000\128\000\b \016\000`@\000\000 \000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\016\001\000(\194\t\016@\ba\000\000\004\144\000\135h\018\000\0040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\016\002\140 \145\004\000\198\016\000\000I\000\bv\129 \000C\000\000\030\189\171\192\000A\000 \000\002\b\004\000\024\016\000\000\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\004\000@\n0\130D\016\002\024@\000\001$\000!\218\004\128\001\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\175j\208\000\016\000\b\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000@\n0\130D\016\002\024@\000\001$\000!\218\004\128\001\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\160@\000\000\000 \000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\001\000(\194\t\016@\ba\000\000\004\144\000\135h\018\000\0040\000\000\000\004\000@\n0\130D\016\002\024@\000\001$\000!\218\004\128\001\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0008\001\000(\194\t\016@\ba\000\000\004\144\000\135h\018\000\0040\000\000\000\006\000@\n0\130D\016\002\024@\000\001$\000!\218\004\128\001\012\000\000\000\001\000\016\002\140 \145\004\000\134\016\000\000I\000\bv\129 \000C\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000@\n0\130D\016\002\024@\000\001$\000!\218\004\128\001\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\001\000(\194\t\016@\ba\000\000\004\144\000\135h\018\000\0040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\016\002\140 \145\004\000\134\016\000\000I\000\bv\129 \000C\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\001\000\016\002\140 \145\004\000\134\016\000\000I\000\bv\129 \000C\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\001\000(\194\t\016@\ba\000\000\004\144\000\135h\018\000\0040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\016\002\140 \145\004\000\134\016\000\000I\000\bv\129 \000C\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\001\000(\194\t\016@\ba\000\000\004\144\000\135h\018\000\0040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\129\000\000\000\000\128\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000`\004\000\163\b$A\000!\132\000\000\018@\002\029\160H\000\016\192\000\000\000\016\001\000(\194\t\016@\ba\000\000\004\144\000\135h\018\000\0040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\224\004\000\163\b$A\000!\132\000\000\018@\002\029\160H\000\016\192\000\000\000\024\001\000(\194\t\016@\ba\000\000\004\144\000\135h\018\000\0040\000\000\000\004\000@\n0\130D\016\002\024@\000\001$\000!\218\004\128\001\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\001\000(\194\t\016@\ba\000\000\004\144\000\135h\018\000\0040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\004\000\163\b$A\000!\132\000\000\018@\002\029\160H\000\016\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000@\n0\130D\016\002\024@\000\001$\000!\218\004\128\001\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\004\000@\n0\130D\016\002\024@\000\001$\000!\218\004\128\001\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\004\000\163\b$A\000!\132\000\000\018@\002\029\160H\000\016\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\000@\n0\130D\016\002\024@\000\001$\000!\218\004\128\001\012\000\000\000\001\000\016\002\140 \145\004\000\134\016\000\000I\000\bv\129 \000C\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000@\n0\130D\016\002\024@\000\001$\000!\218\004\128\001\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\225\004\000\163\b$A\000!\132\000\000\018@\002\029\160H\000\016\192\000\000\000\024\001\000(\194\t\016@\ba\000\000\004\144\000\135h\018\000\0040\000\000\000\004\000@\n0\130D\016\002\024@\000\001$\000!\218\004\128\001\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\001\000(\194\t\016@\ba\000\000\004\144\000\135h\018\000\0040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\016\002\140 \145\004\000\134\016\000\000I\000\bv\129 \000C\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000@\n0\130D\016\002\024@\000\001$\000!\218\004\128\001\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\004\000\163\b$A\000!\132\000\000\018@\002\029\160H\000\016\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\001\000\000\004\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\b \000\001\000@\000\000 \000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\016\001\000(\194\t\016@\ba\000\000\004\144\000\135h\018\000\0040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\016\002\140 \145\004\000\198\016\000\000I\000\bv\129 \000C\000\000\000\000\000\000\000\001\000\000\000\002\b\000\000@\016\000\000\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\004\000@\n0\130D\016\002\024@\000\001$\000!\218\004\128\001\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\001\000(\194\t\016@\ba\000\000\004\144\000\135h\018\000\0040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\016\002\140 \145\004\000\134\016\000\000I\000\bv\129 \000C\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\001\000(\194\t\016@\ba\000\000\004\144\000\135h\018\000\0040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\016\001\000(\194\t\016@\ba\000\000\004\144\000\135h\018\000\0040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\016\002\140 \145\004\000\198\016\000\000I\000\bv\129 \000C\000\000\030\189\171\192\000A\000 \000\002\b\004\000\024\016\000\000\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\004\000@\n0\130D\016\002\024@\000\001$\000!\218\004\128\001\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016@\000\000\000\132\000\000\016\004\000\000\002\000\000\000\000\000\000\001\235\218\188\000\004\016\002\000\000 \128@\001\129\000\000\000\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000@\004\000\163\b$A\000!\132\000\000\018@\002\029\160H\000\016\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000@\n0\130D\016\003\024@\000\001$\000!\218\004\128\001\012\000\000z\246\175\000\001\004\000\128\000\b \016\000`@\000\000 \000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\016\001\000(\194\t\016@\ba\000\000\004\144\000\135h\018\000\0040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\002\004\022\144$\016\012B\132s\140\194\000g\1680\000F\020@\161\128\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\002\000\016@!\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\001\255\250\254\000\004\016\002\000\000 \000@\000\012\000\000\000\128\000\000\006\000\132\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\235\218\188\000\004\016\002\000\000 \000@\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\b\000\000\001\000@\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\000\000\000R@\000H5\n\001\1583\000\000\132\128@\b\000A\000\134\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\128\000\000\016\004\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\0000\000\000\134\001\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\002\000\000\000@\016\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000z\246\175\000\001\000\000\128\000\b \017\128\000@\000\000\000\000\002\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\144\000\018\rB\128g\140\192\000! \016\002\000\016@!\128\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\175j\240\000\016\000\b\000\000\130\001\024\000\004\000\000\000\000\000 \000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000H\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000 \000\002\000\000\000\000\000\000\000\020\144\000\018\rB\128g\140\192\000! \016\002\000\016@!\128\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\189\171@\000A\000 \000\000\000\004\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\128\000\000\016\004\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000 \000\002\000\000\000\000\000\000\000\020\144\000\018\rB\128g\140\192\000! \016\002\000\016@!\128\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\002\000\000\000@\016\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\000\000\000R@\000H5\n\001\1583\000\000\132\128@\b\000A\000\134\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\007\255\235\248 Qi\nA \212)\1998\252 \006z\131\000$yF\026\024\000\000\000\144\000\01610M\182K\000\004\001P\002\004\128\000n\128@Pw\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\bg\175j\240\000\017I\b\001 \208)\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000$\000\000\012D\019aR\192\000\000\020\000\128\000\000\026 \000\020\029\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001I\000A \208(\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\255\235\248<Qi\nA\000\198)\1998\252 \006z\131\000\004iD\n\024\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\002\000\016@!\128\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\002\000\016@!\128\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000@\000\000\000\000\000\000\001\002 \000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031\255\175\224\129E\164)\004\003\016\167\028\227\240\128\025\234\012\000\017\165\016(g\255\235\248 Qi\nA \212-\1998\252 \006z\131\000$iE\n\025\235\218\188\000\004RB\000H4\nA\1423\000\000\132\128@\b\000A\000\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000R@\000@1\n\001\1422\000\001\132\128@\000\000A\000\134\000\000\000\000\000\020\144\000\016\012\002\128c\140\128\000a \016\000\000\016@!\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\004\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005$\000\004\003\000\160\024\227 \000\024H\004\000\000\004\016\b`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000$\000\000\012L\019e\146\192\000\000\020\000\129\000\000\026\160\016\020\029\192\000\000\000\000\001\000\000\000\002\000\000\000@\016\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\235\218\188\000\004RB\000H4\138A\142s\000\000\132\128@\b\000A \134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\128\000\000\016\004\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000$\000\000\012D\019a\018\192\000\000\020\000\128\000\000\026 \000\020\029\192\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\000\000\003\017\004\216D\176\000\000\005\000 \000\000\004\136\000\005\003p\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\144\000\0001\016M\132K\000\000\000P\002\000\000\000H\128\000P7\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\003\000\016@!\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\002\000\016@!\128\000\000\t\000\000\003\017\004\216D\176\000\000\005\000 \000\000\004\136\000\005\003p\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\144\000\0001\016M\132K\000\000\000P\002\000\000\000H\128\000P7\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\002\000\016@!\128\000\000\t\000\000\003\017\004\216D\176\000\000\005\000 \000\000\004\136\000\005\003p\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\144\000\0001\016M\132K\000\000\000P\002\000\000\000H\128\000P7\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\002\000\016@!\128\000\000\t\000\000\003\017\004\216D\176\000\000\005\000 \000\000\004\136\000\005\003p\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\144\000\0001\016M\132K\000\000\000P\002\000\000\000H\128\000P7\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\002\000\016@!\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\144\000\0001\016M\132K\000\000\000P\002\000\000\000H\128\000P7\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\002\000\016@!\128\000\000\t\000\000\003\017\004\216D\176\000\000\005\000 \000\000\004\136\000\005\003p\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\144\000\0001\016M\132K\000\000\000P\002\000\000\000H\128\000P7\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\002\000\016@!\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\144\000\0001\016M\132K\000\000\000P\002\000\000\000H\128\000P7\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\002\000\016@!\128\000\000\t\000\000\003\017\004\216D\176\000\000\005\000 \000\000\004\136\000\005\003p\000\000\000\000\001I\000\001 \222(\006\248\204\000\006\018\001\000\168\001\004\018\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\255\235\248<Qi\nA\000\198)\1998\252 \006z\131\000\004iD\n\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\127\254\255\195\197\022\144\164\016\012b\220s\143\198\000g\1690\000G\148q\173\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\255\235\248 Qi\nA\000\198)\1998\252 \006z\131\000\004iD\n\025\255\250\254\b\020ZB\144H5\011q\206?\b\001\158\160\192\t\026QB\134\127\254\191\130\005\022\144\164\018\rB\156s\143\194\000g\1680\002F\148A\161\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\127\254\255\194\005\022\144\228\019\rB\220s\143\198\000\231\1690\007G\148u\173\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\b\016Z@\144@1\n\017\2063\b\001\158\160\192\001\024Q\002\134\000\000\000\002\004\022\144$\016\012B\132s\140\194\000g\1680\000F\020@\161\128\000\000\000\000\001\000\000\000\002\000\000\000@\016\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005$\001\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000R@\016H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\018\b`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\b\016Z@\144@1\n\017\2063\b\001\158\160\192\001\024Q\002\134\000\000\000\002\004\022\144$\016\012B\132s\140\194\000g\1680\000F\020@\161\128\000\000\000\000\001\000\000\000\000\b\000\000@\016\000\000\b\000\000\128\000\002\000\000\000\000\000\000\000@\000\000\000\002\000\000\016\004\000\000\002\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002 \000\000\000\000\000\000\004\000\000\000\000 \000\001\000@\000\000 \000\000\000\000\b\000\000\000\000\000\000\001\000\000\000\000\b\000\000@\016\000\000\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\136\000\000\000\000\000\000\001\000\000\000\000\b\000\000@\016\000\000\b\000\000\128\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002 \000\000\000\000\000\000\004\000\000\000\000 \000\001\000@\000\000 \000\002\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\002\000\016@!\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\030\189\171\192\000E$ \004\131H\164\024\2310\000\bH\004\000\128\004\018\b`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\b\016Z@\144@1\n\017\2063\b\001\158\160\192\001\024Q\002\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\255\250\254\b\020ZB\144H5\nq\206?\024\001\158\160\192\t\026Q\002\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\255\239\252<Qi\nA\000\198-\1998\252`\006z\147\000\004yG\026\220\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\255\235\248 Qi\nA\000\198)\1998\252`\006z\131\000\004iD\n\024\000\000\000\000\000\000\000\000\b\004\000\000\000\000\016\000\000\000\000\b\000\000\0001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031\255\175\224\129E\164)\004\003\024\167\028\227\241\128\025\234\012\000\017\165\016+p\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000$\000\004\012L\019m\146\192\001\000T\000\129 \000\027\160\016\020\029\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@ \016\000\000\000\000@\000\000\000\000 \000\000\000\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031\255\175\224\129E\164)\004\131P\167\028\227\241\128\025\234\012\000\145\165\016+p\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\255\250\254\b\020ZB\144@1\138q\206?\024\001\158\160\192\001\026Q\002\183\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\175j\240\000\017I\b\001 \210)\0069\204\000\002\018\001\000 \001\004\130\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001I\000\001 \212(\006x\204\000\002\018\001\000 \001\004\002\024\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\001\000\003\000\000\b`\016\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\b\000\000\001\000@\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\001\235\218\188\000\004\000\002\000\000 \128F\000\001\000\000\000\000\000\b\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000R@\000H5\n\001\1583\000\000\132\128@\b\000A\000\134\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\001\235\218\188\000\004\000\002\000\000 \128F\000\001\000\000\000\000\000\b\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000 \000\002\000\000\000\000\000\000\000\020\144\000\018\rB\128g\140\192\000! \016\002\000\016@!\128\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\189\171@\000A\000 \000\000\000\004\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\128\000\000\016\004\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000 \000\002\000\000\000\000\000\000\000\020\144\000\018\rB\128g\140\192\000! \016\002\000\016@!\128\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\255\250\254\b\020ZB\144H5\nq\206?\024\001\158\160\192\t\026Q\002\183\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@ \016\000\000\000\000@\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\127\254\191\130\005\022\144\164\018\rB\156s\143\198\000g\1680\002F\148@\161\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000@\000\192\000\002\024\004@\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000 Ai\002A\000\196(G8\204 \006z\131\000\004aD\n\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\016\000\000\000\000\000\000\000\000\000\000\004\000\007\255\239\252 Qi\014A0\212-\1998\252`\014z\147\000dyGZ\220\000\000\000\b\016Z@\144@1\n\017\2063\b\001\158\160\192\001\024Q\002\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031\255\175\224\129E\164)\004\003\024\183\028\227\240\128\025\234\012\000\017\229\028h`\000\000\000\000\000\000\000\000 \016\000\000\000\000\000\000\000\000\000 \000\000\000\001\255\250\254\b\020ZB\144@1\139q\206?\b\001\158\160\192\001\030Q\198\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\128@\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\255\250\254\b\020ZB\144H5\011q\206?\b\001\158\160\192\t\030Q\198\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031\255\175\224\129E\164)\004\131P\183\028\227\240\128\025\234\012\000\145\229\028h`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\001\000\001\255\250\254\b\020ZB\144@1\139q\206?\b\001\158\160\192\001\026QB\134\000\000\000\000\000\000\000\000\002\001\000@\000\000\000\000\000\000\000\002\000\000\016\000\031\255\175\224\129E\164)\004\003\024\183\028\227\240\128\025\234\012\000\017\165\020(`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\128@\016\000\000\000\000\000\000\000\000\128\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\255\250\254\b\020ZB\144H5\011q\206?\b\001\158\160\192\t\026QB\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\004\000\012\000@!\128@\000\000 \000\000\000\000\016\000\000\000\000\000\000\000\000\016\000\192@\000\000\000\000\000 \000\000\000\128\000\001\000\023\255\235\248 Qi\nA\000\198)\1998\252 \006z\131\000\004iD\n\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000D\003\001\000\000\000\000\000\000\128\000\000\002\000\000\004\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\255\235\248 Qi\014A0\212)\1998\252 \014z\131\000$iDJ\029\255\250\254\b\020ZB\144@1\138q\206?\b\001\158\160\192\001\026Q\002\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\255\235\248 Qi\014A0\212)\1998\252 \014z\131\000$iDJ\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\001\000\001\255\250\254\b\020ZB\144H5\011q\206?\b\001\158\160\192\t\026QB\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@ \016\000\000\000\000@\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\127\254\191\130\005\022\144\164\018\rB\156s\143\198\000g\1680\002F\148@\161\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000{\254\191\128\001\020\144\164\016\012\002\144c\143\128\000a \016\000\000\148@\161\128\000\000\000\000\005$\001\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\030\255\175\224\000E$)\004\003\000\164\024\227\224\000\024H\004\000\000%\016(`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\235\218\188\000\004\016\002\000\000 \000@\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\b\000\000\001\000@\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000R@\000H5\n\001\1583\000\000\132\128@\b\000A\000\134\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\192\000\002\024\004\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\b\000\000\001\000@\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\001\235\218\188\000\004\000\002\000\000 \128F\000\001\000\000\000\000\000\b\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000R@\000H5\n\001\1583\000\000\132\128@\b\000A\000\134\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\144\000\018\rB\128g\140\192\000! \016\002\000\016@!\128\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\235\218\180\000\004\016\002\000\000\000\000@\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\b\000\000\001\000@\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000R@\000H5\n\001\1583\000\000\132\128@\b\000A\000\134\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\001\000\001\239\250\254\000\004RB\144@0\nA\142>\000\001\132\128@\000\002Q\002\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\002\000\000\000@\016\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\144\000\018\rB\128g\140\192\000! \016\002\000\016@!\128\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\144\000\01600A\178K\000\004\001@\000\004\128\000b\128@@F\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\030\189\171\192\000E$ \004\131H\164\024\2310\000\bH\004\000\128\004\018\b`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005$\000\004\131P\160\025\2270\000\bH\004\000\128\004\016\b`\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\004\000\012\000\000!\128@\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000 \000\000\004\001\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\175j\240\000\016\000\b\000\000\130\001\024\000\004\000\000\000\000\000 \000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001I\000\001 \212(\006x\204\000\002\018\001\000 \001\004\002\024\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000R@\000H5\n\001\1583\000\000\132\128@\b\000A\000\134\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\175j\208\000\016@\b\000\000\000\001\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000 \000\000\004\001\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001I\000\001 \212(\006x\204\000\002\018\001\000 \001\004\002\024\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000@\000\192\004\002\024\004\000\000\002\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\004\b\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\127\254\191\130\005\022\144\164\016\012b\156s\143\194\000g\1680\000F\148@\161\128\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\002\000\016@!\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\007\255\235\248 Qi\nA \212)\1998\252 \006z\131\000$yF\026\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\002\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\127\254\191\128\001\004\000\128\000\b\000\016\000\003\000\000\000 \000\000\001\128!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\001\127\254\191\130\005\022\144\164\016\012b\156s\143\194\000g\1680\000F\148@\161\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\255\235\248 Qi\nA\000\198)\1998\252 \006z\131\000\004iD\n\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\002\000\016@!\128\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\016\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\002\000\016@!\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001I\000\001 \208(\0068\204\000\002\018\001\000 \001\004\002\024\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\255\235\248 Qi\nA\000\196)G8\252 \006z\131\000\004iD\n\025\235\218\188\000\004RB\000@0\nA\1422\000\001\132\128@\000\000A\000\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\023\255\235\248 Qi\nA\000\196)G8\252 \006z\131\000\004iD\n\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031\255\175\224\129E\164)\004\003\016\165\028\227\240\128\025\234\012\000\017\165\016(`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000R@\000H4\n\001\1423\000\000\132\128@\b\000A\000\134\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\255\250\254\000\004\016\002\000\000 \000@\000\012\000\000\000\128\000\000\002\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000_\255\175\224\000A\000 \000\002\000\004\000\000\192\000\000\b\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\255\250\254\000\004\016\002\000\000 \000@\000\012\000\000\000\128\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\175j\240\1288\130\t\018@\132\003\000\000\004\144\000\133(R\000\0060\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000@\004\000\162\b$A\000\001\000\000\000\002@\002\029\160H\000\016\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000@\004\000\162\b\004A\000\001\000\000\000\002@\002\029\160H\000\016\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\b\000\000\000\004\000@\n \130D\016\000\016\000\000\000$\000!\218\004\128\001\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\002\000\000 \000\000\000\000\000\002\000\b\b\000\000\000\000\000\016\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\002 \000\000\000\000\000\002\000\b\b\000\000\000\000\000\016\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000z\246\175\000\003\128 \145\004\b@0\000\000I\000\bR\005 \000c\000\000\030\189\171\192\000\224\b \001\002\016\012\000\000\018@\002\020\129H\000\024\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000@\n \130F\016\000\016\000\000\000$\000!\218\004\128\001\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\004\000\162\b$A\000\001\000\000\000\002@\002\029\160H\000\016\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\002\000\000\000\001\000\016\002\136 \145\004\000\004\000\000\000\t\000\bv\129 \000C\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\002\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\002\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\016\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000z\246\175\000\003\128 \144\004\b@0\000\000I\000\bR\005 \000a\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\175j\240\0008\002\b\000@\132\003\000\000\004\144\000\133 R\000\006\016\000\000\000\004\000@\n \130D\016\000\016\000\000\000$\000!\218\004\128\001\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000 @\000\000\016\001\000(\130\t\016@\000@\000\000\000\144\000\135h\018\000\0040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\001\000(\130\t\016@\000@\000\000\000\144\000\135h\018\000\0040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\004\000\162\b$A\000\001\000\000\000\002@\002\029\160H\000\016\192\000\000\000\016\001\000(\130\t\016@\000@\000\000\002\144\000\135h\018\000\0048\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000@\n \130D\016\000\016\000\000\000$\000!\218\004\128\001\012\000\000\000\001\000\016\002\136 \145\004\000\132\000\000\000)\000\bv\129 \000C\128\000\000\000@\004\000\162\b$A\000\001\000\000\000\002@\n\029\160H\000\016\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000@\004\000\162\b$A\000\001\000\000\000\002@\002\029\160H\000\016\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000z\246\175\000\001\000\000\128\000\b\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\016\001\235\218\188\000\004\000\002\000\000 \000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\016\001\000(\130\t\016@\000`\000\000\000\144\000\135h\018\000\0040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\016\002\136 \145\004\000\004\000\000\000\t\000\bv\129 \000C\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000H\000\000\000\000\000\000\000\001\000\016\002\136 \145\004\000\004\000\000\000\t\000\bv\129 \000C\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\b\000\000\000\004\000@\n \130D\016\000\016\000\000\000$\000!\218\004\128\001\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\000\000\000\000\004\000\000\000\b\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\001\000(\130\t\016@\004@\000\000\000\144\000\135h\018\000\0040\000\000\000\004\000@\n \130D\016\000\016\000\000\000$\000!\218\004\128\001\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\004\000\162\b$A\000\001\000\000\000\002@\002\029\160H\000\016\192\000\000\000\016\001\000.\130\t\016@\001@\000\000\002\144\000\135h\018\000\0048\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000@\n \130D\016\000\016\000\000\000$\000!\218\004\128\001\012\000\000\000\001\000\016\002\136 \145\004\000\132\000\000\000)\000\bv\129 \000C\128\000\000\000@\004\000\162\b$A\000\001\000\000\000\002@\n\029\160H\000\016\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\004\000@\n \130D\016\000\016\000\000\000$\000!\218\004\128\001\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\001\002(\130\t\016@\000@\000\000\000\144\000\135h\018\000\0040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\002\000\000\000\001\000\016\"\136 \145\004\000\004\000\000\000\t\000\bv\129 \000C\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\000\000\000\000\001\000\000\000\002\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\001\000(\130\t\016@\000@\000\000\000\144\000\135h\018\000\0040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\004\000\162\b$A\000\001\000\000\000\002@\002\029\160H\000\016\192\000\000\000\016\001\000(\130\t\016@\b@\000\000\002\144\000\135h\018\000\0048\000\000\000\004\000@\n \130D\016\000\016\000\000\000$\000\161\218\004\128\001\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000@\004\000\162\b$A\000\001\000\000\000\002@\002\029\160H\000\016\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n\001\b\016\002\136 \145\004\000\006\000\000\000\t\000\bv\129 \000C\000\000\000\000@\004\000\162\b$A\000\001\128\000\000\002@\002\029\160H\000\016\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000@\n \130D\016\000\024\000\000\000$\000!\218\004\128\001\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\004\000\162H$A\000%\000\000\000\n@\002\029\160H\000\016\224\000\000\000\016\001\000(\130\t\016@\000@\000\000\000\144\002\135h\018\000\0040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\001\000\016\002\136 \145\004\000\004\000\000\000\t\000\bv\129 \000C\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\004\000\162\b$A\000\001\128\000\000\002@\002\029\160H\000\016\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000@\n \130D\016\000\024\000\000\000$\000!\218\004\128\001\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\b\000\000\000\004\000@\n \130D\016\000\016\000\000\000$\000!\218\004\128\001\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\004\000\000\000\b\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\b\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\001\000\000\000\000\000\000\128\128\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000  \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 @\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\002\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\016\002\136 \145\004\000\004\000\000\000\t\000\bv\129 \000C\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\b\000\000\000\004\000@\n \130D\016\000\016\000\000\000$\000!\218\004\128\001\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024@\000\000\000\004\000\000\000\b\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\016\002\136 \145\004\000\004\000\000\000\t\000\bv\129 \000C\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000@\n \130D\016\000\016\000\000\000$\000!\218\004\128\001\012\000\000\000\001\000\016\002\232 \145\004\000\020\000\000\000)\000\bv\129 \000C\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\004\000\162\b$A\000\001\000\000\000\002@\002\029\160H\000\016\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000z\247\175\016\003\136 \145\004\bD\016\000\000I\000\bv\129 \000C\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\016\001\000(\130\001\016@\000@\000\000\000\144\000\135h\018\000\0040\000\000\000\004\000@\011\164\130D\016\002X\000\000\000\164\000!\218\004\128\001\014\000\000\000\001\000\016\002\136 \145\004\000\132\000\000\000\t\000\bv\129 \000C\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000@\n \130D\016\000\016\000\000\000$\000!\218\004\128\001\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\030\189\235\196\000\226\b$A\002\017\132\000\000\018@\002\029\160H\000\016\192\000\000\000\016\001\000(\130\t\016@\000@\000\000\000\144\000\135h\018\000\0040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\004\000\162\b$A\000\001\000\000\000\002@\002\029\160H\000\016\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\001\000(\130\t\016@\000@\000\000\000\144\000\135h\018\000\0040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\030\189\171\194\000\226\b$I\002\016\012\000\000\018@\002\020\161H\000\024\192\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\144\000\018\r\003\128c\140\192\000! \016\002\000\016@!\128\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\144\000\018\r\002\128c\140\192\000! \016\002\000\016@!\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\127\254\255\194\005\022\144\164\018\015C\156s\143\194\000g\1690\002F\148@\173\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\255\239\252 Qi\nA \244)\1998\252 \006z\147\000$iD\n\221\239\251\255\000\004\000\002\000\000 \000@\000\000\000\000\000\004\000\000\000\000\000\000{\254\255\192\001\000\000\128\000\b\000\016\000\000\000\000\000\001\000\000\000\000\000\000\030\255\191\240\000@\000 \000\002\000\004\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004!C\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\001\bP\192\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000B\0200\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\016\133\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031\255\175\224\241E\164)\004\003\024\167\028\227\240\128\025\234\012\000\017\165\016(g\255\235\248 Qi\nA\000\198)\1998\252 \006z\131\000\004iD\n\024\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\127\254\191\130\005\022\144\164\016\012b\156s\143\194\000g\1680\000F\148@\173\192\000\000\000\000\000\000\000\000\128@\000\000\000\000\000\000\000\000\000\128\000\000\003\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\002\001\000\000\000\000\000\000\000\000\000\002\000\000\000\012@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\255\235\248 Qi\nA \212)\1998\252 \006z\131\000$iD\n\220\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\144\000\018\r\226\128o\140\192\000a \016\n\128\016A!\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\255\250\254\015\020ZB\144@1\138q\206?\b\001\158\160\192\001\026Q\002\134\127\254\191\130\005\022\144\164\016\012b\156s\143\194\000g\1680\000F\148@\161\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\007\255\235\248 Qi\nA\000\198)\1998\252 \006z\131\000\004iD\n\220\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\127\254\191\131\197\022\144\164\016\012b\156s\143\194\000g\1680\000F\148@\161\159\255\175\224\129E\164)\004\003\024\167\028\227\240\128\025\234\012\000\017\165\016(`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\030\255\191\240\000A\000 \000\002\000\004\000\000\000\000\000\b@\000\000\000\000\000\000\016\133\012\000\000@\000\000\000\192\000\002\024\004\000\000\002\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000 \000\000\134\001\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\030\189\171\192\000@\000 \000\002\b\004`\000\016\000\000\000\000\000\128\000\002\000\007\175j\240\000\016\000\b\000\000\130\001\024\000\004\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\136\000\030\189\171\192\000@\000 \000\002\b\004`\000\016\000\000\000\000\000\000\000\002\000\007\175j\240\000\016\000\b\000\000\130\001\024\000\004\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002 \000z\246\175\000\001\000\000\128\000\b \017\128\000@\000\000\000\000\002\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\0000\000\000\004\001\000\000\000\128\000\000\000\002 \000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\002\000\000\000@\016\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002 \000z\246\175\000\001\000\000\128\000\b \017\128\000@\000\000\000\000\002\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\127\254\191\130\005\022\144\164\018\rB\156s\143\194\000g\1680\002F\148A\161\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\002\001\000\000\000\000\000\000\000\000\000\002\000\000\000\012@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\255\235\248 Qi\nA \212)\1998\252 \006z\131\000$iD\n\220\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\bP\192\000\004\000\004\000\012\000\000!\128@\000\000!\000\000\000\000\000\012@\000\000\000\000\000\000\128\128 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000R@\000H4\014\001\1423\000\000\132\128@\b\000A\000\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005$\000\004\131@\160\024\2270\000\bH\004\000\128\004\016\b`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\255\251\255\b\020ZB\144H=\014q\206?\b\001\158\164\192\t\026Q\002\183\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\031\255\191\240\129E\164)\004\131\208\167\028\227\240\128\025\234L\000\145\165\016+p\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\255\251\255\b\020ZB\144@1\138q\206?\b\001\158\164\192\001\026Q\002\183\000\000\000\000\000\000\000\000\002\001\000\000\000\000\000\000\000\000\000\002\000\000\000\012_\255\191\240\129E\164)\004\003\024\167\028\227\240\128\025\234L\000\017\165\016+p\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\255\251\255\b\020ZB\144H5\nq\206?\b\001\158\164\192\t\026Q\002\183\127\254\255\194\005\022\144\164\016\012b\156s\143\194\000g\1690\000F\148@\173\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@ \016\000\000\000\000\000\000\000\000\000 \000\000\000\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\127\254\255\194\005\022\144\164\018\rB\156s\143\194\000g\1690\002F\148@\173\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\255\239\252 Qi\nA \212)\1998\252 \006z\147\000$iD\n\220\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\127\254\255\194\005\022\144\164\018\rB\156s\143\194\000g\1690\002F\148@\173\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\133\012\000\000@\000@\000\192\000\002\024\004\000\000\002\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\127\254\255\194\005\022\144\164\018\rB\156s\143\194\000g\1690\002F\148@\173\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@ \016\000\000\000\000\000\000\000\000\000 \000\000\000\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\127\254\255\194\005\022\144\164\018\rB\156s\143\194\000g\1690\002F\148@\173\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\133\012\000\000@\000@\000\192\000\002\024\004\000\000\002\016\000\000\000\000\000\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000@\000\000\000\000\000\000\000\000\004\t\018\224\006\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\b\000\000\004\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000@\128\000\000\000\000\000\000\000\004\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\004\b\000\000\000\000\000\000\000\000@\000\000\000 \000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\016 \000\000\000\000\000\000\000\001\000\000\000\000\128\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\b\001\000\000\000\000\000\000\000 \000\001\002\000\000\000\000\000\000\000\000\016\000\000\000\b\000\000\000\000\001\000\000\000\000\004\000\000\000\000\000\000\000\000\004\024\001\000\000\128P\000\000\000\000\000\000\002\000\000\016 \000\000\000\000\000\000\000\001\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\128\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000@\000\000\000\000\000\000\000\000A\128\016\000\000\005\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\001\014\000`\000\000\016\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\004\024\001\128\000\000@\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\001\006\000@\000\000\016\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016`\004\000 \001\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016`\004\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000A\128\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\001\014\000`\000\000\016\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000A\128\024\000\000\004\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\016`\004\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\024\001\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\006\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\001\006\000`\000\000\016\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000A\128\016\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016`\004\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\024\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000")
   
   let action =
-    ((16, "\002\130\000\151\000\000\000\000\021\244\000\151\000\000\000\000\000\015\000\000\000\000\000\000\001\015\000\000\000\000\000\000\002\130\000\000\000\0052\n\000\000\023\144\023\172\000\000\000\000BB\023\144\023\144\000\000\000\000P\"P\134\023\144\000\000\000\000\023\144\000\000\000\000\023\144\000\000\023\144\000\000\000\191\000\143\023\144\000\000\023\144\000\000\000\000\000\000\023\144\000\000\023\144\000\000C\026`\232\023\144\000\000\000\000X\172a(\023\144\000\000\000\000\023\144\000\000\000\000\023\144\000\000\023\144\000\000\000\159\000q\023\144\000\000\023\144\000\000a6\023\144\000\000\000\000\023\144\000\000Q\146aR\023\144\000\000\000\000\023\144\000\000\023\144\000\000\000\000\023\144\000\000\023\144\000\000\000\006\000\000\000\017\000\017\000\000\000\000\000\000\000\000\000\159\000\000\000\000\000#\000\017\000\000\000#\000\000\000\000\000\017\000\164\000\160\000\017\000r\000\000\000f\000R\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000I\000\017\000\000\000\136\002\220\000\017\000\000\000\142\001f\000\000\000\000\000\000\000\208\023\144\000\000\023\144\000\017\000\232\023\144\000\000\000\000\023\144\000\000\000\000\023\144\000\000\023\144\000\000\0018\001\154\023\144\000\0002\nQ\1468D\000\0008D\000\000\000\000\000\000\000\017\000\0008D\000\0007(\002\2488D\003\014\000\000\000\017\007|N\250\000\000\000\000X\218Y\156\000\000\\\200\000\000Z4N\250\030\202\030\202\\\200N\250\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000Z\204\030\202\000\000\000\000Z\204Z\204Z\204\000\000Z\204\000\006\000\000\000\000N\250Z\204\000\000\000\000'\230\000\017\000\000\025.\030\202N\250\000\000)6N\2504\238N\2505\012N\250\000\000\000\000\000\000\000\000\000\000\000\000\000\000C\132N\250\000\000D\160N\2506(N\2507DN\250\000\000N\250\000\000N\2508`N\2509|N\250:\152N\250;\180N\250<\208N\250=\236N\250\027\172N\250\000\000\000\000\000\000\002\240N\250\000\000\000\000\000\000\000\000N\250E(N\250FDN\250F\204N\250G\232N\250?\bN\250@$N\250A@N\250HpN\250I\140N\250\000\000N\250J\020N\250K0N\250K\184N\250\000\000N\250L\212N\250M\\N\250\000\000\000\000N\250\000\000\002\206\000\000\000\000\000\017\000\000\000\000\000\000\003\006\000\000\003\b\000\000\000\020N\250\000\000\000\020\000\000\000\000\000b2\n\000\000\027\144\023\144\000\000\0032ax\023\144\000\000\000\000[\162a\142\023\144\000\000\000\000\023\144\000\000\000\000\023\144\000\000\023\144\000\000\003\148\0048\023\144\000\000\023\144\000\000\023\144\000\000\023\144\000\000\005\144a\146\023\144\000\000\000\000[\202a\184\023\144\000\000\000\000\023\144\000\000\000\000\023\144\000\000\023\144\000\000\004\024\004\134\023\144\000\000\023\144\000\000a\252\023\144\000\000\000\000\023\144\000\000RZb8\023\144\000\000\000\000\023\144\000\000\023\144\000\000\000\000\023\144\000\000\023\144\000\000\007\212\000\017\004N\023\144\000\000X\172\000\017\004T\023\144\000\000\000\000\023\144\000\000\023\144\000\000\023\144\000\000\004\250\0058\023\144\000\000[\2028D\000\000\000\000\005*\023\144\000\0008D\000\000\000\000<\180:|\000\000\001f\006$\000\017\005r\006R=\208=\208\000\000\000\000\000\000\000\195L\184=\208\001X@\b\000\000\000\000\000\000\006h\006D\002\162\006r=\208\000\000\000\000\005\192\000\000\005\198\006\164=\208\005\216\000\000\000+\000\000\007|\000\000\000\000\002\004F(\000\000\000\000\000\000\006>\007D\000\000\007R\000\000*\182\001f8D\006`\023\144\000\000`\2328D\006l\023\144\000\000\000\000\000\000\000\017\007b\000\000\000\000\000\000\000b\000\000\000\000\030\202\006~\000\000\006\136\\\200.<\000\000]X\030\202\006\140\000\000\006\146-\n.<N\250\006\154\000\000\030\202\006\156\000\000\006\160m\138.<N\250\000\232N\250\006\158\000\000\000\000.<.<\000\000\000\000\000\000\000\000+\148\000\000\000\000\000\000\000\000\000\000Z\204\000\000\000\000\001(\007fN\250.<\000\017\000\000Z\204\000\000\000\000Z\204\000\000\000\006\000\000,\188m\138\000\000\000\000\025\248\000\017\000\000\025.\025.\000\000\000\000\000\000\000\000\000\000\000\000\000\000Z\204\000\000\000\000\002\138\029\174\025.Z\204\000\000\000\000Z\204\000\000\000\006\000\000\\\200\000\000\000\000m\218\000\017\000\000\025.\028\178N\250\000\000N\250\000\000\000\000\000\000\000\000\000\000\006\168\000\000\000\000\000\000\000\000\000\000\000\000\000\000A\162N\250u\206N\250\006\218N\250\000\000N\250v4N\250v\150N\250w(N\250wvN\250x\bN\250xjN\250\000\000N\250x\206N\250y*N\250y\142N\250\000\000N\250y\234N\250zN\002\224\026\174\000\000N\250\006\174\000\000\000\000\000\017\000\000\000\000\000\000\000\000\000\000\003\002\028.\000\000\000\000\006\182\000\000N\250\006\188\000\000\000\000\000\017\000\000\000\000\000\000\000\000\000\000&0\000\000\006\242.<\006\254.<\000\000\000\026\000\000\000\0000~N\250C\188N\250C\224N\250]fN\250kfN\250k\230N\250z\170N\250z\178N\250\000\000N\250{\014N\250{@N\250{\196N\250\000\000N\250| N\250|R\000\000\006\214\000\000\002x/(\000\000\003\2144..<\000\000\004\n0\020\000\000\000\000\000\000\000\000\007\\\000\000\000\000\000\000\006\218\000\000\006\240\000\000\000\000\006\254\000\000\000\000\007\000\000\000\000\000\007\b\000\000\000\000\000\000\000\000\000\000\000\000\007\016\007\216\000\000\002\184\\\200\000\000\000\000\007\020\000\000\000[^0\007\218N\250\007\152\000\000\000\000\\\200\000[\000\000\000\000\007(\000\000\007(S@\000\000\030\202\0076ul\000\000\b\022\000\000\030\202\007@1\n\000\000\030\202\007B2&\000\000\007F\000\000\000\000\b<\000\000\007J\023\144\000\000aR8D\007L\023\144\000\000\000\000\002\0008D\000\000\002\000\000\000\000\000\007V\000\000\002\162\007P\023\144\000\000\000\000\001p2\n\000\0002\n\000\000\007>\000\000\001p\000\000\019\152-\188\023\172\000\000\007\166\023\186\023\172\000\000\000\000O\202R\026\023\172\000\000\000\000\023\172\000\000\000\000\023\172\000\000\023\172\000\000\007\130\007\178\023\172\000\000\023\172\000\000\023\172\000\000\023\172\000\000\b\208R\160\023\172\000\000\000\000O\244T\016\023\172\000\000\000\000\023\172\000\000\000\000\023\172\000\000\023\172\000\000\007\136\007\186\023\172\000\000\023\172\000\000T(\023\172\000\000\000\000\023\172\000\000\023\172T8\023\172\000\000\000\000\023\172\000\000\023\172\000\000\000\000\023\172\000\000\023\172\000\000\007\226\000\017\007b\023\172\000\000\023\172\000\017\007h\023\172\000\000\000\000\023\172\000\000\023\172\000\000\023\172\000\000\007\154\007\204\023\172\000\0002\n\000\000\007\140\000\000\002n2\n\000\000\000\000\002n\000\000\000\000\023\1868D\007\134\023\172\000\000\000\000\000\000\000\026\000\000\000\000\000\031\000\026\000\000\000\000\000\000\b\128\000\000\007\1848D\007\186\023\172\000\000 :8D\007\208\023\172\000\000\000\000\031\172\023\172\000\000\t:T\164\023\172\000\000\000\000PfT\188\023\172\000\000\000\000\023\172\000\000\000\000\023\172\000\000\023\172\000\000\b\b\b6\023\172\000\000\023\172\000\000\023\172\000\000\023\172\000\000\011\212T\202\023\172\000\000\000\000PlT\226\023\172\000\000\000\000\023\172\000\000\000\000\023\172\000\000\023\172\000\000\b\012\b:\023\172\000\000\023\172\000\000T\252\023\172\000\000\000\000\023\172\000\000NZU\022\023\172\000\000\000\000\023\172\000\000\023\172\000\000\000\000\023\172\000\000\023\172\000\000\t\018\000\017\007\228\023\172\000\000NZ\000\017\007\238\023\172\000\000\000\000\023\172\000\000\023\172\000\000\023\172\000\000\b\030\bN\023\172\000\000O\2028D\b\000\023\172\000\000\000\000\nr8D\b\004\023\172\000\000O\2448D\b\006\023\172\000\000\000\000\000\000\000\000\000\000\000\000\b\220N\250\b\020\"$\b\150\000\000\b\232N\250\b\"\b\2362\n\000\000\000\000\000\0002\n\000\017\000\000\003\000N\250\t\024\000\000\000\017\000\000\001<\t\026\000\000\t.\b\236\000\017\b2\t\002=\208\b6\001\154\000\000N\250\t&\000\000\000\000\000\000\t\012=\208\bF\t6\000\000\003\186\004>N\250\t8\000\000\t>\000\000*\182\000\017\004lN\250\tP\000\000\tX\000\000\000\017\004vN\250\tZ\000\000\tb\000\000\0013\b\160\t\n%:\000\000^\192\030\202\b\134Qd\000\000U\246\000\000\t\128\000\000\003\002\tZN\250\t\024\000\000\tbN\250\t6\000\000\001p\000\000\t\n\t\n\030\202\b\188\000\000\b\194n\154n\154\000\000\000\000\000\000\000\000\000\000\000\000Z\204\000\000\000\000Z\204\000\000\000\000Z\204\000\000\000\006\000\000n\154\000\000\000\0003B\000\017\000\000\025.\b\196\000\000N\250\b\198\000\000\000\000\000\017\000\000\000\000\000\000\000\000\000\000VzN\250\000\000N\250\000\000\b\206\000\000\000\020\000\000\000\000\000\000\000\000\000\000c2N\250c\154N\250\b\248N\250\000\000N\250d\182N\250e\030N\250f:N\250f\162N\250g\190N\250h&N\250\000\000N\250iBN\250i\170N\250j\198N\250\000\000N\250k.N\250lJ.<\b\202\000\000\000\000\003\002\000\000\003\002\000\000\019\152\t\n\t\n\000\000\000\000\000\000\000\003\000\000\000\000\000\000\t\160N\250\b\212\"$#6\000\017\t\196\000\000\t\166W>\t\202W>\t\206N\250\b\226\"$\"$\001\022\001\022\004\012\001\226\001\022\000\000\000\000\004\018\004\026\000\000\004\028\n\"\000\000\000\000\000\000\000\000\000\000\b\230\000\000\000\000\t\216\000\000\t\226\000\000\000\000\n\"\t\200N\250\b\254\t\238\000\000\t\240\000\000\t4\000\000\t\218\025.\t\014\"$\000\000\000\000\000\000\007\136\000\000\000\000\003\002\000\000\t\150\000\000\015\018\0012\000\000\015\018\000\000\000\000&d\000\000\011\182\000\000\000\000\012\014\000\000\015\018\000\000\t\236\025.\tB\001\166\000\000N\250\n4\000\000\0032\000\000\n\018\000\017\tZ\n*=\208\tb\003\132\000\000N\250\nT\000\000\n6=\208\tl\n^\000\000\004\128N\250\nb\000\000\nd\000\000*\182\000\017\004\140N\250\nf\000\000\nj\000\000\000\000\000\000\012\014\000\000\000\000\006\016\000\000\t\n\000\000\0032\000\000\000\000\005\b#6\000\000\005\b\000\000\000\000\t\132\000\000\000\020\001\128\"$\000\000\006\006\0007\006\006\000\000\0007\000\000\t\n\000\000\t\n\000\000\000\000\000\000\t\128\000\000\000\000\t\144\000\000\0050\007\136\0007\006\006\000\000\000\000\000\000\0007\000\000\t\n\000\000\0050\000\000\000\000\029\232\n\130\019\152\000\000\020R\000\000\n\140\019\152\000\000\000\000\n\140\000\000\000\000\t\142\000\000\000\000\t\156\000\000\005@\t\n\000\000\005@\000\000\000\000\n\030\000\000\006\016\000\000\t\n\000\000\000\000\000\000\022\152W\214\000\000\n\146\000\000\022\152\000\000\n\156\000\000\n\162\000\0002\n\000\017\004H\000\000N\250\n\164\000\000\0122\nv\000\017\t\192\n\146=\208\t\200\005<\000\000N\250\n\184\000\000\005b\000\000N\250\n\186\000\000*\182\000\017\005|\000\000N\250\n\192\000\000\005\146\022\152\000\000\000\017\005\196\000\000N\250\n\196\000\000&d\n\206\000\000\000\000\000\000\n\176\025.\t\228\005\198\000\000N\250\n\220\000\000\007\184\000\000\n\180\000\017\t\250\n\214=\208\n\n\005\206\000\000N\250\n\250\000\000\005\248\000\000N\250\011\000\000\000*\182\000\017\006\004\000\000N\250\011\002\000\000\005\146\000\000\000\000\n\024\000\000$\154\n\150\000\000\000\000\000\000\n\154\000\000\000\165\001p\000\000\019\152\n\250\000\000\000\000N\250\nV\t\n\000\000\n0\000\000\0013\000\0002\n\000\000\000\000\001\182\019\152\000\000\019\152\000\000\n \000\000\001\182\000\000N\250\003\236N\250\000\000N\250\000\000\n&\000\000\003\236\000\000N\250\003\236\n(\000\000\021\024$\182\000\000\005\216\021\024\000\000\000\000\021\024\000\000\n*\000\000\005\216\000\000N\250\003\236\n4\000\0002\n\005\2202\n\000\0002\n\000\000\n>\000\000\005\220\000\000N\250\003\236\nB\000\000\000\000 J\000\000\000\151\n\226\000\000\000\000\n\184_\156\000\000\000\000\000\000\000\000\000\000\000\000\n\140\006\006\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002v_\156\000\000\001\b\003P\n\144\000\151\000\000\000\000\n\154\000\151\000\000\000\000\000\000\000\000\002\222\003P\000\000\000\000\000\000\000\000\n\250\000\000\000\000\000\000\000\000'\230*6\000\000[\168\000\000_\156\000\000\004@_\156\000\000\002\196\001H\001H\000\000\005\024\001H\000\000\nr\000\000\000\000\000\000\000\000\011\000\000\000+\148\000\000-\188_\156\000\000\003\224_\156\000\000\011\004\000\000_\156\011\014\000\000q\248`\030\011\020\000\000\011\022\000\000r\134oZ_\156\000\000\000\000\n\146_\156\011$\000\000\011H\000\000\011\\\000\0002\n\000\000\005\1502\n\000\000\n\216\023\148\000\000_\156\011d\000\000\003\020_\156\000\000\004\154_\156\000\000\004\132\011\236\000\000\011\238\000\000`\030_\156\n\226\000\000\000\000\000\000\000\000\000\000\000\000\011r\000\000r\232_\156\011v\000\000\011~\000\000svoj_\156\n\250_\156\011\136\000\000\011\140\000\000\011\142\000\000_\156\0118\000\151\000\000\000\000\006`_\156\000\000\004\132\000\000\011\150\000\000_\156\011\152\000\000s\216pt_\156\011\020_\156\011\160\000\000\011\162\000\000\011\170\000\000l\236\023\148\000\000\023\148\000\000`\030_\156\011$_\156\011\174\000\000\011\178\000\000\023\148\000\000p\214\000\000\000\000\006j_\156\000\000\001\128\001\218\001H\011.\000\000\000\000\001\212\001\212\000\000\000\000\000\000\000\000\005\216\001\212\000\000\0110\000\000\000\000\000\000\000\000\000\000\000\000\000\000_\156\000\000\006\158_\156\000\000\006\006\002\220\000\151\0114\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\192\000\000\011\206\000\000_\156\011\208\000\000tf_\156\011\210\000\000\011\212\000\000_\156\011\216\000\000!\174\011\128t\200NZq\150\011V\000\000_\156\011\234\000\000\011\242\000\000\011\194!\174_\156\011\252\000\000_\156\011\254\000\000\012\000\000\000_\156\012\016\000\000\000\151\011\130\000\000\000\000 J\000\000\000\000\0044\012|\000\000\000\000\001C\000\000\000\000\000\000N\250\000\000\000\000\000\000\004\132\000\000\000J\000\000\000\000\000\000\006\0062\n2\n2\n\000\000\003`\003`\003`\003`\000\000\000\000\000\000\000\000\000\000\000\000\003\002\019\152\012v\016\148\0012\000\000\000\000\004P\000\000\012\014\000\000.<\011\152\000\000\003\002\019\152\011\158\018\022\000\000\003\002\016\148\000\000\000\000\000\0002\n\025\140\000\000\000\000\000\000\011\236\0032\012rG\204G\204\000\000\004\136dPG\204\006xIp\000\000\000\000\b\170\012b\000\017\000\000\006\138K\020\000\000\000\000\000\000\000\000\000\000\011\174\012~\t\n\011\182\000\000\000\000\004P\000\000\012\014\000\000\021r\004\156\000\000\000\000\012l\000\000\000\000\0044\000\000\002\030\000\000\000\000\000\000N\250\000\000\004\132\000\000\003N\000\000\000\000\000\000\007\136\000\000\r\144\005L\r\144\000\000\t\n\r\144\000\000\005\246\000\000\t\n\000\000\t\n\000\000\t\n\000\000\019\242\000\000\000\000\000\000\000\000\000\000\t\n\000\000\005\246\000\000\t\n\000\000#\144\000\000\000\000\n\140\011\236\000\151\000\151\012\150\001h\000\000\001h\012\198\000\000\012\202\000\000\004\b\000\000\001h\002\196\001h\0110\001h\000\000\000\000\003\170\000\000\0144\000\151\011\194\000\000\011\196\000\000\012\002\000\151\000\151\011\200\000\000\n\140\012\216\000\000\014\234\012\254\012\236\000\225\012\236\000\000\000\000\b\214\000\151\000\000\001D\000\000\000\000\000\007\000\000\011\212\000\000\000\000\000\000\012\020\000\151\000\151\011\218\000\000\000\000\n\140\014\234\012\254\b\214\001D\000\007\011\220\000\000\014\234\012\254\b\214\001D\000\007\011\226\000\000\005T\000\026\012\000\000\151\011\250\007\b\006J\012&\000\151\000\000\012*\000\151\000\000\012\136\000\000\012\014\003B\012\n\007\b\012\144\000\000\012\014\007\b\012\148\000\000\000\000\007\b\000\000\012\150\000\000"), (16, "\014\165\014\165\014\165\014\165\014\165\014\165\014\165\014\165\014\165\014\165\014\165\014\165\014\165\014\165\018\n\014\165\014\165\014\165\014\165\014\165\014\165\014\165\014\165\014\165\014\165\025\006\007\213\030\219\030\223\014\165\007E\002\186\030\227\014\025\n\249\014!\014\165\001\138\014\165\014\025\014\025\000&\014\165\018>\014\165\014\165\014\137\014\165\001\138\"V\014\165\014\025\019\222\0007\000;\014\165\014\165\014\165\002\162\002\226\014\165\000*\006)\000\n!\190\000\174\014\165\000\178\001\146\014\165\014\165\n\249\001\182\002\190\001\202\014\165\014\165\014\025\014\165\007\"\014\165\001\"\001&\nE\001\142\014\165\001\138\014\165\014\165!*\014\165\014\165\014\165\bb\024\238\001\150\014\165\014\165\014\165\005*\001\170\014\165\014\165\014\165\014\222\001\154\001\238\014\165\014\165\014\165\014\165\014\165\014\165\012\018\004\253\001\210\014\165\014\165\000N\r\022\025V\025~\025\142\025\194\025\210\025\250\014\226\014\165\014\165\014\165\000\n\021\014\014\165\014\165\014\165\014\165\007\213\014\165\005B\014\165\002\026\000\n\014\165\001\234\001\238\014\165\014\165\t\225!\230\001\242\001\206\000\n\006)\001\246\001\250\007=\014\165\014\165\b\213\007=\014\165\014\234\007\149\001\214\014\165\014\165\014\165\014\165\005\133\007U\014\165\001\254\014\165\b\198\001\222\t\229\014\165\014\165\014\165\000\n\014\165\b\186\014\165\014\165\001\138\014\165\006\205\014\165\014\165\007\157\014\165\014\165\014\165\014\177\014\177\014\177\014\177\014\177\014\177\014\177\014\177\014\177\014\177\014\177\014\177\014\177\014\177\001\230\014\177\014\177\014\177\014\177\014\177\014\177\014\177\014\177\014\177\014\177\002\186\0141\026F\020^\014\177\018>\001\138\031\003\031\007\005\133\007\141\014\177\031\011\014\177\019\222\018f\005\133\014\177!2\014\177\014\177\029n\014\177\012\246\001\150\014\177\002&\0276\r}\0026\014\177\014\177\014\177\t\241\001\154\014\177\002m\001\146\006\250!6\0059\014\177\007\186\001\202\014\177\014\177!:\0059\017\130\018j\014\177\014\177\015q\014\177\021j\014\177\bj\029\130\0256\000\n\014\177\001\138\014\177\014\177\001\150\014\177\014\177\014\177\001\138\002J\026\174\014\177\014\177\014\177\001\154\026F\014\177\014\177\014\177\020b\bv\002^\014\177\014\177\014\177\014\177\014\177\014\177\n\253!\218\r}\014\177\014\177\021\014\012\254\005\173!\222\029\134\002\138\000\n\029r\005a\014\177\014\177\014\177\020j\005A\014\177\014\177\014\177\014\177\023N\014\177\005A\014\177!B\017N\014\177\023R\001\206\014\177\014\177\023V\015q\015q\002\142\001\150\012\194\015q\025>\007.\022R\014\177\005\173\n5\014\177\001\154\000\006\000\"\014\177\014\177\014\177\014\177\017\134\002q\014\177\029\138\014\177!J\021n\n\253\014\177\014\177\014\177\000\n\014\177\024\218\014\177\014\177\007e\014\177\000\n\014\177\014\177\001\138\014\177\014\177\014\177\007\221\007\221\007\221\007\221\007\221\007\221\007\221\007\221\007\221\007\221\007\221\007\221\007\221\007\221\014\166\007\221\007\221\007\221\007\221\007\221\007\221\007\221\007\221\007\221\007\221\001\138\007\133\001\146\006\250\007\221\018B\018R\018b\005\017\005Z\t\217\007\221\005j\007\221\005\138\005B!Z\007\221\014y\007\221\007\221\005\146\007\221\007\142\007\205\007\221\0272\002\157\016\234\001\150\007\221\001\146\007\221\016\238\0141\007\221\029\226\002*\031&\001\154\016\242\007\221\"\146\001\138\000.\016\246\031*\026\178 o s\007\221\007\221\002\206 w\005\154\007\221\007\221\b\r\001\150\021~\007\221\026\190\007\221\007\221\000\n\007\221\007\221\007\221\001\154\026\194\014\145\007\221\007\221\007\221\001\146\021\130\007\221\007\221\007\221\007\181\026\162\011b\007\221\007\221\007\221\007\221\007\221\007\221\t\253\005\170\t:\007\221\007\221\000\n\t\185\005\017\017\146\002\214\007]\007]\021\158\001\150\017\150\007\221\007\221\007\141\007J\007\221\007\221\007\221\007\221\001\154\007\221\011\250\007\221\022\"\026\206\007\221\005\017\b\r\007\221\007\221\n\225!j\004R\028\022\026\210\007=\026\222\017B\004\254!Z\014\145\nF!b\007\221\000\n\t\169\t\245\007\221\007\221\007\221\007\221\005\213\000\n\007\221\002\226\007\221\025^\017N\nz\007\221\007\221\007\221\002M\005\026\005\"\007\221\007\221\001\138\007\221!N\007\221\007\221\005\245\007\221\007\221\007\221\007\253\007\253\007\253\007\253\007\253\007\253\007\253\007\253\007\253\007\253\007\253\007\253\007\253\007\253!R\007\253\007\253\007\253\007\253\007\253\007\253\007\253\007\253\007\253\007\253\0141\007\253\021\162\020^\007\253\023\142\014Q \143 \147\n\249\007\253\007\253 \151\007\253\005\158\028.\0286\007\253\018>\007\253\007\253\030\202\007\253\0141\001\150\007\253\025f\019\222\0141\007=\007\253\007\253\007\253\0141\001\154\007\253\007\253\007\253\007\253\0141 O\007\253\007\253\007\253\007\253!r\007\253\007\253 S\007=\007\253\007\253\007\253\007\253\014\129\007\253!b\028> V\000\n\007\253\030\202\007\253\011n\007\253\007\253\007\253\007\253\027~\007\253\n\r\007\253\007\253\007\253\005\162\014Q\007\253\007\253\007\253\020b\006\n\007\253\007\253\007\253\007\253\007\253\007\253\007\253\011\r\011~\020f\007u\007\253\020z\t\213\017\182\002}\t\197\020\134\014i\023\146\t\201\002]\007\253\007\253\007\253\021\014\007\253\007\253\007\253\007\253\007\253\007\253\006\014\007\253\017N\027&\007\253\017\214\005\198\007\253\007\253\005\214\017\242\005\246\007\253\007\253\023\190\021\198\022.\006z\005\254\007\253\006\142\021\230\007\253\015q\015q\017N\007\253\007\253\015q\007\253\017N\018>\007\253\023\210\007\253\017N\022\162\011\r\007\253\031\218\019\222\017N\"R\n)\023\"\007\253\023\238\007\253\028\"\007\253\007\253\006\006\007\253\007\253\007\253\000R\000V\000f\000\194\r\026\000\198\016\234\000\202\000\210\000\218\0016\016\238\001F\001N\026.\001v\031\018\001~\016\242\001\134\002j\002r\002v\016\246\031\022\006\182\0262\024\018\024F\016\250\024\002\006\022\024z\025\158\006\186\025\218\017\n\0266\002~\026:\028.\0286\002\230\026>\018\018\017\018\029n\018\022\000\n\026B\018\026\007\197\n\249\024\142\023\194\002\134\027B\018.\026N\024\170\n\245\018>\026R\014A\021\014\n\249\002\246\"j\026V\031J\019\222\007\165\006\214\023\214\018>\019\242\018r\031v\031\130\007\173\019\246\022^\029\222\019\222\026Z\003\026\023\242\003\030\006\005\"v\002\154\021\006\019\254\001\138\011)\011)\018\138\003&\020\002\011)\006\254\018\142\b\146\003.\025\170\007\006\025\226\018\146\018\150\017&\017*\018\154\020\006\011\005\007\n\026^\007F\020\n\026b\027\242\007\189\015q\024\022\024J\001\146\007B\014)\024~\b\162\018\158\007N\026f\020\014\020\018\018\162\020\022\026j\000\n\026n\020*\026r\026v\005\225\026z\007^\0206\018\170\007f\024\146\021\014\026~\001\150\029\158\026\130\024\174\007j\007r\031\150\014q\0149\020V\001\154\021\014\014Y\020Z\020\166\006\005\017.\026\134\007}\018\174\007m\020\170\026\138\026\142\011\005\018\182\006\005\006\005\011)\011)\"f\006\005\020\178\011)\018\186\000\n\b\005\b\005\014a\018\194\003r\b\005\000R\000V\000f\000\194\r\026\000\198\016\234\000\202\000\210\000\218\0016\016\238\001F\001N\007\162\001v\031\018\001~\016\242\001\134\002j\002r\002v\016\246\031\022\r*\007\166\028\198\r:\016\250\rZ\0049\029b\007\174\007\194\0049\017\n\rb\002~\031\230\007\214\007\238\002\230\n\025\018\018\017\018\b\014\018\022 \006\"\187\018\026\b\022\002\141\b.\007=\002\134\b6\018.\029\210\bF\n\245\bR\002\186\bZ\br\b\190\002\246\t\162\001\138\018>\rj\t\210\nV\002\226\n\138\019\242\018r\031v\019\222\n\150\019\246\022\166\001\138\n\194\024Z\003\026\n\202\003\030\006\021\001\138\002\154\021\006\019\254\011Z\011\150\011\166\018\138\003&\020\002\001\146\024^\018\142\b\146\003.\015\006\rz\011\174\018\146\018\150\017&\017*\018\154\020\006\011\186\011\198\011\210\021\n\020\n\006r\011\238\b:\017\146\012\n\012\026\012\"\014B\001\150\017\150\b\162\018\158\012>\012F\020\014\020\018\018\162\020\022\001\154\000\n\012V\020*\001\238\012b\005\225\012n\012~\0206\018\170\001\238\012\138\007=\012\150\012\158\012\178\012\218\012\230\r\011\rn\021\014\rr\r\218\020V\000\n\r\222\014J\020Z\020\166\014^\017.\014\134\007=\018\174\014\138\020\170\007=\r\150\000\n\018\182\r\166\006\021\r\198\014\158\014\202\000\n\020\178\014\254\018\186\r\206\b\021\b\021\001\138\018\194\003r\b\021\000R\000V\000f\000\194\r\026\000\198\016\234\000\202\000\210\000\218\0016\016\238\001F\001N\015\014\001v\031\018\001~\016\242\001\134\002j\002r\002v\016\246\031\022\015\"\r\214\001\146\031\246\016\250\015\130\015\134\015\238\015\242\015>\016^\017\n\015N\002~\015n\016r\016\154\002\230\016\158\018\018\017\018\015v\018\022\001\138\016\178\018\026\016\202\016\222\016\254\001\150\002\134\017\006\018.\017\014\017\022\n\245\r\230\001\138\017\030\001\154\017\"\002\246\017J\017^\018>\017j\017r\017v\017~\017\142\018n\018r\017\158\019\222\015~\019\246\017\166\017\170\017\190\016V\003\026\017\198\003\030\0061\000\n\002\154\019\250\019\254\001\146\017f\017\222\018\138\003&\020\002\017\230\017\250\018\142\b\146\003.\018\002\018\014\001\238\018\146\018\150\017&\017*\018\154\020\006\018&\015\142\017\146\015y\020\n\007\245\018:\001\150\017\150\018F\018N\007\245\007\245\018V\0049\b\162\018\158\001\154\0049\020\014\020\018\018\162\020\022!\206\000\n\018^\020*\018z\000\n\005\225\018\130\018\234\0206\018\170\018\246\019.\019^\019\214\020\026\020\"\0202\020:\000\n\020B\021\014\020J\020R\020V\020\162\007\245\020\174\020Z\020\166\0061\017.\020\182\020\194\018\174\020\198\020\170\020\206\020\210\020\218\018\182\0061\0061\020\226\020\234\020\242\0061\020\178\001\138\018\186\021\026\0111\0111\021^\018\194\003r\0111\000R\000V\000f\000\194\r\026\000\198\016\234\000\202\000\210\000\218\0016\016\238\001F\001N\021f\001v\021v\001~\016\242\001\134\002j\002r\002v\016\246\021\134\002\186\021\142\021\146\020^\016\250\021\154\001\138\021\170\021\178\005\201\021\186\017\n\021\190\002~\021\206\021\214\021\238\002\230\021\246\018\018\017\018\022F\018\022\022\142\001\150\018\026\tm\022\154\023\014!\030\002\134\tu\018.\023\026\001\154\n\245\023:\001\146\023f\018>\tm\002\246\016\194\023v\018>\tu\023~\023\154\019\222\023\166\018n\018r\023\174\019\222\023\178\019\246\023\186\023\202\023\222\000\n\003\026\023\250\003\030\024\030\001\150\002\154\019\250\019\254\024*\024:\024B\018\138\003&\020\002\001\154\024R\018\142\b\146\003.\020b\024b\024j\018\146\018\150\017&\017*\018\154\020\006\024n\024v\024\134\004\245\020\n\024\154\024\182\024\202\024\214\tm\024\230\000\n\024\254\002a\tu\b\162\018\158!\142\025\014\020\014\020\018\018\162\020\022\025\026\000\n\025K\020*!\162\025s\025\139\025\183\005\201\0206\018\170!\250\025\207!\166\005\201\005\201\021\014\025\239\004\245\026\007\026\031\021\014\026*\026J\020V\026\182\005\201\005\201\020Z\020\166\026\198\017.\026\247\027N\018\174\027c\020\170\027\139\015\170\tm\018\182\015\186\027\151\015\218\tu\027\167\027\175\020\178\027\202\018\186\015\226\tm\005\201\027\211\018\194\003r\tu\000R\000V\000f\000\194\r\026\000\198\016\234\000\202\000\210\000\218\0016\016\238\001F\001N\027\219\001v\n\249\001~\016\242\001\134\002j\002r\002v\016\246\027\227\018>\015\234\027\254\028\015\016\250\0282\028:\028J\004\245\019\222\028g\017\n\028w\002~\004\245\004\245\028\127\002\230\028\146\018\018\017\018\028\155\018\022\028\163\028\171\018\026\004\245\028\182\028\219\028\231\002\134\028\250\018.\029\003\029\011\n\245\015\250\001\138\029\019\0296\029?\002\246\029G\004\245\018>\029z\029\170\015q\029\234\030\011\018n\018r\004\245\019\222!b\019\246\030\019\030\031\030/\0307\003\026\030C\003\030\030N\030^\002\154\019\250\019\254\001\146\023\162\030k\018\138\003&\020\002\030s\030z\018\142\b\146\003.\030\135\030\147\030\155\018\146\018\150\017&\017*\018\154\020\006\021\014\030\167\017\146\015y\020\n\030\179\030\206\001\150\017\150\031V\031~\031\142\031\194\031\202\031\250\b\162\018\158\001\154 \"\020\014\020\018\018\162\020\022 &\000\n .\020* [!\"!.\015q\015q\0206\018\170!>\015q!F!\131!\139!\146!\159!\182\000\n!\170\021\014!\186!\239\020V!\254\"\011\"/\020Z\020\166\"K\017.\"Z\"b\018\174\"n\020\170\"z\"\135\"\142\018\182\"\150\"\159\"\166\"\175\"\195\000\000\020\178\000\000\018\186\000\000\015y\015y\000\000\018\194\003r\015y\000R\000V\000f\000\194\r\026\000\198\016\234\000\202\000\210\000\218\0016\016\238\001F\001N\000\000\001v\031\018\001~\016\242\001\134\002j\002r\002v\016\246\031\022\000\000\000\000\000\000\000\000\016\250\000\000\000\000\000\000\000\000\000\000\000\000\017\n\000\000\002~\000\000\000\000\000\000\002\230\000\000\018\018\017\018\000\000\018\022\000\000\000\000\018\026\000\000\000\000\000\000\000\000\002\134\000\000\018.\000\000\000\000\n\245\000\000\000\000\000\000\000\000\000\000\002\246\000\000\000\000\000\000\000\000\007\237\000\000\000\000\000\000\019\242\018r\007\237\007\237\000\000\019\246 \166\000\000\000\000\000\000\003\026\000\000\003\030\000\000\007\237\002\154\021\006\019\254\000\000\000\000\000\000\018\138\003&\020\002\000\000\000\000\018\142\b\146\003.\000\000\000\000\000\000\018\146\018\150\017&\017*\018\154\020\006\000\000\000\000\007\237\005\001\020\n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\162\018\158\000\000\000\000\020\014\020\018\018\162\020\022\000\000\000\n\000\000\020*\000\000\000\000\005\225\000\000\000\000\0206\018\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000!Z\000\000\000\000\000\000\000\000\000\000\020V\000\000\000\000\000\000\020Z\020\166\000\000\017.\000\000\000\000\018\174\000\000\020\170\000\000\000\000\000\000\018\182\000\000\000\000\000\000\000\000\000\000\000\000\020\178\000\000\018\186\000\000\011\021\011\021\000\000\018\194\003r\011\021\000R\000V\000f\000\194\r\026\000\198\016\234\000\202\000\210\000\218\0016\016\238\001F\001N\004\253\001v\000\000\001~\016\242\001\134\002j\002r\002v\016\246\000\000\000\000\000\000\000\000\000\000\016\250\000\000\000\000\000\000\005\001\000\000\000\000\017\n\000\000\002~\005\001\005\001\000\000\002\230\000\000\018\018\017\018\000\000\018\022\000\000\000\000\018\026\005\001\000\000\000\000\000\000\002\134\000\000\018.\000\000\000\000\n\245\000\000\000\000\000\000\000\000\000\000\002\246\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\019\242\018r\005\001\000\000!b\019\246\021\"\000\000\000\000\000\000\003\026\000\000\003\030\000\000\000\000\002\154\021\006\019\254\000\000\000\000\000\000\018\138\003&\020\002\000\000\000\000\018\142\b\146\003.\000\000\000\000\000\000\018\146\018\150\017&\017*\018\154\020\006\000\000\000\000\000\000\015U\020\n\000\000\000\000\000\000\000\000\000\000\000\000\004\253\000\000\000\000\000\000\b\162\018\158\004\253\004\253\020\014\020\018\018\162\020\022\000\000\000\n\000\000\020*\000\000\000\000\004\253!*\000\000\0206\018\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020V\000\000\000\000\000\000\020Z\020\166\000\000\017.\004\253\000\000\018\174\000\000\020\170\000\000\000\000\000\000\018\182\000\000\000\000\000\000\000\000\000\000\000\000\020\178\000\000\018\186\000\000\015U\015U\000\000\018\194\003r\015U\000R\000V\000f\000\194\r\026\000\198\016\234\000\202\000\210\000\218\0016\016\238\001F\001N\000\000\001v\000\000\001~\016\242\001\134\002j\002r\002v\016\246\000\000\000\000\000\000\000\000\000\000\016\250\000\000\000\000\000\000\000\000\000\000\000\000\017\n\000\000\002~\000\000\000\000\000\000\002\230\000\000\018\018\017\018\000\000\018\022\000\000\000\000\018\026\000\000\000\000\000\000\000\000\002\134\000\000\018.\000\000\000\000\n\245\000\000\000\000\000\000\000\000\000\000\002\246\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\019\242\018r\000\000\000\000\000\000\019\246\031Z\000\000\000\000\000\000\003\026\000\000\003\030\000\000\000\000\002\154\021\006\019\254\000\000\000\000\000\000\018\138\003&\020\002\000\000\000\000\018\142\b\146\003.\000\000\000\000\000\000\018\146\018\150\017&\017*\018\154\020\006\000\000\000\000\000\000\000\000\020\n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\162\018\158\000\000\000\000\020\014\020\018\018\162\020\022\000\000\000\n\000\000\020*\000\000\000\000\000\000\000\000\000\000\0206\018\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020V\000\000\000\000\000\000\020Z\020\166\000\000\017.\000\000\000\000\018\174\000\000\020\170\000\000\000\000\000\000\018\182\000\000\000\000\000\000\000\000\000\000\000\000\020\178\000\000\018\186\000\000\015\161\015\161\000\000\018\194\003r\015\161\000R\000V\000f\000\194\r\026\000\198\016\234\000\202\000\210\000\218\0016\016\238\001F\001N\000\000\001v\000\000\001~\016\242\001\134\002j\002r\002v\016\246\000\000\000\000\000\000\000\000\000\000\016\250\000\000\000\000\000\000\000\000\000\000\000\000\017\n\000\000\002~\000\000\000\000\000\000\002\230\000\000\018\018\017\018\000\000\018\022\000\000\000\000\018\026\000\000\000\000\000\000\000\000\002\134\000\000\018.\000\000\000\000\n\245\000\000\000\000\000\000\000\000\000\000\002\246\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\019\242\018r\000\000\000\000\000\000\019\246\031Z\000\000\000\000\000\000\003\026\000\000\003\030\000\000\000\000\002\154\021\006\019\254\000\000\000\000\000\000\018\138\003&\020\002\000\000\000\000\018\142\b\146\003.\000\000\000\000\000\000\018\146\018\150\017&\017*\018\154\020\006\000\000\000\000\000\000\000\000\020\n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\162\018\158\000\000\000\000\020\014\020\018\018\162\020\022\000\000\000\n\000\000\020*\000\000\000\000\000\000\000\000\000\000\0206\018\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020V\000\000\000\000\000\000\020Z\020\166\000\000\017.\000\000\000\000\018\174\000\000\020\170\000\000\000\000\000\000\018\182\000\000\000\000\000\000\000\000\000\000\000\000\020\178\000\000\018\186\000\000\015\157\015\157\000\000\018\194\003r\015\157\000R\000V\000f\000\194\r\026\000\198\016\234\000\202\000\210\000\218\0016\016\238\001F\001N\000\000\001v\000\000\001~\016\242\001\134\002j\002r\002v\016\246\000\000\000\000\000\000\000\000\000\000\016\250\000\000\000\000\000\000\000\000\000\000\000\000\017\n\000\000\002~\000\000\000\000\000\000\002\230\000\000\018\018\017\018\000\000\018\022\000\000\000\000\018\026\016\234\000\000\000\000\000\000\002\134\016\238\018.\000\000\000\000\n\245\031&\000\000\016\242\000\000\000\000\002\246\000\000\016\246\031*\000\000\000\000\000\000\000\000\000\000\019\242\018r\000\000\000\000\000\000\019\246\022\218\000\000\000\000\000\000\003\026\000\000\003\030\000\000\001\138\002\154\021\006\019\254\000\000\000\000\000\000\018\138\003&\020\002\000\000\000\000\018\142\b\146\003.\000\000\021~\000\000\018\146\018\150\017&\017*\018\154\020\006\000\000\000\000\000\000\000\000\020\n\000\000\000\000\001\146\021\130\000\000\000\000\000\000\000\000\000\000\000\000\b\162\018\158\000\000\000\000\020\014\020\018\018\162\020\022\000\000\000\n\000\000\020*\000\000\000\000\017\146\000\000\000\000\0206\018\170\001\150\017\150\tm\000\000\000\000\000\000\n\249\000\000\000\000\000\000\001\154\000\000\000\000\020V\000\000\018>\tm\020Z\020\166\000\000\017.\000\000\000\000\018\174\019\222\020\170\000\000\000\000\000\000\018\182\000\000\000\000\000\000\000\000\000\000\000\n\020\178\000\000\018\186\000\000\005\245\000\000\000\000\018\194\003r\000R\000V\000f\000\194\r\026\000\198\016\234\000\202\000\210\000\218\0016\016\238\001F\001N\000\000\001v\000\000\001~\016\242\001\134\002j\002r\002v\016\246\000\000\000\000\000\000\000\000\tm\016\250\000\000\000\000\000\000\000\000\000\000\000\000\017\n\000\000\002~\000\000\000\000\000\000\002\230\000\000\018\018\017\018\000\000\018\022\000\000\000\000\018\026\016\234\000\000\000\000\000\000\002\134\016\238\018.\021\014\000\000\n\245\031&\000\000\016\242\000\000\000\000\002\246\000\000\016\246\031*\000\000\000\000\000\000\000\000\000\000\025\146\018r\000\000\000\000\000\000\019\246\tm\000\000\000\000\000\000\003\026\000\000\003\030\000\000\001\138\002\154\000\000\019\254\tm\000\000\000\000\018\138\003&\020\002\000\000\000\000\018\142\b\146\003.\000\000\021~\000\000\018\146\018\150\017&\017*\018\154\020\006\000\000\000\000\000\000\000\000\020\n\000\000\000\000\001\146\021\130\000\000\000\000\000\000\000\000\000\000\000\000\b\162\018\158\000\000\000\000\020\014\020\018\018\162\020\022\000\000\000\n\000\000\020*\000\000\000\000\017\146\014I\014I\0206\018\170\001\150\017\150\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\154\000\000\000\000\020V\000\000\000\000\000\000\020Z\020\166\000\000\017.\000\000\000\000\018\174\000\000\020\170\000\000\000\000\000\000\018\182\000\000\000\000\000\000\000\000\000\000\000\n\020\178\000\000\018\186\000\000\005\245\000\000\000\000\018\194\003r\000R\000V\000f\000\194\000\000\000\198\016\234\000\202\000\210\000\218\0016\016\238\001F\001N\000\000\001v\000\000\001~\016\242\001\134\002j\002r\002v\016\246\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014I\000\000\000\000\000\000\000\000\000\000\000\000\002~\000\000\t)\t)\002\230\000\000\018\018\t)\000\000\018\022\000\000\000\000\018\026\014I\000\000\000\000\000\000\002\134\000\000\023Z\000\000\000\000\n\245\000\000\014I\000\000\000\000\000\000\002\246\000\000\014I\014I\000\000\000\000\000\000\000\000\000\000\023j\018r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\026\000\000\003\030\000\000\000\000\002\154\000\000\000\000\000\022\000\000\000\000\018\138\003&\000\000\000\000\014I\018\142\001\238\003.\000\000\014I\014I\018\146\018\150\017&\023n\018\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\162\018\158\0075\000\000\000\000\000\000\018\162\0075\000\000\000\n\000\000\000n\0075\000\000\0075\000\000\0075\000\000\018\170\0075\0075\0075\000\000\014\n\0075\014\026\0075\000\000\0075\000\000\014\"\0075\r.\0075\0075\0075\0075\0075\000\000\017.\0075\0075\018\174\0075\023r\000\000\000\000\0075\018\182\0075\000\000\000\000\0075\0075\0075\023z\0075\018\186\000\000\0075\0075\0075\018\194\003r\000\000\0075\0075\000\000\0075\000\000\0075\0075\0075\000\000\000\000\0075\002V\000\000\0075\0075\000\000\000Z\0075\000Z\0075\0075\0075\000\000\000\000\0075\014V\000\000\000\000\0075\0075\000Z\0075\014\194\0075\0075\0075\0075\000Z\000\000\000\000\000\000\000\000\0075\0075\000\000\000\000\000\000\0075\0075\000\000\000\000\0075\000\000\000\000\000\000\000\000\000\000\0075\0075\000\000\0075\0075\000\000\0075\0075\000\000\000\000\0075\0075\0075\0075\0075\0075\0075\0075\000\000\0075\000\000\000\000\000\000\000\000\0075\0075\0075\000\000\0075\0075\0075\0075\0075\0075\000\000\0075\0075\000\000\0075\000\000\000\000\0075\000\000\000\000\0075\0075\000\000\000\000\0075\0075\0075\000\000\0075\0075\000\000\000\000\0075\000\000\000\000\000\000\000\000\0075\0075\0075\000\000\000\000\0075\0075\0075\0075\0075\000\000\000\000\000\000\000\000\0075\0075\000\000\000\000\000\000\0075\000R\000V\000f\000\194\000\000\000\198\000\000\000\202\000\210\000\218\0016\000\000\001F\001N\000\000\001v\000\000\001~\000\000\001\134\002j\002r\002v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002~\000\000\000\000\000\000\002\230\000\000\001\138\000\000\000\000\002\254\000\000\000\000\003\002\000\000\000\000\016\234\000\000\002\134\000\000\000\000\016\238\000\000\000\000\000\000\000\000\031&\000\000\016\242\002\246\000\000\000\000\002\250\016\246\031*\000\000\000\000\000\000\003\150\b\006\000\000\003\018\000\000\000\000\t\n\000\000\000\000\000\000\003\026\000\000\003\030\000\000\000\000\002\154\001\138\000\000\000\000\000\000\000\000\t\014\003&\000\000\000\000\000\000\t\018\001\238\003.\000\000\000\000\t\022\t\026\t\030\000\000\000\000\t\"\003>\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\146\017f\000\000\000\000\017M\000\000\000\000\t&\000\000\000\000\000\000\000\000\t*\000\000\000\000\000\n\000\000\000\000\000\000\000\000\000\000\000\000\017\146\000\000\t2\000\000\000\000\001\150\017\150\000\000\017M\017M\000\000\000\000\000\000\t6\000\000\001\154\b\254\000\000\000\000\000\000\000\000\000\000\000\000\017M\000\000\000\000\tB\000\000\000\000\017M\017M\000\000\tJ\t\006\000\000\005Y\n\142\000\000\000\000\017M\000\n\tN\017M\000\000\017M\005\245\tV\003r\000R\000V\000f\000\194\000\000\000\198\000\000\000\202\000\210\000\218\0016\000\000\001F\001N\000\000\001v\000\000\001~\000\000\001\134\002j\002r\002v\017M\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002~\000\000\000\000\000\000\002\230\n\154\001\138\000\000\000\000\002\254\000\000\000\000\003\002\000\000\000\000\000\000\000\000\002\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017M\000\000\000\000\002\246\000\000\n\158\002\250\017M\000\000\000\000\000\000\000\000\003\150\b\006\000\000\003\018\n\166\000\000\t\n\000\000\000\000\017M\003\026\000\000\003\030\000\000\000\000\002\154\017M\000\000\000\000\000\000\000\000\t\014\003&\000\000\017M\017M\t\018\001\238\003.\000\000\000\000\t\022\t\026\t\030\000\000\000\000\t\"\003>\000\000\005N\005V\000\194\000\000\000\198\000\000\005\178\005\186\005\194\006\030\000\000\006.\0066\000\000\006^\t&\006f\000\000\006n\006\154\t*\006\162\000\000\000\n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t2\000\000\000\000\000\000\000\000\006\170\000\000\000\000\000\000\000\000\000\000\t6\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\178\000\000\tB\000\000\000\000\000\000\000\000\000\000\tJ\000\000\000\000\t\173\000\000\000\000\000\000\005Q\000\000\tN\000\000\005Q\000\000\000\000\tV\003r\000R\000V\000f\000\194\000\000\000\198\000\000\000\202\000\210\000\218\0016\006\194\001F\001N\000\000\001v\000\000\001~\000\000\001\134\002j\002r\002v\005Q\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002~\000\000\000\000\000\000\002\230\000\000\001\138\000\000\000\000\002\254\000\000\000\000\003\002\005Q\000\000\000\000\000\000\002\134\000\000\000\000\000\000\000\000\000\000\000\000\005Q\000\000\000\000\000\000\002\246\000\000\000\000\002\250\000\000\000\000\000\000\000\000\000\000\003\150\b\006\000\000\003\018\000\000\000\000\t\n\000\000\000\000\000\000\003\026\000\000\003\030\000\000\000\000\002\154\001\225\005Q\005Q\001\225\000\000\t\014\003&\000\000\000\000\000\000\t\018\001\238\003.\000\000\000\000\t\022\t\026\t\030\000\000\004>\t\"\003>\005Q\005Q\000\000\005Q\001\225\001\225\000\000\000\000\000\000\005Q\005Q\000\000\000\000\000\000\005Q\000\000\t&\000\000\000\000\001\225\000\000\t*\000\000\001\225\000\n\001\225\001\225\000\000\000\000\000\000\000\000\000\000\000\000\t2\000\000\001\225\000\000\000\000\001\225\000\000\001\225\000\000\000\000\000\000\t6\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\tB\000\000\000\000\000\000\000\000\000\000\tJ\000\000\000\000\002Q\001\225\000\000\000\000\000\000\000\000\tN\000\000\000\000\000\000\000\000\tV\003r\000R\000V\000f\000\194\000\000\000\198\000\000\000\202\000\210\000\218\0016\000\000\001F\001N\000\000\001v\000\000\001~\000\000\001\134\002j\002r\002v\000\000\000\000\000\000\000\000\000\000\001\225\t~\000\000\001\225\000\000\000\000\000\000\001\225\000\000\000\000\002~\000\000\000\000\000\000\002\230\000\000\001\138\000\000\000\000\002\254\000\000\001\225\003\002\000\000\000\000\001\225\001\225\002\134\000\000\000\000\000\000\000\000\t\134\000\000\000\000\000\000\001\225\001\225\002\246\000\000\000\000\002\250\000\000\000\000\000\000\001\138\000\000\003\150\b\006\000\000\003\018\000\000\000\000\t>\000\000\000\000\000\000\003\026\000\000\003\030\000\000\021~\002\154\000\000\000\000\000\000\000\000\000\000\t\014\003&\000\000\000\000\000\000\t\018\001\238\003.\001\146\021\130\t\022\t\026\t\030\000\000\000\000\t\"\003>\000\000\000\000\000\000\000\000\005B\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\146\000\000\000\000\t&\000\000\001\150\017\150\000\000\t*\000\000\000\000\000\n\000\000\000\000\000\000\001\154\000R\000V\000f\000\194\t2\000\198\000\000\000\202\000\210\000\218\0016\000\000\001F\001N\000\000\001v\000\000\001~\000\000\001\134\002j\002r\002v\000\000\000\n\000\000\000\000\000\000\tB\000\000\000\000\000\000\000\000\000\000\tJ\000\000\000\000\t\189\002~\000\000\000\000\000\000\002\230\tN\001\138\000\000\000\000\002\234\tV\003r\002\238\000\000\000\000\000\000\000\000\002\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\141\002\246\000\000\000\000\002\250\000\000\000\000\000\000\000\000\000\000\003\014\003\n\000\000\003\018\000\000\000\000\000\000\000\000\000\000\000\000\003\026\000\000\003\030\000\000\000\000\002\154\000\000\000\000\000\000\000\000\000\000\003\"\003&\000\000\000\000\000\000\003*\001\238\003.\000\000\000\000\000\000\0032\0036\000\000\000\000\003:\003>\000\000\0152\015:\000\194\000\000\000\198\000\000\015\150\015\158\015\166\016\002\000\000\016\018\016\026\000\000\016B\003B\016J\000\000\016R\016~\003F\016\134\000\000\000\n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003N\000\000\000\000\000\000\000\000\016\142\000\000\000\000\000\000\000\000\000\000\003R\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\150\000\000\003V\000\000\000\000\000\000\000\000\000\000\003b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003z\000\000\000\000\000\000\000\000\003j\003r\001\133\001\133\001\133\001\133\000\000\001\133\0075\001\133\001\133\001\133\001\133\016\166\001\133\001\133\000\000\001\133\000\000\001\133\0075\001\133\001\133\001\133\001\133\000\000\000\000\000\000\000\000\026\018\000\000\0075\000\000\0075\000\000\000\000\000\000\0075\0075\001\133\001\133\001\133\000\000\0075\000\000\026\022\000\000\000\000\000\000\0075\000\000\001\133\0075\000\000\000\000\000\000\0075\001\133\000\000\000\000\001\133\000\000\0075\000\000\001\133\000\000\000\000\026\"\000\000\000\000\001\133\000\000\000\000\0075\015\026\000\000\000\000\001\133\0075\000Z\000\000\000\000\001\133\000\000\0075\000\000\000\000\000\000\000\000\000\000\000\000\001\133\001\133\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0075\000\000\000\000\0075\000\000\000\000\0075\000\000\001\133\000\000\000\000\001\133\000\000\000\000\001\133\000\000\000\000\000\000\000\000\0075\000\000\000\000\000\000\000\000\0075\0075\0075\001\133\0075\0075\000\000\0075\001\133\000\000\001\133\000\000\000\000\001\133\0075\026&\000\000\0075\000\000\000\000\001\133\000\000\001\133\000\000\000\000\001\133\000\000\000\000\000\000\000\000\000\000\000\000\0075\000\000\000\000\000\000\000\000\0075\0075\000\000\001\133\001\133\000\000\000\000\000\000\001\133\001\133\000\000\000\000\000\000\000R\r\030\r&\000\194\000\000\000\198\026\250\r\130\r\138\r\146\r\238\000\000\r\254\014\006\026.\014.\000\000\0146\000\000\014>\014j\002r\014r\000\000\000\000\000\000\0262\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0266\014z\026:\000\000\000\000\000\000\026>\000\000\000\000\000\000\000\000\000\000\026B\000\000\000\000\000\000\000\000\000\000\030J\000\000\000\000\026N\000\000\000\000\000\000\026R\000\000\000\000\000\000\000\000\000\000\026V\000\000\000\000\000\000\000\000\000\000\000\000\014\146\000\000\000\000\000\000\000\000\027\230\000\000\000\000\000\000\026Z\029R\000\000\000\000\016\250\000\000\014\190\000\000\000\000\000\000\000\000\017\n\000\000\000\000\000\000\000\000\000\000\002\230\000\000\001\138\017\018\000\000\018\022\000\000\000\000\018\026\000\000\000\000\014\214\000\000\000\000\026^\018.\000\000\026b\n\245\000\000\000\000\000\000\000\000\000\000\002\246\000\000\000\000\000\000\000\000\000\000\026f\000\000\000\000\020&\018r\026j\000\n\026n\019\246\026r\026v\000\000\026z\003\026\000\000\003\030\000\000\000\000\000\000\026~\019\254\000\000\026\130\000\000\018\138\003&\020\002\000\000\000\000\018\142\b\146\003.\000\000\000\000\000\000\018\146\018\150\026\134\000\000\018\154\020\006\000\000\026\138\026\142\000\000\020\n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\162\018\158\000\000\000\000\020\014\020\018\018\162\020\022\000\000\000\n\000\000\020*\000\000\000\000\000\000\000\000\000\000\0206\018\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020V\000\000\000\000\000\000\020Z\020\166\016\250\000\000\000\000\000\000\018\174\000\000\020\170\017\n\000\000\000\000\018\182\000\000\000\000\002\230\000\000\001\138\017\018\020\178\018\022\018\186\000\000\018\026\016\234\000\000\018\194\003r\000\000\016\238\018.\000\000\000\000\n\245\031&\000\000\016\242\000\000\000\000\002\246\000\000\016\246\031*\000\000\000\000\000\000\000\000\000\000\018\134\018r\000\000\000\000\000\000\019\246\000\000\000\000\000\000\000\000\003\026\000\000\003\030\000\000\001\138\000\000\000\000\019\254\000\000\000\000\000\000\018\138\003&\020\002\000\000\000\000\018\142\b\146\003.\000\000\021~\000\000\018\146\018\150\000\000\000\000\018\154\020\006\000\000\000\000\000\000\000\000\020\n\000\000\000\000\001\146\021\130\000\000\000\000\000\000\000\000\000\000\000\000\b\162\018\158\000\000\000\000\020\014\020\018\018\162\020\022\000\000\000\n\000\000\020*\000\000\000\000\017\146\000\000\000\000\0206\018\170\001\150\017\150\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\154\000\000\000\000\020V\000\000\000\000\000\000\020Z\020\166\000\000\000\000\000\000\000\000\018\174\000\000\020\170\000\000\000\000\000\000\018\182\000\000\000\000\000\000\000\000\000\000\000\n\020\178\000\000\018\186\000\000\005\245\000\000\000\000\018\194\003r\000R\000V\000f\000\194\000\000\000\198\000\000\000\202\000\210\000\218\0016\000\000\001F\001N\000\000\001v\000\000\001~\000\000\001\134\002j\002r\002v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\138\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002~\000\000\011a\011a\002\230\000\000\001\138\011a\024Z\018\022\000\000\000\000\018\026\000\000\000\000\000\000\000\000\002\134\000\000\000\000\000\000\000\000\000\000\001\146\024^\000\000\000\000\000\000\002\246\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005B\025\146\018r\000\000\000\000\000\000\000\000\000\000\000\000\017\146\000\000\003\026\000\000\003\030\001\150\017\150\002\154\017\241\000\000\000\000\017\241\000\000\018\138\003&\001\154\000\000\000\000\018\142\001\238\003.\000\000\000\000\000\000\018\146\018\150\000\000\r\141\018\154\000\000\000\000\000\000\000\000\000\000\017\241\017\241\000\000\000\000\000\000\017\241\000\n\000\000\017\241\017\241\000\000\b\162\018\158\000\000\000\000\017\241\000\000\018\162\017\241\017\241\000\n\017\241\017\241\000\000\r\141\017\241\000\000\017\241\017\241\018\170\000\000\017\241\000\000\000\000\017\241\000\000\017\241\017\241\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\141\000\000\000\000\000\000\r\141\000\000\018\174\000\000\000\000\000\000\000\000\000\000\018\182\000\000\r\141\000\000\017\241\000\000\017\241\000\000\000\000\018\186\000\000\000\000\000\000\000\000\018\194\003r\000\000\017\241\000\000\000\000\000\000\000\000\000\000\000\000\017\241\000\000\000\000\r\141\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006Y\000\000\000\000\006Y\000\000\000\000\017\241\017\241\000\000\017\241\017\241\017\241\000\000\017\241\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\241\000\000\000\000\000\000\006Y\006Y\000\000\006Y\017\241\000\000\017\241\000\000\006Y\006Y\000\000\000\000\017\241\017\241\017\241\006Y\017\241\017\241\017\241\r\137\000\000\006Y\006Y\000\000\000\000\006Y\006Y\006Y\006Y\000\000\000\000\006Y\000\000\000\000\006Y\006Y\006Y\006Y\000\000\000\000\000\000\006Y\000\000\000\000\006Y\006Y\000\000\006Y\006Y\000\000\r\137\006Y\000\000\006Y\006Y\000\000\000\000\006Y\000\000\000\000\006Y\000\000\006Y\006Y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\r\137\000\000\000\000\000\000\000\000\000\000\006Y\000\000\000\000\000\000\r\137\000\000\006Y\000\000\006Y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006Y\006Y\006Y\000\000\000\000\b\205\006Y\006Y\006Y\000\000\r\137\000\000\000\000\000\000\000\000\000\000\000\000\006Y\000\000\000\000\000\000\000\000\006Y\000\000\000\000\006Y\000\000\006Y\006Y\006Y\006Y\b\205\006Y\006Y\006Y\000\000\000\000\006Y\006Y\000\000\000\000\000\000\000\000\006Y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006Y\000\000\006Y\000\000\000\000\000\000\000\000\000\000\006Y\006Y\006Y\000\000\006Y\006Y\006Y\012\249\012\249\012\249\012\249\000\000\012\249\000\000\012\249\012\249\012\249\012\249\000\000\012\249\012\249\000\000\012\249\000\000\012\249\000\000\012\249\012\249\012\249\012\249\000\000\000\000\017\161\000\000\000\000\017\161\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\249\012\249\012\249\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\249\000\000\017\161\017\161\000\000\000\000\012\249\017\161\000\000\027\n\003\138\017\161\000\000\027\018\000\000\000\000\000\000\017\161\000\000\012\249\017\161\017\161\000\000\017\161\017\161\000\000\012\249\003\146\000\000\017\161\003\166\012\249\000\000\017\161\000\000\000\000\017\161\000\000\017\161\017\161\012\249\012\249\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\249\000\000\017\161\012\249\017\161\000\000\012\249\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\161\000\000\000\000\000\000\012\249\000\000\000\000\005\002\000\000\012\249\000\000\012\249\000\000\000\000\012\249\000\000\000\000\000\000\000\000\000\000\000\000\012\249\000\000\012\249\000\000\000\000\012\249\017\161\017\161\000\000\017\161\017\161\005\006\000\000\017\161\000\000\000\000\000\000\000\000\000\000\000\000\012\249\012\249\005\014\000\000\000\000\027f\012\249\017\161\000\000\000\000\017\161\017\161\017\161\017\161\017\161\000\000\000\000\000\000\017\161\017\161\017\161\000\000\017\161\017\161\017\161\0171\000\000\000\000\0171\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0171\0171\000\000\000\000\000\000\0171\000\000\000\000\003\138\0171\000\000\000\000\000\000\000\000\000\000\0171\000\000\000\000\0171\0171\000\000\0171\0171\000\000\000\000\003\146\000\000\0171\003\166\000\000\000\000\0171\000\000\000\000\0171\000\000\0171\0171\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0171\000\000\0171\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0171\012\233\012\233\012\233\012\233\000\000\012\233\005\002\012\233\012\233\012\233\012\233\000\000\012\233\012\233\000\000\012\233\000\000\012\233\000\000\012\233\012\233\012\233\012\233\000\000\000\000\000\000\0171\0171\000\000\0171\0171\005\006\000\000\0171\000\000\000\000\000\000\012\233\012\233\012\233\000\000\000\000\005\014\000\000\000\000\000\000\000\000\0171\000\000\012\233\0171\0171\0171\0171\0171\012\233\000\000\000\000\0171\0171\0171\000\000\0171\0171\0171\005N\005V\000\194\012\233\000\198\000\000\005\178\005\186\005\194\006\030\012\233\006.\0066\000\000\006^\012\233\006f\000\000\006n\006\154\000\000\006\162\000\000\000\000\012\233\012\233\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\170\000\000\000\000\000\000\000\000\000\000\002\162\000\000\000\000\000\000\012\233\000\000\000\000\012\233\000\000\000\000\012\233\006\178\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\233\000\000\000\000\000\000\000\000\012\233\000\000\012\233\000\000\000\000\012\233\000\000\000\000\000\000\000\000\000\000\000\000\012\233\000\000\012\233\000\000\000\000\012\233\006\194\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\233\012\233\000\000\000\000\000\000\027\014\012\233\012\237\012\237\012\237\012\237\000\000\012\237\000\000\012\237\012\237\012\237\012\237\000\000\012\237\012\237\000\000\012\237\000\000\012\237\000\000\012\237\012\237\012\237\012\237\000\000\000\000\006a\000\n\000\000\006a\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\237\012\237\012\237\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\237\000\000\006a\006a\000\000\000\000\012\237\006a\000\000\027j\006a\006a\000\000\000\000\000\000\000\000\000\000\006a\000\000\012\237\006a\006a\000\000\006a\006a\000\000\012\237\006a\000\000\006a\006a\012\237\000\000\006a\000\000\000\000\006a\000\000\006a\006a\012\237\012\237\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\237\000\000\006a\012\237\006a\000\000\012\237\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006a\000\000\000\000\000\000\012\237\000\000\000\000\006a\000\000\012\237\000\000\012\237\000\000\000\000\012\237\000\000\000\000\000\000\000\000\000\000\000\000\012\237\000\000\012\237\000\000\000\000\012\237\006a\006a\000\000\006a\b\217\006a\000\000\006a\000\000\000\000\000\000\000\000\000\000\000\000\012\237\012\237\006a\000\000\000\000\006]\012\237\006a\006]\000\000\006a\000\000\006a\000\000\006a\000\000\000\000\000\000\006a\006a\006a\000\000\006a\006a\006a\000\000\000\000\000\000\000\000\000\000\000\000\006]\006]\000\000\000\000\000\000\006]\000\000\000\000\006]\006]\000\000\000\000\000\000\017e\000\000\006]\000\000\000\000\006]\006]\000\000\006]\006]\000\000\000\000\006]\000\000\006]\006]\000\000\000\000\006]\000\000\000\000\006]\000\000\006]\006]\000\000\017e\017e\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017e\000\000\000\000\000\000\000\000\000\000\017e\017e\000\000\006]\000\000\006]\000\000\000\000\b:\000\000\017e\000\000\000\000\017e\000\000\017e\006]\000R\r\030\r&\000\194\000\000\000\198\006]\r\130\r\138\r\146\r\238\000\000\r\254\014\006\000\000\014.\000\000\0146\000\000\014>\014j\002r\014r\000\000\000\000\017e\006]\006]\000\000\006]\b\209\006]\000\000\006]\000\000\000\000\000\000\027r\014z\027\142\000\000\000\000\006]\000\000\000\000\000\000\000\000\006]\000\000\027\154\006]\000\000\006]\000\000\006]\014\130\000\000\000\000\006]\006]\006]\000\000\006]\006]\006]\017e\000\000\000\000\027\178\000\000\000\000\000\000\017e\000\000\000\000\014\146\000\000\000\000\000\000\000\000\027\230\000\000\000\000\000\000\000\000\000\000\017e\000\000\000\000\028\006\014\190\000\000\000\000\017e\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017e\017e\000\000\000\000\000\000\002\230\000\000\001\138\000\000\000\000\b\030\014\214\000\000\b\"\028\018\000\000\000\000\028j\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\246\028\130\000\000\000\000\000\000\000\000\028\174\000\000\n\221\b>\bJ\028\222\000\000\bb\bz\b~\000\000\000\000\028\234\003\026\029\022\003\030\000\000\030\022\000\000\000\000\000\000\000\000\000\000\000\000\b\130\003&\000\000\b\134\b\138\b\142\b\146\003.\030\"\030:\000\000\b\150\b\154\000\000\030F\b\158\001\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\162\b\166\000\000\000\000\000\000\000\000\b\170\000\000\000\000\000\n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\178\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007U\000\000\b\182\000\000\b\198\002\230\000\000\001\138\000\000\000\000\b\030\000\000\000\000\b\"\000\000\b\206\000\000\000\000\000\000\000\000\000\000\b\214\000\000\000\000\000\000\000\000\000\000\005i\000\000\002\246\b\218\000\000\000\000\000\000\000\000\b\226\003r\000\000\b>\bJ\000\000\000\000\bb\bz\b~\000\000\000\000\000\000\003\026\000\000\003\030\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\130\003&\000\000\b\134\b\138\b\142\b\146\003.\000\000\000\000\000\000\b\150\b\154\000\000\000\000\b\158\001\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\162\b\166\000\000\000\000\000\000\000\000\b\170\000\000\000\000\000\n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\178\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007U\000\000\b\182\000\000\b\198\002\230\000\000\001\138\000\000\000\000\b\030\000\000\000\000\b\"\000\000\b\206\000\000\000\000\000\000\000\000\000\000\b\214\000\000\000\000\000\000\000\000\000\000\n\001\000\000\002\246\b\218\000\000\000\000\000\000\000\000\b\226\003r\000\000\b>\bJ\000\000\n\226\bb\bz\b~\000\000\000\000\000\000\003\026\000\000\003\030\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\130\003&\000\000\b\134\b\138\b\142\b\146\003.\n\234\n\242\000\000\b\150\b\154\000\000\000\000\b\158\001\154\000\000\000\000\000\000\000\000\000\000\000\000\n\250\000\000\000\000\000\000\000\000\000\000\011\002\011\n\000\000\b\162\b\166\000\000\000\000\000\000\000\000\b\170\011\018\000\000\000\n\011\026\000\000\011\"\000\000\000\000\000\000\000\000\000\000\b\178\000\000\017\185\000\000\000\000\017\185\000\000\000\000\000\000\007U\000\000\b\182\000\000\b\198\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011*\000\000\000\000\b\206\000\000\000\000\000\000\017\185\017\185\b\214\000\000\000\000\017\185\000\000\000\000\002\129\017\185\000\000\b\218\000\000\000\000\000\000\017\185\b\226\003r\017\185\017\185\000\000\017\185\017\185\000\000\000\000\000\000\000\000\017\185\000\000\b:\000\000\017\185\000\000\0112\017\185\000\000\017\185\017\185\000\000\000\000\011:\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\173\000\000\000\000\000\000\000\000\000\000\000\000\006\173\000\000\017\185\000\000\017\185\000\000\000\000\000\000\011B\011J\000\000\000\000\000\000\000\000\000\000\017\185\000R\000V\000f\000\194\r\026\000\198\016\234\000\202\000\210\000\218\0016\016\238\001F\001N\000\000\001v\031\018\001~\016\242\001\134\002j\002r\002v\016\246\031\022\000\000\017\185\017\185\000\000\017\185\017\185\000\000\000\000\017\185\000\000\000\000\000\000\000\000\002~\017I\000\000\000\000\017I\000\000\002\162\000\000\000\000\017\185\000\000\000\000\017\185\017\185\017\185\017\185\017\185\002\134\000\000\000\000\017\185\017\185\017\185\000\000\017\185\017\185\017\185\017I\017I\000\000\000\000\000\000\017I\000\000\000\000\000\000\017I\002\150\000\000\000\000\000\000\000\000\017I\000\000\000\000\017I\017I\000\000\017I\017I\000\000\000\000\002\154\000\000\017I\000\000\b:\000\000\017I\000\000\000\000\017I\000\000\017I\017I\000\000\000\000\000\000\000\000\000\000\000\000\017&\017*\000\000\014\150\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017I\000\000\017I\000\000\000\000\000\000\000\000\000\000\000\000\000\n\000\000\000\000\000\000\017I\005\225\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007M\017.\017I\017I\000\000\017I\017I\000\000\000\000\017I\000\000\007M\000\000\000\000\000\000\017\133\007M\000\000\017\133\000\000\000\000\000\000\000\000\017I\000\000\000\000\017I\017I\017I\017I\017I\000\000\000\000\000\000\017I\017I\017I\000\000\017I\017I\017I\017\133\017\133\000\000\000\000\000\000\017\133\000\000\000\000\018\218\017\133\000\000\000\000\000\000\000\000\000\000\017\133\000\000\000\000\017\133\017\133\000\000\017\133\017\133\000\000\000\000\018\226\000\000\017\133\018\238\000\000\000\000\017\133\000\000\000\000\017\133\000\000\017\133\017\133\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\133\000\000\017\133\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\133\000\000\000\000\000\000\000\000\000\000\000\000\018\250\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\133\017\133\000\000\017\133\000\000\018\254\002\230\017\133\001\138\000\000\000\000\b\030\000\000\000\000\b\"\000\000\019\006\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\133\000\000\017\133\000\000\000\000\000\000\002\246\000\000\017\133\017\133\017\133\000\000\017\133\017\133\017\133\b>\bJ\000\000\000\000\bb\bz\011r\000\000\000\000\000\000\003\026\000\000\003\030\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\130\003&\000\000\b\134\b\138\b\142\b\146\003.\000\000\000\000\000\000\b\150\b\154\000\000\000\000\b\158\001\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\209\000\000\000\000\001\209\000\000\000\000\000\000\b\162\b\166\000\000\000\000\000\000\000\000\b\170\000\000\001\209\000\n\000\000\001\209\000\000\000\000\000\000\000\000\000\000\000\000\b\178\001\209\001\209\000\000\000\000\000\000\001\209\000\000\000\000\007U\001\209\000\000\000\000\b\198\000\000\000\000\001\209\001\209\000\000\001\209\001\209\001\209\001\209\001\209\b\206\001\209\000\000\000\000\001\209\000\000\b\214\001\209\001\209\000\000\001\209\001\209\n\017\001\209\001\209\b\218\000\000\000\000\000\000\001\209\b\226\003r\000\000\001\209\000\000\000\000\001\209\000\000\001\209\001\209\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\209\000\000\001\209\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\209\000\000\001\209\000\000\001\209\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\209\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\209\003\174\000\000\001\209\001\209\000\000\000\000\001\209\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\209\003\182\000\000\001\209\001\209\000\000\001\209\001\209\000\000\001\209\001\209\001\209\001\209\001Y\000\000\000\000\001Y\004\242\001\209\001\209\000\000\001\209\001\209\001\209\001\209\001\209\001\209\001\209\000\000\000\000\000\000\000\000\004\230\001\209\001\209\000\000\001\209\001\209\001\209\001Y\001Y\000\000\000\000\000\000\001Y\000\000\000\000\000\000\001Y\000\000\000\000\000\000\000\000\000\000\003\238\000\000\000\000\001Y\001Y\000\000\001Y\001Y\000\000\000\000\000\000\000\000\001Y\000\000\000\000\000\000\001Y\000\000\000\000\003\246\000\000\004\006\001Y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001Y\000\000\001Y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001Y\005I\005I\005I\005I\000\000\005I\000\000\005I\005I\005I\005I\000\000\005I\005I\000\000\005I\000\000\005I\000\000\005I\005I\005I\005I\000\000\000\000\000\000\001Y\000\000\000\000\001Y\001Y\000\000\002\202\003\254\000\000\000\000\000\000\000\000\005I\001M\000\000\000\000\001M\000\000\005I\000\000\000\000\001Y\000\000\000\000\001Y\001Y\001Y\001Y\001Y\005I\000\000\000\000\000\000\001Y\001Y\000\000\001Y\001Y\001Y\001M\001M\000\000\000\000\000\000\001M\000\000\000\000\000\000\001M\005I\000\000\000\000\000\000\000\000\001M\005I\000\000\001M\001M\000\000\001M\001M\000\000\000\000\005I\000\000\001M\000\000\000\000\000\000\001M\000\000\000\000\003\246\000\000\001M\001M\000\000\005I\005I\000\000\000\000\000\000\000\000\000\000\000\000\005I\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001M\000\000\001M\000\000\000\000\000\000\000\000\000\000\000\000\005I\000\000\000\000\000\000\001M\000R\000V\000f\000\194\000\000\000\198\000\000\000\202\000\210\000\218\0016\000\000\001F\001N\000\000\001v\000\000\001~\000\000\001\134\002j\002r\002v\000\000\000\000\000\000\001M\000\000\000\000\001M\001M\000\000\000\000\003\254\000\000\000\000\000\000\000\000\002~\001Q\005I\000\000\001Q\000\000\002\162\000\000\000\000\001M\000\000\000\000\001M\001M\001M\001M\001M\002\134\000\000\000\000\000\000\001M\001M\000\000\001M\001M\001M\001Q\001Q\000\000\000\000\000\000\001Q\000\000\000\000\000\000\001Q\002\166\000\000\000\000\000\000\000\000\001Q\002\194\000\000\001Q\001Q\000\000\001Q\001Q\000\000\000\000\002\154\000\000\001Q\000\000\000\000\000\000\001Q\000\000\000\000\003\246\000\000\001Q\001Q\000\000\002\170\002\174\000\000\000\000\000\000\000\000\000\000\000\000\002\178\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001Q\000\000\001Q\000\000\000\000\000\000\000\000\000\000\000\000\000\n\000\000\000\000\000\000\001Q\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\198\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001Q\000\000\000\000\001Q\001Q\000\000\000\000\003\254\000\000\000\000\000\000\000\000\000\000\001U\015\017\000\000\001U\000\000\000\000\000\000\000\000\001Q\000\000\000\000\001Q\001Q\001Q\001Q\001Q\000\000\000\000\000\000\000\000\001Q\001Q\000\000\001Q\001Q\001Q\001U\001U\000\000\000\000\000\000\001U\000\000\000\000\000\000\001U\000\000\000\000\000\000\000\000\000\000\003\238\000\000\000\000\001U\001U\000\000\001U\001U\000\000\000\000\000\000\000\000\001U\000\000\000\000\000\000\001U\000\000\000\000\003\246\000\000\004\006\001U\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001U\000\000\001U\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001U\000R\000V\000f\000\194\000\000\000\198\000\000\000\202\000\210\000\218\0016\000\000\001F\001N\000\000\001v\000\000\001~\000\000\001\134\002j\002r\002v\000\000\000\000\000\000\001U\000\000\000\000\001U\001U\000\000\000\000\003\254\000\000\000\000\000\000\000\000\002~\001e\000\000\000\000\001e\000\000\002\162\000\000\000\000\001U\000\000\000\000\001U\001U\001U\001U\001U\002\134\000\000\000\000\000\000\001U\001U\000\000\001U\001U\001U\003\230\004\014\000\000\000\000\000\000\001e\000\000\000\000\000\000\001e\002\166\000\000\000\000\000\000\000\000\003\238\002\194\000\000\001e\001e\000\000\001e\001e\000\000\000\000\002\154\000\000\001e\000\000\000\000\000\000\001e\000\000\000\000\003\246\000\000\004\006\001e\000\000\002\170\002\174\000\000\000\000\000\000\000\000\000\000\000\000\002\178\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\030\000\000\001e\000\000\000\000\000\000\000\000\000\000\000\000\000\n\000\000\000\000\000\000\001e\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\198\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001e\000\000\000\000\001e\001e\000\000\000\000\003\254\000\000\000\000\000\000\000\000\000\000\001]\002\181\000\000\001]\000\000\000\000\000\000\000\000\001e\000\000\000\000\001e\001e\001e\001e\001e\000\000\000\000\000\000\000\000\001e\001e\000\000\001e\001e\001e\003\230\004\014\000\000\000\000\000\000\001]\000\000\000\000\000\000\001]\000\000\000\000\000\000\000\000\000\000\003\238\000\000\000\000\001]\001]\000\000\001]\001]\000\000\000\000\000\000\000\000\001]\000\000\000\000\000\000\001]\000\000\000\000\003\246\000\000\004\006\001]\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001]\000\000\001]\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001]\000R\000V\000f\000\194\000\000\000\198\000\000\000\202\000\210\000\218\0016\000\000\001F\001N\000\000\001v\000\000\001~\000\000\001\134\002j\002r\002v\000\000\000\000\000\000\001]\000\000\000\000\001]\001]\000\000\000\000\003\254\000\000\000\000\000\000\000\000\002~\001a\000\000\000\000\001a\000\000\002\162\000\000\000\000\001]\000\000\000\000\001]\001]\001]\001]\001]\002\134\000\000\000\000\000\000\001]\001]\000\000\001]\001]\001]\003\230\004\014\000\000\000\000\000\000\001a\000\000\000\000\000\000\001a\002\166\000\000\000\000\000\000\000\000\003\238\002\194\000\000\001a\001a\000\000\001a\001a\000\000\000\000\002\154\000\000\001a\000\000\000\000\000\000\001a\000\000\000\000\003\246\000\000\004\006\001a\000\000\002\170\002\174\000\000\000\000\000\000\000\000\000\000\000\000\002\178\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\030\000\000\001a\000\000\000\000\000\000\000\000\000\000\000\000\000\n\000\000\000\000\000\000\001a\000R\000V\000f\000\194\000\000\000\198\000\000\000\202\000\210\000\218\0016\000\000\001F\001N\000\000\001v\000\000\001~\000\000\001\134\002j\002r\002v\000\000\000\000\000\000\001a\000\000\000\000\001a\001a\000\000\000\000\003\254\000\000\000\000\000\000\000\000\002~\001i\002\173\000\000\001i\000\000\000\000\000\000\000\000\001a\000\000\000\000\001a\001a\001a\001a\001a\002\134\000\000\000\000\000\000\001a\001a\000\000\001a\001a\001a\003\230\004\014\000\000\000\000\000\000\001i\000\000\000\000\000\000\001i\002\150\000\000\000\000\000\000\000\000\003\238\007\014\000\000\001i\001i\000\000\001i\001i\000\000\000\000\002\154\000\000\001i\000\000\007\018\007\022\004\022\000\000\000\000\003\246\000\000\004\006\001i\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\026\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\030\000\000\001i\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001i\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\030\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004&\000\000\000\000\001i\001i\000\000\000\000\003\254\000\000\000\000\000\000\005y\000\000\001q\000\000\000\000\001q\000\000\000\000\000\000\000\000\001i\000\000\000\000\001i\001i\001i\001i\001i\000\000\000\000\000\000\000\000\001i\001i\000\000\001i\001i\001i\003\230\004\014\000\000\000\000\000\000\001q\000\000\000\000\000\000\001q\000\000\000\000\000\000\000\000\000\000\003\238\000\000\000\000\001q\001q\000\000\001q\001q\000\000\000\000\000\000\000\000\001q\000\000\000\000\000\000\004\022\000\000\000\000\003\246\000\000\004\006\001q\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\030\000\000\001q\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001q\000R\000V\000f\000\194\000\000\000\198\000\000\000\202\000\210\000\218\0016\000\000\001F\001N\000\000\001v\000\000\001~\000\000\001\134\002j\002r\002v\000\000\000\000\000\000\004&\000\000\000\000\001q\001q\000\000\000\000\003\254\000\000\000\000\000\000\000\000\002~\004\134\000\000\000\000\001m\000\000\000\000\000\000\000\000\001q\000\000\000\000\001q\001q\001q\001q\001q\002\134\000\000\000\000\000\000\001q\001q\000\000\001q\004.\001q\003\230\004\014\000\000\000\000\000\000\001m\000\000\000\000\000\000\001m\002\150\000\000\000\000\000\000\000\000\003\238\007\014\000\000\001m\001m\000\000\001m\001m\000\000\000\000\002\154\000\000\001m\000\000\007\018\007\022\004\022\000\000\000\000\003\246\000\000\004\006\001m\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\026\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\030\000\000\001m\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001m\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\030\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004&\000\000\000\000\001m\001m\000\000\000\000\003\254\000\000\000\000\000\000\n9\000\000\004\134\000\000\000\000\001u\000\000\000\000\000\000\000\000\001m\000\000\000\000\001m\001m\001m\001m\001m\000\000\000\000\000\000\000\000\001m\001m\000\000\001m\004.\001m\003\230\004\014\000\000\000\000\000\000\001u\000\000\000\000\000\000\001u\000\000\000\000\000\000\000\000\000\000\003\238\000\000\000\000\001u\001u\000\000\001u\004\142\t\194\000\000\000\000\t\202\001u\000\000\000\000\000\000\004\022\000\000\000\000\003\246\000\000\004\006\001u\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\218\t\226\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\030\t\234\001u\000\000\000\000\0025\000\000\t\242\t\250\000\000\000\000\000\000\000\000\001u\000\000\000\000\000\000\n\002\000\000\000\000\n\n\004%\n\018\000\000\000\000\000j\004%\000\000\000z\000\000\000\154\004%\000\000\004%\000\000\000\000\000\000\000\162\004%\004%\004&\000\000\000\000\001u\001u\000\000\000\000\003\254\000\000\n\026\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004%\000\000\001u\000\000\000\000\001u\001u\001u\001u\001u\000\000\000\170\004%\000\000\001u\001u\004%\001u\004.\001u\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n\"\004%\004%\0025\000\000\000\000\000\000\n*\000\000\000\000\000\000\000\000\000\000\000\000\004%\000\000\000\186\000\000\000\000\000\000\000\000\0025\000\000\004%\000\000\0025\0025\000\000\004%\004%\000\000\000\000\000\000\000\000\000\000\000\000\n2\n:\004%\000\000\004!\000\000\004%\000\000\000\222\004!\000\000\000\238\000\000\001\014\004!\000\000\004!\004%\000\000\000\000\001\022\004!\004!\000\000\000\000\000\000\000\000\004%\000\000\000\000\000\000\000\000\004%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\030\004!\000\000\000\000\000\000\004!\000\000\000\000\000\000\000\000\000\000\000\000\004%\000\000\000\000\004%\004%\000\000\000\000\004%\004!\004!\000\000\003\218\004%\004%\0046\000\000\000\000\004%\000\000\000\000\000\000\004!\000\000\001.\000\000\000\000\000\000\000\000\000\000\000\000\004!\000\000\000\000\000\000\000\000\004!\004!\004f\004n\000\189\000\000\000\000\002-\000\000\000\000\004!\002-\000\000\000\000\004!\000\000\000\000\004v\000\000\000\000\002-\002-\000\165\004~\004\158\004!\000\000\000\000\000\000\002-\003\230\004\014\000\000\004\166\000\000\004!\004\174\000\000\004\182\002-\004!\000\000\000\000\000\000\000\000\003\238\000\000\000\000\000\165\000\165\000\000\000\189\000\189\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\022\000\000\003\238\003\246\004\190\004\006\002-\000\000\000\165\000\165\000\000\000\000\004!\000\000\000\000\004!\004!\002-\000\165\004!\000\000\003\246\000\000\004\006\004!\004!\000\000\000\000\000\000\004!\000\000\000\000\004\030\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\198\000\000\000\000\002-\002-\000\000\000\165\004\206\000\000\000\000\000\000\000\000\000\000\000\129\000\000\000\000\000\129\000\000\000\000\000\000\000\000\002-\000\000\000\000\002-\002-\002-\002-\004&\000\000\000\000\000\000\000\000\002-\002-\003\254\004\214\004\222\002-\003\230\004\014\000\000\000\000\000\000\000\129\000\000\000\165\000\000\000\129\000\189\000\000\000\000\000\000\003\254\003\238\000\000\000\189\000\129\000\129\000\000\000\129\000\129\000\000\000\000\000\189\004.\000\129\000\165\000\000\000\000\004\022\000\000\000\000\003\246\000\165\004\006\000\129\000\000\000\000\000\000\000\000\000i\000\165\000\165\000i\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\030\000\000\000\129\000\000\000\000\000i\000i\000\000\000\000\000\000\000i\000\000\000\000\000\129\000i\000\000\000\000\000\000\000\000\000\000\003\238\000\000\000\000\000i\000i\000\000\000i\000i\000\000\000\000\000\000\000\000\000i\000\000\000\000\000\000\000i\000\000\000\000\003\246\004&\004\006\000i\000\129\000\129\000\000\000\000\003\254\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\129\000\000\000\000\000\129\000\129\000\129\000\129\000i\000\000\000i\000\000\000\000\000\129\000\129\000\000\000\129\004.\000\129\000\000\000\000\000i\000R\000V\000f\000\194\000\000\000\198\000\000\000\202\000\210\000\218\0016\000\000\001F\001N\000\000\001v\000\000\001~\000\000\001\134\002j\002r\002v\000\000\000\000\000\000\000i\000\000\000\000\000i\000i\000\000\000\000\003\254\000\000\000\000\000\000\000\000\002~\000e\000\000\000\000\000e\000\000\000\000\000\000\000\000\000i\000\000\000\000\000i\000i\000i\000i\000\000\002\134\000\000\000\000\000\000\000i\000i\000\000\000i\000i\000i\000e\000e\000\000\000\000\000\000\000e\000\000\000\000\000\000\000e\002\150\000\000\000\000\000\000\000\000\003\238\007\014\000\000\000e\000e\000\000\000e\000e\000\000\000\000\002\154\000\000\000e\000\000\007\018\007\022\000e\000\000\000\000\003\246\000\000\004\006\000e\000\000\000\000\000\000\000\000\000]\000\000\000\000\000]\000\000\007\026\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000e\000\000\000e\000\000\000\000\000]\000]\000\000\000\000\000\000\000]\000\000\000\000\000e\000]\000\000\000\000\000\000\000\000\000\000\000]\000\000\000\000\000]\000]\000\000\000]\000]\000\000\007\030\000\000\000\000\000]\000\000\000\000\000\000\000]\000\000\000\000\003\246\000e\000]\000]\000e\000e\000\000\000\000\003\254\000\000\000\000\000\000\002\161\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000e\000\000\000\000\000e\000e\000e\000e\000]\000\000\000]\000\000\000\000\000e\000e\000\000\000e\000e\000e\000\000\000\000\000]\000R\000V\000f\000\194\000\000\000\198\000\000\000\202\000\210\000\218\0016\000\000\001F\001N\000\000\001v\000\000\001~\000\000\001\134\002j\002r\002v\000\000\000\000\000\000\000]\000\000\000\000\000]\000]\000\000\000\000\003\254\000\000\000\000\000\000\000\000\002~\004\134\000\000\000\000\000\137\000\000\000\000\000\000\000\000\000]\000\000\000\000\000]\000]\000]\000]\000\000\002\134\000\000\000\000\000\000\000]\000]\000\000\000]\000]\000]\003\230\004\014\000\000\000\000\000\000\000\137\000\000\000\000\000\000\000\137\002\150\000\000\000\000\000\000\000\000\003\238\031\206\000\000\000\137\000\137\000\000\000\137\004\142\000\000\000\000\002\154\000\000\000\137\000\000\031\210\007\022\004\022\000\000\000\000\003\246\000\000\004\006\000\137\000\000\000\000\000\000\000\000\004\134\000\000\000\000\000}\000\000\007\026\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\030\000\000\000\137\000\000\000\000\003\230\004\014\000\000\000\000\000\000\000}\000\000\000\000\000\137\000}\000\000\000\000\000\000\000\000\000\000\003\238\000\000\000\000\000}\000}\000\000\000}\000}\000\000\031\214\000\000\000\000\000}\000\000\000\000\000\000\004\022\000\000\000\000\003\246\004&\004\006\000}\000\137\000\137\000\000\000\000\003\254\000\000\000\000\000\000\005q\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\137\000\000\000\000\000\137\000\137\000\137\000\137\004\030\000\000\000}\000\000\000\000\000\137\000\137\000\000\004\150\004.\000\137\000\000\000\000\000}\000R\000V\000f\000\194\000\000\000\198\000\000\000\202\000\210\000\218\0016\000\000\001F\001N\000\000\001v\000\000\001~\000\000\001\134\002j\002r\002v\000\000\000\000\000\000\004&\000\000\000\000\000}\000}\000\000\000\000\003\254\000\000\000\000\000\000\000\000\002~\000u\000\000\000\000\000u\000\000\000\000\000\000\000\000\000}\000\000\000\000\000}\000}\000}\000}\000\000\002\134\000\000\000\000\000\000\000}\000}\000\000\000}\004.\000}\003\230\004\014\000\000\000\000\000\000\000u\000\000\000\000\000\000\000u\002\150\000\000\000\000\000\000\000\000\003\238\031\206\000\000\000u\000u\000\000\000u\000u\000\000\000\000\002\154\000\000\000u\000\000\031\210\007\022\000u\000\000\000\000\003\246\000\000\004\006\000u\000\000\000\000\000\000\000\000\000a\000\000\000\000\000a\000\000\007\026\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\030\000\000\000u\000\000\000\000\000a\000a\000\000\000\000\000\000\000a\000\000\000\000\000u\000a\000\000\000\000\000\000\000\000\000\000\000a\000\000\000\000\000a\000a\000\000\000a\000a\000\000\031\214\000\000\000\000\000a\000\000\000\000\000\000\000a\000\000\000\000\003\246\000u\000a\000a\000u\000u\000\000\000\000\003\254\000\000\000\000\000\000\n\029\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000u\000\000\000\000\000u\000u\000u\000u\000a\000\000\000a\000\000\000\000\000u\000u\000\000\000u\000u\000u\000\000\000\000\000a\000R\000V\000f\000\194\000\000\000\198\000\000\000\202\000\210\000\218\0016\000\000\001F\001N\000\000\001v\000\000\001~\000\000\001\134\002j\002r\002v\000\000\000\000\000\000\000a\000\000\000\000\000a\000a\000\000\000\000\003\254\000\000\000\000\000\000\000\000\002~\000m\000\000\000\000\000m\000\000\000\000\000\000\000\000\000a\000\000\000\000\000a\000a\000a\000a\000\000\002\134\000\000\000\000\000\000\000a\000a\000\000\000a\000a\000a\003\230\004\014\000\000\000\000\000\000\000m\000\000\000\000\000\000\000m\002\150\000\000\000\000\000\000\000\000\003\238\031\206\000\000\000m\000m\000\000\000m\000m\000\000\000\000\002\154\000\000\000m\000\000\031\210\007\022\000m\000\000\000\000\003\246\000\000\004\006\000m\000\000\000\000\000\000\000\000\000q\000\000\000\000\000q\000\000\007\026\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000m\000\000\000m\000\000\000\000\003\230\004\014\000\000\000\000\000\000\000q\000\000\000\000\000m\000q\000\000\000\000\000\000\000\000\000\000\003\238\000\000\000\000\000q\000q\000\000\000q\000q\000\000\031\214\000\000\000\000\000q\000\000\000\000\000\000\000q\000\000\000\000\003\246\000m\004\006\000q\000m\000m\000\000\000\000\003\254\000\000\000\000\000\000\002\145\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000m\000\000\000\000\000m\000m\000m\000m\004\030\000\000\000q\000\000\000\000\000m\000m\000\000\000m\000m\000m\000\000\000\000\000q\000R\000V\000f\000\194\000\000\000\198\000\000\000\202\000\210\000\218\0016\000\000\001F\001N\000\000\001v\000\000\001~\000\000\001\134\002j\002r\002v\000\000\000\000\000\000\000q\000\000\000\000\000q\000q\000\000\000\000\003\254\000\000\000\000\000\000\000\000\002~\004\134\000\000\000\000\000\133\000\000\000\000\000\000\000\000\000q\000\000\000\000\000q\000q\000q\000q\000\000\002\134\000\000\000\000\000\000\000q\000q\000\000\000q\000q\000q\003\230\004\014\000\000\000\000\000\000\000\133\000\000\000\000\000\000\000\133\002\150\000\000\000\000\000\000\000\000\003\238\007&\000\000\000\133\000\133\000\000\000\133\004\142\000\000\000\000\002\154\000\000\000\133\000\000\007\018\007\022\004\022\000\000\000\000\003\246\000\000\004\006\000\133\000\000\000\000\000\000\000\000\000y\000\000\000\000\000y\000\000\007\026\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\030\000\000\000\133\000\000\000\000\003\230\004\014\000\000\000\000\000\000\000y\000\000\000\000\000\133\000y\000\000\000\000\000\000\000\000\000\000\003\238\000\000\000\000\000y\000y\000\000\000y\000y\000\000\000\000\000\000\000\000\000y\000\000\000\000\000\000\004\022\000\000\000\000\003\246\004&\004\006\000y\000\133\000\133\000\000\000\000\003\254\000\000\000\000\000\000\nI\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\133\000\000\000\000\000\133\000\133\000\133\000\133\004\030\000\000\000y\000\000\000\000\000\133\000\133\000\000\000\133\004.\000\133\000\000\000\000\000y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\030\0075\016.\000\000\000\000\000\000\000\000\0166\000\000\000\000\000\000\000\000\000\000\0075\004&\000\000\000\000\000y\000y\000\000\000\000\003\254\000\000\000\000\0075\000\000\0075\012\253\012\253\000\000\0075\0075\000\000\012\253\000\000\000y\0075\000\000\000y\000y\000y\000y\0075\000\000\000\000\0075\000\000\000y\000y\0075\000y\000y\000y\000\000\000\000\0075\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0075\016j\000\000\012\253\000\000\0075\000Z\000\000\000\000\000\000\000\000\0075\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0075\012\253\000\000\0075\000\000\000\000\0075\000\000\000\000\000\000\002\230\000\000\001\138\000\000\000\000\002\234\000\000\000\000\002\238\0075\000\000\000\000\000\000\000\000\0075\0075\0075\000\000\0075\0075\000\000\0075\000\000\000\000\002\246\000\000\000\000\002\250\0075\000\000\000\000\0075\000\000\003\006\003\n\000\000\003\018\000\000\b\194\000\000\000\000\000\000\000\000\003\026\000\000\003\030\0075\000\000\000\000\000\000\000\000\0075\0075\012\253\003\"\003&\000\000\000\000\011\142\003*\001\238\003.\000\000\000\000\000\000\0032\0036\000\000\000\000\003:\003>\000\000\000\000\000\000\000\000\r>\0075\rN\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003B\0075\000\000\000\000\000\000\003F\000\000\000\000\000\n\r\170\0075\r\186\0075\000\000\0075\000\000\000\000\003N\0075\0075\000\000\000\000\0075\000\000\0075\0075\000\000\000\000\003R\n\237\0075\000\000\000~\0075\000\142\0075\000\000\0075\000\000\0075\0075\003V\0075\0075\000\000\0075\000\000\003b\000\000\000\000\n\237\0075\n\237\000\000\0075\016\170\003z\000\000\0075\0075\000Z\003j\003r\0075\0075\0075\015R\0075\015b\015\190\0075\015\206\000\000\000\000\000\000\0075\016\214\000\000\000\000\0075\0075\000Z\0075\000\000\000\130\0075\0075\0075\000\000\000\000\0075\000\000\0075\0075\0075\0075\0075\0075\000\000\0075\0075\000\000\0075\000\000\000Z\0075\0075\0075\0075\000\000\000\000\0075\0075\0075\0075\0075\0075\000\000\0075\000\000\000\000\0075\0075\000\000\0075\0075\000\000\0075\0075\0075\000\000\0075\0075\0075\0075\0075\0075\0075\000Z\0075\0075\000Z\000\000\0075\0075\0075\0075\000\000\0075\0075\000\000\000\000\000\000\000\000\000Z\000\000\0075\0075\000\000\000\000\000\000\0075\000\000\000\000\0075\0075\0075\000\000\0075\0075\0075\0075\0075\000\000\0075\000\000\000\000\000\000\000\000\000\000\000\000\0075\000\000\000\000\0075\0075\000\000\0075\000\000\0075\0075\0075\0075\0075\0075\000\000\0075\0075\0075\0075\000\000\0075\000\000\0075\000\000\017\157\0075\0075\017\157\0075\000\000\0075\000\000\000\000\0075\000\000\001R\000\000\001b\0075\000\000\0075\000\000\001j\0075\000\000\0075\0075\000\000\0075\0075\017\157\017\157\000\000\000\000\000\000\017\157\000\000\000\000\000\000\017\157\000\000\000\000\000\000\0075\000\000\017\157\0075\0075\017\157\017\157\0075\017\157\017\157\000\000\000\000\0075\0075\017\157\0075\b:\0075\017\157\0075\000\000\017\157\000\000\017\157\017\157\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0075\0075\000\000\000\000\000\000\002\158\000\000\0075\rB\000\000\000Z\000\000\000\000\0075\000\000\000\000\017\157\000\000\017\157\0075\000\000\000\000\0075\000\000\000\000\000\000\000\000\0075\0075\017\157\0075\0075\0075\000\000\000\000\000\000\0075\0075\006:\000\000\006J\0075\0075\0075\000\000\006R\000\000\000\000\0075\0075\000\000\0075\0075\000\000\000\000\0075\017\157\017\157\000\000\017\157\000\000\0075\0075\017\157\000\000\000\000\000\000\0075\000\000\0075\000\000\000\000\0075\000\000\0075\r\154\000\000\0075\000Z\000\000\017\157\0075\017\157\0075\000\000\0075\0075\000\000\017\157\017\157\017\157\000\000\017\157\017\157\017\157\000\000\000\000\0075\000\000\0075\0075\0075\000\000\0075\0075\0075\000\000\0075\0075\0075\000Z\0075\0075\0075\000\000\0075\000\000\0075\0075\000\000\000\000\000\000\0075\000\000\0075\000\000\000\000\0075\0075\0075\0075\0075\000\000\0075\0075\000\000\0075\0075\000\000\0075\000\000\0075\000\000\0075\0075\000Z\0075\000\000\000\000\000\000\0075\000\000\0075\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0075\0075\000\000\000\000\000\000\0075\0075\000\000\000\000\000\000\000\000\0075\000\000\000\000\0075\000\000\000\000\0075\000\000\000\000\000\000\002\230\000\000\001\138\000\000\000\000\002\234\000\000\000\000\002\238\0075\000\000\000\000\000\000\000\000\0075\0075\0075\000\000\0075\0075\000\000\0075\0075\000\000\002\246\0075\000\000\002\250\0075\000\000\0075\0075\000\000\003\006\003\n\0075\003\018\000\000\b:\000\000\000\000\000\000\000\000\003\026\000\000\003\030\0075\000\000\000\000\000\000\000\000\0075\0075\000\000\003\"\003&\000\000\000\000\000\000\003*\001\238\003.\000\000\000\000\000\000\0032\0036\000\000\000\000\003:\003>\000\000\000\000\000\000\000\000\000\000\0075\r\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003B\0075\r\242\000\000\000\000\003F\000\000\000\000\000\n\0075\014\014\000\000\0075\0075\0075\000\000\000\000\003N\0075\0075\000\000\0075\000\000\000\000\0075\000\000\0075\000\000\003R\000\000\0075\0075\0075\0075\0075\000\000\0075\0075\0075\0075\000\000\003V\0075\0075\0075\0075\000\000\003b\000\000\0075\0075\000\000\000\000\0075\0075\0075\003z\0075\000\000\0075\000Z\003j\003r\0075\015B\0075\0075\000\000\000\000\000\000\000\000\0075\000Z\000\000\0075\0075\015V\0075\000\000\0075\000Z\000\000\0075\015\174\000\000\0075\0075\0075\0075\000\000\0075\000\000\0075\0075\0075\015\194\000\000\000\000\0075\0075\0075\000\000\0075\000\000\0075\0075\0075\0075\016\006\000\000\0075\0075\0075\0075\000\000\0075\0075\0075\0075\0075\0075\016\"\000\000\0075\0075\0075\0075\0075\0075\0075\0075\0075\0075\0075\000Z\0075\0075\0075\0075\0075\0075\000\000\0075\0075\000\000\0075\000Z\0075\0075\0075\0075\0075\0075\000Z\000\000\0075\000\000\000\000\0075\0075\0075\0075\000\000\0075\0075\000Z\000\000\0075\0075\0075\0075\000\000\0075\0075\0075\000\000\0075\0075\000Z\0075\0075\000\000\000\000\0075\000\000\0075\0075\0075\000\000\0075\0075\000Z\0075\000\000\000\000\0075\0075\0075\0075\0075\000\000\0075\0075\000\000\0075\0075\0075\000\000\0075\0075\000\000\0075\000\000\000\000\0075\000\000\0075\0075\0075\000\000\0075\0075\0075\0075\0075\000\000\000\000\000\000\000\000\0075\0075\0075\000\000\0075\0075\0075\0075\0075\000\000\000\000\000\000\0075\0075\0075\0075\000\000\0075\0075\0075\0075\000\000\000\000\000\000\0075\0075\000\000\0075\000\000\000\000\0075\002\230\0075\001\138\000\000\000\000\002\234\0075\0075\002\238\000\000\000\000\000\000\000\000\000\000\0075\000\000\000\000\000\000\0182\0075\0075\000\000\000\000\000\000\002\246\000\000\000\000\002\250\000\000\000\000\000\000\000\000\000\000\003\006\003\n\000\000\003\018\000\000\000\000\000\000\000\000\000\000\000\000\003\026\000\000\003\030\000\000\000\000\000\000\001\233\000\000\000\000\001\233\000\000\003\"\003&\000\000\000\000\000\000\003*\001\238\003.\000\000\000\000\000\000\0032\0036\000\000\000\000\003:\003>\000\000\000\000\000\000\000\000\001\233\001\233\000\000\000\000\000\000\001\233\000\000\000\000\000\000\001\233\000\000\000\000\003B\000\000\000\000\001\233\000\000\003F\001\233\001\233\000\n\001\233\001\233\000\000\000\000\000\000\000\000\001\233\000\000\003N\000\000\001\233\000\000\000\000\001\233\000\000\001\233\001\233\000\000\000\000\003R\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003V\000\000\000\000\000\000\000\000\000\000\003b\000\000\000\000\000\000\001\233\000\000\001\233\000\000\000\000\003z\000\000\000\000\000\000\000\000\003j\003r\000\000\001\233\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\230\000\000\001\138\000\000\000\000\002\234\000\000\000\000\002\238\000\000\000\000\000\000\000\000\000\000\001\233\019\026\000\000\001\233\n\237\000\000\000\000\001\233\000\000\000\000\002\246\000\000\000\000\002\250\000\000\000\000\000\000\000\000\000\000\003\006\003\n\000\000\003\018\000\000\001\233\000\000\001\233\000\000\000\000\003\026\000\000\003\030\019\"\001\233\001\233\000\000\001\233\001\233\001\233\000\000\003\"\003&\000\000\000\000\000\000\003*\001\238\003.\000\000\000\000\000\000\0032\0036\000\000\000\000\003:\003>\000\000\000\000\000\000\000\000\000\000\002\230\000\000\001\138\000\000\000\000\002\234\000\000\000\000\002\238\000\000\000\000\003B\000\000\000\000\000\000\000\000\003F\000\000\023^\000\n\000\000\000\000\000\000\000\000\002\246\000\000\000\000\002\250\003N\000\000\000\000\000\000\000\000\003\006\003\n\000\000\003\018\000\000\000\000\003R\000\000\000\000\000\000\003\026\000\000\003\030\000\000\000\000\000\000\000\000\000\000\000\000\003V\000\000\003\"\003&\000\000\000\000\003b\003*\001\238\003.\000\000\000\000\000\000\0032\0036\003z\000\000\003:\003>\0075\003j\003r\000\000\000\000\0075\000\000\000\242\000\000\001\002\0075\000\000\0075\000\000\000\000\000\000\003B\0075\0075\000\000\000\000\003F\000\000\000\000\000\n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003N\000\000\000\000\000\000\000\000\0075\000\000\000\000\000\000\000\000\000\000\003R\000\000\000\000\000\000\000\000\000\000\0075\000\000\000\000\000\000\0075\000\000\000\000\003V\000\000\002\230\000\000\001\138\000\000\003b\002\234\000\000\000\000\002\242\000\000\0075\0075\000\000\003z\000\000\006\134\000\000\000\000\003j\003r\000Z\000\000\000\000\0075\002\246\000\000\000\000\002\250\000\000\000\000\000\000\000\000\0075\003\006\012v\000\000\003\018\0075\0075\000\000\000\000\000\000\000\000\003\026\000\000\003\030\000\000\0075\000\000\000\000\000\000\0075\000\000\000\000\003\"\003&\000\000\000\000\000\000\003*\001\238\003.\0075\000\000\000\000\0032\0036\000\000\000\000\003:\003>\000\000\0075\000\000\000\000\000\000\000\000\0075\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003B\000\000\000\000\000\000\000\000\003Z\000\000\000\000\000\n\000\000\002\230\000\000\001\138\000\000\000\000\002\234\000\000\003N\002\242\000\000\000\000\000\000\000\000\0075\000\000\000\000\0075\0075\003R\000\000\0075\000\000\000\000\000\000\002\246\0075\0075\002\250\000\000\000\000\0075\003^\000\000\003\006\012f\000\000\003\018\003b\000\000\000\000\000\000\000\000\000\000\003\026\000\000\003\030\003f\000\000\000\000\000\000\000\000\003j\003r\000\000\003\"\003&\000\000\000\000\000\000\003*\001\238\003.\000\000\000\000\000\000\0032\0036\000\000\000\000\003:\003>\000\000\000\000\000\000\000\000\000\000\002\230\000\000\001\138\000\000\000\000\002\234\000\000\000\000\002\242\000\000\000\000\003B\000\000\000\000\000\000\000\000\003Z\000\000\000\000\000\n\000\000\000\000\000\000\000\000\002\246\000\000\000\000\002\250\003N\000\000\000\000\000\000\000\000\003\006\012N\000\000\003\018\000\000\000\000\003R\000\000\000\000\000\000\003\026\000\000\003\030\000\000\000\000\000\000\000\000\000\000\000\000\003^\000\000\003\"\003&\000\000\000\000\003b\003*\001\238\003.\000\000\000\000\000\000\0032\0036\003f\000\000\003:\003>\000\000\003j\003r\000\000\000\000\002\230\000\000\001\138\000\000\000\000\002\234\000\000\000\000\002\242\000\000\000\000\003B\000\000\000\000\000\000\000\000\003Z\000\000\000\000\000\n\000\000\000\000\000\000\000\000\002\246\000\000\000\000\002\250\003N\000\000\000\000\000\000\000\000\003\006\003J\000\000\003\018\000\000\000\000\003R\000\000\000\000\000\000\003\026\000\000\003\030\000\000\000\000\000\000\000\000\000\000\000\000\003^\000\000\003\"\003&\000\000\000\000\003b\003*\001\238\003.\000\000\000\000\000\000\0032\0036\003f\000\000\003:\003>\0075\003j\003r\000\000\000\000\0075\000\000\005n\000\000\005~\0075\n\229\0075\000\000\000\000\000\000\003B\0075\0075\000\000\0075\003Z\000\000\n\229\000\n\0075\000\000\005\218\000\000\005\234\0075\000\000\0075\003N\n\229\000\000\n\229\0075\0075\000\000\n\229\000\000\000\000\000\000\003R\000\000\n\229\000\000\000\000\000\000\0075\000\000\n\229\000\000\0075\n\229\000\000\003^\0075\n\229\027\022\000\000\000\000\003b\000\000\n\229\000\000\000\000\000\000\0075\0075\000\000\003f\000\000\0075\000\000\000\000\003j\003r\000Z\000\000\n\229\0075\000\000\000\000\000\000\000\000\000\000\000\000\0075\0075\0075\000\000\000\000\006\198\000\000\0075\0075\000\000\000Z\000\000\000\000\0075\000\000\000\000\000\000\0075\000\000\000\000\000\000\0075\0075\n\229\000\000\000\000\n\229\0075\0075\000\000\000\000\000\000\0075\000\000\000\000\000\000\000\000\0075\000\000\n\229\000\000\0075\0075\000\000\n\229\n\229\n\229\0075\n\229\n\229\000\000\n\229\0075\000\000\000\000\000\000\000\000\000\000\n\229\000\000\000\000\n\229\0075\000\000\000\000\000\000\000\000\0075\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n\229\000\000\000\000\000\000\0075\n\229\n\229\0075\0075\000\000\000\000\0075\000\000\000\000\000\000\000\000\0075\0075\002\230\000\000\001\138\0075\000\000\002\254\0075\000\000\003\002\0075\0075\000\000\000\000\0075\000\000\000\000\000\000\000\000\0075\0075\000\000\000\000\000\000\0075\002\246\000\000\000\000\002\250\000\000\000\000\000\000\000\000\000\000\003\022\b\006\000\000\003\018\000\000\b\026\000\000\000\000\000\000\000\000\003\026\000\000\003\030\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\014\003&\000\000\000\000\000\000\t\018\001\238\003.\000\161\000\000\000\000\t\026\t\030\000\000\000\000\t\"\003>\000\000\002\230\000\000\001\138\000\000\000\000\002\234\000\000\000\000\002\242\000\000\000\000\000\000\000\000\000\000\000\000\t&\000\161\000\161\000\000\000\000\t*\000\000\000\000\000\n\002\246\000\000\000\000\002\250\000\000\000\000\000\000\003\238\t2\003\006\b&\000\000\003\018\000\161\000\161\000\000\000\000\000\000\000\000\003\026\000\000\003\030\000\000\000\161\000\000\000\000\003\246\000\000\004\006\000\000\003\"\003&\tB\000\000\000\000\003*\001\238\003.\tJ\000\000\000\000\0032\0036\000\000\000\000\003:\003>\tN\000\000\000\000\000\000\000\000\tV\003r\000\000\000\161\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003B\000\000\000\000\000\000\000\000\003Z\000\000\000\000\000\n\000\000\000\000\012\022\000\000\000\000\000\000\000\000\000\000\003N\000\000\000\000\000\000\0051\000\000\0051\000\000\000\000\0051\000\000\003R\0051\000\000\000\000\000\161\000\000\000\000\000\000\000\000\000\000\000\000\003\254\000\000\003^\000\000\000\000\000\000\0051\000\000\003b\0051\000\000\000\000\000\000\000\000\000\161\0051\0051\003f\0051\000\000\000\000\000\161\003j\003r\000\000\0051\000\000\0051\000\000\000\161\000\161\000\000\000\000\000\000\000\000\000\000\0051\0051\000\000\000\000\000\000\0051\0051\0051\000\000\000\000\000\000\0051\0051\000\000\000\000\0051\0051\000\000\002\230\000\000\001\138\000\000\000\000\002\234\000\000\000\000\002\242\000\000\000\000\000\000\000\000\000\000\000\000\0051\000\000\000\000\000\000\000\000\0051\000\000\000\000\0051\002\246\000\000\000\000\002\250\000\000\000\000\000\000\000\000\0051\003\006\018\030\000\000\003\018\000\000\000\000\000\000\000\000\000\000\000\000\003\026\000\000\003\030\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\"\003&\0051\000\000\000\000\003*\001\238\003.\0051\000\000\000\000\0032\0036\000\000\000\000\003:\003>\0051\000\000\000\000\000\000\000\000\0051\0051\000\000\000\000\000\000\000\000\026.\000\000\000\000\000\000\000\000\003B\000\000\000\000\000\000\000\000\003Z\000\000\0262\000\n\000\000\000\000\000\000\000\000\000\000\028\178\000\000\000\000\003N\0266\000\000\026:\rQ\rQ\000\000\026>\000\000\000\000\000\000\003R\000\000\026B\000\000\000\000\000\000\000\000\000\000\026F\000\000\000\000\026N\000\000\003^\000\000\026R\000\000\000\000\000\000\003b\000\000\026V\000\000\000\000\000\000\000\000\000\000\000\000\003f\000\000\000\000\000\000\026.\003j\003r\rQ\000\000\026Z\000\000\000\000\000\000\000\000\000\000\000\000\0262\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0266\000\000\026:\000\000\000\000\000\000\026>\000\000\000\000\r%\000\000\rQ\026B\026^\000\000\000\000\026b\000\000\026F\000\000\000\000\026N\000\000\000\000\000\000\026R\000\000\027\190\000\000\026f\000\000\026V\000\000\000\000\026j\000\n\026n\000\000\026r\026v\000\000\026z\029.\028B\000\000\r%\000\000\026Z\026~\000\000\000\000\026\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\026\134\000\000\000\000\000\000\0075\026\138\026\142\rQ\000\000\0075\r%\000\000\026^\000\226\0075\026b\0075\000\000\000\000\000\000\000\000\0075\0075\000\000\000\000\000\000\000\000\000\000\026f\000\000\000\000\000\000\000\000\026j\000\n\026n\0075\026r\026v\000\000\026z\0075\0075\0075\000\000\000\246\0075\026~\0075\000\000\026\130\000\000\001:\0075\0075\0075\000\000\0075\0075\000\000\0075\0075\0075\000\000\000\000\026\134\001V\0075\000\000\0075\026\138\026\142\r%\0075\0075\0075\0075\000\000\007\206\000\000\000\000\0075\000\000\000Z\000\000\005^\0075\0075\0075\0075\0075\000\000\0075\0075\0075\0075\005r\0075\005\202\0075\0075\0075\000\000\000\000\0075\0075\0075\0075\0075\000\000\0075\0075\0075\0075\0075\000Z\000\000\005\222\0075\000\000\0075\000\000\000Z\000\000\000\000\0075\0075\0075\000\000\000\000\0075\012\170\0075\0075\0075\0075\000Z\0075\000\000\0075\0075\0075\0075\0075\000\000\0075\0075\0075\0075\0075\000\000\006\"\0075\0075\0075\000Z\0075\0075\0075\0075\0075\000\000\0075\0075\0075\000\000\000Z\0075\000Z\0075\000\000\0075\0075\0075\0075\000\000\0075\0075\0075\0075\0075\006>\0075\0075\0075\0075\0075\000Z\0075\0075\0075\000\000\0075\0075\000\000\0075\0075\0075\000\000\0075\000\000\000\000\000\000\000\000\0075\0075\000\000\0075\0075\0075\0075\0075\0075\000\000\0075\0075\0075\0075\0075\0075\0075\000Z\0075\0075\0075\0075\0075\000\000\000\000\0075\0075\000\000\000\000\0075\000\000\000\000\000\000\000\000\0075\0075\000\000\0075\0075\0075\0075\0075\000\000\000\000\0075\0075\000\000\000Z\0075\000\000\0075\000\000\0075\0075\0075\0075\0075\0075\0075\0075\000\000\0075\000\000\000\000\0075\0075\0075\0075\000\000\0075\000\000\0075\000\000\0075\0075\000\000\0075\0075\0075\000\000\0075\000\000\000\000\000\000\000\000\0075\0075\000\000\000\000\0075\0075\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0075\000\000\000\000\000\000\000\000\0075\000\000\000\000\0075\000\000\000\000\0075\0075\019N\000\000\0075\019V\000\000\000\000\000\000\0075\0075\000\000\000\000\000\000\0075\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0075\019f\019n\0075\0075\000\000\002=\0075\000\000\000\000\002=\000\000\0075\0075\000\000\000\000\019v\0075\000\000\002=\002=\000\000\019~\019\134\000\000\000\000\000\000\0015\002=\000\000\0015\000\000\019\142\000\000\000\000\019\150\000\000\019\158\002=\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\230\004\014\000\000\000\000\000\000\0015\000\000\000\000\000\000\0015\000\000\019\166\000\000\002=\000\000\003\238\000\000\000\000\0015\0015\000\000\0015\0015\000\000\002=\000\000\000\000\0015\000\000\000\000\000\000\004\022\000\000\000\000\003\246\000\000\004\006\0015\000\000\000\000\000R\000V\000f\000\194\000\000\000\198\000\000\000\202\000\210\000\218\0016\019\174\001F\001N\002=\001v\000\000\001~\019\182\001\134\002j\002r\002v\004\030\000\000\0015\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002=\0015\002=\002~\000\000\000\000\000\000\000\000\000\000\002=\002=\000\000\019\190\019\198\002=\000\000\000\000\000\000\000\000\000\000\002\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004&\000\000\000\000\0015\000\000\000\000\000\000\003\254\000\000\000\000\000\000\000\000\002\150\001\029\000\000\000\000\001\029\000\000\031\222\000\000\000\000\000\000\000\000\000\000\0015\000\000\0015\002\154\000\000\000\000\000\000\031\210\007\022\0015\0015\000\000\0015\004.\0015\001\029\001\029\000\000\000\000\000\000\001\029\000\000\000\000\000\000\001\029\007\026\000\000\000\000\000\000\000\000\003\238\000\000\000\000\001\029\001\029\000\000\001\029\001\029\000\000\000\000\000\000\001\025\001\029\000\000\001\025\000\000\001\029\000\000\000\000\003\246\000\000\004\006\001\029\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\025\001\025\000\000\000\000\000\000\001\025\000\000\000\000\000\000\001\025\000\000\001\029\000\000\001\029\000\000\003\238\000\000\000\000\001\025\001\025\000\000\001\025\001\025\000\000\001\029\n-\000\000\001\025\000\000\000\000\000\000\001\025\000\000\000\000\003\246\000\000\004\006\001\025\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\029\000\000\000\000\001\029\000\000\000\000\000\000\003\254\000\000\000\000\000\000\000\000\001\025\000\000\001\025\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\029\001\025\001\029\000\000\000\000\000\000\000\000\000\000\000\000\001\029\001\029\000\000\001\029\001\029\001\029\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\025\000\000\000\000\001\025\000\000\000\000\000\000\003\254\000\000\000\000\000\000\000\000\000\000\001\017\000\000\000\000\001\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\025\000\000\001\025\000\000\000\000\000\000\000\000\000\000\000\000\001\025\001\025\000\000\001\025\001\025\001\025\001\017\001\017\000\000\000\000\000\000\001\017\000\000\000\000\000\000\001\017\000\000\000\000\000\000\000\000\000\000\001\017\000\000\000\000\001\017\001\017\000\000\001\017\001\017\000\000\000\000\000\000\004\134\001\017\000\000\001=\000\000\001\017\000\000\000\000\003\246\000\000\001\017\001\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\230\004\014\000\000\000\000\000\000\001=\000\000\000\000\000\000\001=\000\000\001\017\000\000\001\017\000\000\003\238\000\000\000\000\001=\001=\000\000\001=\004\142\000\000\001\017\000\000\000\000\001=\000\000\000\000\000\000\004\022\000\000\000\000\003\246\000\000\004\006\001=\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\017\000\000\000\000\001\017\000\000\000\000\000\000\003\254\000\000\000\000\000\000\000\000\004\030\000\000\001=\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\017\001=\001\017\000\000\000\000\000\000\000\000\000\000\000\000\001\017\001\017\000\000\001\017\001\017\001\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004&\000\000\000\000\001=\000\000\000\000\000\000\003\254\000\000\000\000\000\000\000\000\000\000\004\134\000\000\000\000\0011\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001=\000\000\001=\000\000\000\000\000\000\000\000\000\000\000\000\001=\001=\000\000\004\150\004.\001=\003\230\004\014\000\000\000\000\000\000\0011\000\000\000\000\000\000\0011\000\000\000\000\000\000\000\000\000\000\003\238\000\000\000\000\0011\0011\000\000\0011\0011\000\000\000\000\000\000\001)\0011\000\000\001)\000\000\004\022\000\000\000\000\003\246\000\000\004\006\0011\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\230\004\014\000\000\000\000\000\000\001)\000\000\000\000\000\000\001)\000\000\004\030\000\000\0011\000\000\003\238\000\000\000\000\001)\001)\000\000\001)\001)\000\000\0011\000\000\000\000\001)\000\000\000\000\000\000\001)\000\000\000\000\003\246\000\000\004\006\001)\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004&\000\000\000\000\0011\000\000\000\000\000\000\003\254\000\000\000\000\000\000\000\000\004\030\000\000\001)\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0011\001)\0011\000\000\000\000\000\000\000\000\000\000\000\000\0011\0011\000\000\0011\004.\0011\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001)\000\000\000\000\001)\000\000\000\000\000\000\003\254\000\000\000\000\000\000\000\000\000\000\001\021\000\000\000\000\001\021\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001)\000\000\001)\000\000\000\000\000\000\000\000\000\000\000\000\001)\001)\000\000\001)\001)\001)\001\021\001\021\000\000\000\000\000\000\001\021\000\000\000\000\000\000\001\021\000\000\000\000\000\000\000\000\000\000\001\021\000\000\000\000\001\021\001\021\000\000\001\021\001\021\000\000\000\000\000\000\001!\001\021\000\000\001!\000\000\001\021\000\000\000\000\003\246\000\000\001\021\001\021\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\230\004\014\000\000\000\000\000\000\001!\000\000\000\000\000\000\001!\000\000\001\021\000\000\001\021\000\000\003\238\000\000\000\000\001!\001!\000\000\001!\001!\000\000\001\021\000\000\000\000\001!\000\000\000\000\000\000\001!\000\000\000\000\003\246\000\000\004\006\001!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\021\000\000\000\000\001\021\000\000\000\000\000\000\003\254\000\000\000\000\000\000\000\000\001!\000\000\001!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\021\001!\001\021\000\000\000\000\000\000\000\000\000\000\000\000\001\021\001\021\000\000\001\021\001\021\001\021\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001!\000\000\000\000\001!\000\000\000\000\000\000\003\254\000\000\000\000\000\000\000\000\000\000\001%\000\000\000\000\001%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001!\000\000\001!\000\000\000\000\000\000\000\000\000\000\000\000\001!\001!\000\000\001!\001!\001!\003\230\004\014\000\000\000\000\000\000\001%\000\000\000\000\000\000\001%\000\000\000\000\000\000\000\000\000\000\003\238\000\000\000\000\001%\001%\000\000\001%\001%\000\000\000\000\000\000\004\134\001%\000\000\0019\000\000\001%\000\000\000\000\003\246\000\000\004\006\001%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\230\004\014\000\153\000\000\000\000\0019\000\000\000\000\000\000\0019\000\000\004\030\000\000\001%\000\000\003\238\000\000\000\000\0019\0019\000\000\0019\004\142\000\000\001%\000\000\000\000\0019\000\153\000\153\000\000\004\022\000\000\000\000\003\246\000\000\004\006\0019\000\000\000\000\000\000\000\000\000\000\000\153\000\000\000\000\000\000\000\000\000\000\000\153\000\153\001%\000\000\000\000\001%\000\000\000\000\000\000\003\254\000\153\000\000\000\000\003\246\004\030\000\153\0019\004\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001%\0019\001%\000\000\000\000\000\000\000\000\000\000\000\000\001%\001%\000\000\001%\001%\001%\000\000\000\153\003\230\004\014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004&\000\000\000\000\0019\003\238\000\000\000\000\003\254\000\000\000\000\000\197\004\142\000\000\001-\000\000\000\000\001-\000\000\000\000\000\000\004\022\000\000\000\000\003\246\0019\004\006\0019\000\000\000\153\000\000\000\000\000\000\000\000\0019\0019\003\254\0019\004.\0019\003\230\004\014\000\000\000\000\000\000\001-\000\000\000\000\000\000\001-\000\153\000\000\000\000\004\030\000\000\003\238\000\000\000\153\001-\001-\000\000\001-\001-\000\000\000\000\000\153\000\153\001-\000\000\000\000\000\000\004\022\000\000\029\026\003\246\029\"\004\006\001-\000\000\000\000\000\000\000\000\000\000\000\000\029*\000\000\000\000\000\000\000\000\029J\000\000\000\000\000\000\004&\000\000\000\000\0262\000\000\000\000\000\000\003\254\000\000\000\000\004\030\000\000\001-\000\000\0266\000\000\026:\000\000\000\000\000\000\026>\000\197\000\000\001-\000\000\000\000\026B\000\000\000\197\000\000\000\000\000\000\026F\000\000\000\000\026N\004\150\004.\000\000\026R\000\000\000\000\000\000\000\000\000\000\026V\000\000\000\000\000\000\000\000\004&\000\000\000\000\001-\000\000\000\000\000\000\003\254\000\000\000\000\000\000\026Z\029R\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001-\000\000\001-\000\000\000\000\000\000\000\000\000\000\000\000\001-\001-\000\000\001-\001-\001-\000\000\000\000\000\000\026^\000\000\000\000\026b\000\000\000\000\002\230\000\000\001\138\000\000\000\000\b\030\000\000\000\000\b\"\000\000\026f\000\000\000\000\000\000\000\000\026j\000\n\026n\000\000\026r\026v\000\000\026z\017i\002\246\000\000\017i\000\000\000\000\026~\000\000\000\000\026\130\b>\bJ\000\000\000\000\000\000\b^\000\000\000\000\000\000\000\000\003\026\000\000\003\030\000\000\026\134\000\000\017i\017i\000\000\026\138\026\142\b\130\003&\000\000\tn\000\000\b\142\001\238\003.\000\000\000\000\017i\b\150\b\154\000\000\017i\b\158\017i\017i\000\000\000\000\tv\000\000\000\000\nN\000\000\000\000\017i\000\000\000\000\017i\000\000\017i\b\162\b\166\000\000\000\000\000\000\000\000\b\170\000\000\000\000\000\n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\178\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017i\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\206\000\000\000\000\000\000\nZ\000\000\b\214\000\000\002\230\000\000\001\138\000\000\000\000\018\022\000\000\b\218\018\026\000\000\000\000\000\000\b\226\003r\000\000\000\000\017i\017i\000\000\017i\000\000\n^\000\000\017i\002\246\000\000\000\000\000\000\000\000\000\000\000\000\000\000\nf\018\134\018r\000\000\000\000\017i\019\206\000\000\000\000\017i\017i\003\026\000\000\003\030\000\000\000\000\017i\000\000\000\000\000\000\017i\017i\018\138\003&\000\000\000\000\000\000\018\142\001\238\003.\000\000\000\000\000\000\018\146\018\150\000\000\026.\018\154\000\000\000\000\000\000\000\000\000\000\000\000\026.\000\000\000\000\000\000\0262\000\000\000\000\000\000\000\000\000\000\b\162\018\158\0262\000\000\000\000\0266\018\162\026:\000\000\000\n\000\000\026>\000\000\0266\000\000\026:\000\000\026B\018\170\026>\000\000\000\000\000\000\026F\000\000\026B\026N\000\000\000\000\000\000\026R\026F\000\000\000\000\026N\000\000\026V\000\000\026R\000\000\000\000\000\000\018\174\000\000\026V\000\000\000\000\027\186\018\182\000\000\000\000\000\000\026Z\000\000\000\000\028\138\000\000\018\186\000\000\000\000\026Z\000\000\018\194\003r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\r%\000\000\026^\000\000\000\000\026b\000\000\000\000\r%\000\000\026^\000\000\000\000\026b\000\000\000\000\000\000\000\000\026f\000\000\000\000\000\000\000\000\026j\000\n\026n\026f\026r\026v\000\000\026z\026j\000\n\026n\000\000\026r\026v\026~\026z\000\000\026\130\000\000\026.\000\000\000\000\026~\000\000\000\000\026\130\000\000\000\000\000\000\000\000\000\000\0262\026\134\000\000\000\000\000\000\000\000\026\138\026\142\r%\026\134\000\000\0266\000\000\026:\026\138\026\142\r%\026>\000\000\000\000\000\000\000\000\000\000\026B\000\000\000\000\000\000\000\000\000\000\026F\000\000\000\000\026N\000\000\000\000\000\000\026R\t\161\000\000\000\000\000\000\000\000\026V\000\000\000\000\000\000\000\000\000\000\000\000\t\161\000\000\000\000\000\000\028\242\000\000\000\000\000\000\000\000\026Z\000\000\t\161\000\000\t\161\000\000\000\000\000\000\t\161\000\000\000\000\000\000\000\000\000\000\t\161\000\000\000\000\000\000\000\000\000\000\t\161\000\000\000\000\t\161\000\000\000\000\000\000\t\161\000\000\r%\000\000\026^\000\000\t\161\026b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\026f\000\000\t\161\029R\000\000\026j\000\n\026n\000\000\026r\026v\000\000\026z\000\000\000\000\000\000\000\000\000\000\000\000\026~\000\000\000\000\026\130\000\000\000\000\000\000\000\000\000\000\b%\000\000\000\000\000\000\000\000\t\161\000\000\000\000\t\161\026\134\000\000\000\000\b%\000\000\026\138\026\142\r%\000\000\000\000\000\000\000\000\t\161\000\000\b%\000\000\b%\t\161\t\161\t\161\b%\t\161\t\161\000\000\t\161\000\000\b%\000\000\000\000\000\000\000\000\t\161\b%\000\000\t\161\b%\000\000\000\000\000\000\b%\027\158\000\000\000\000\000\000\000\000\b%\000\000\000\000\000\000\t\161\000\000\000\000\0262\000\000\t\161\t\161\030Z\000\000\000\000\000\000\000\000\b%\000\000\0266\000\000\026:\000\000\000\000\000\000\026>\000\000\000\000\000\000\000\000\000\000\026B\000\000\000\000\000\000\000\000\000\000\026F\000\000\000\000\026N\000\000\000\000\000\000\026R\000\000\000\000\000\000\b%\000\000\026V\b%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b%\000\000\026Z\027\182\000\000\b%\b%\b%\000\000\b%\b%\000\000\b%\000\000\000\000\0262\000\000\000\000\000\000\b%\000\000\000\000\b%\000\000\000\000\000\000\0266\000\000\026:\000\000\000\000\000\000\026>\026^\000\000\000\000\026b\b%\026B\000\000\000\000\000\000\b%\b%\026F\000\000\000\000\026N\000\000\026f\000\000\026R\026.\000\000\026j\000\n\026n\026V\026r\026v\000\000\026z\000\000\000\000\0262\000\000\000\000\000\000\026~\000\000\000\000\026\130\000\000\026Z\000\000\0266\000\000\026:\000\000\000\000\000\000\026>\000\000\000\000\000\000\000\000\026\134\026B\000\000\000\000\000\000\026\138\026\142\026F\000\000\000\000\026N\000\000\000\000\000\000\026R\000\000\000\000\000\000\026^\000\000\026V\026b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\026f\000\000\028n\028\134\000\000\026j\000\n\026n\000\000\026r\026v\000\000\026z\000\000\000\000\0262\000\000\000\000\000\000\026~\000\000\000\000\026\130\000\000\000\000\000\000\0266\000\000\026:\000\000\000\000\000\000\026>\026^\000\000\000\000\026b\026\134\026B\000\000\000\000\000\000\026\138\026\142\026F\000\000\000\000\026N\000\000\026f\000\000\026R\028\238\000\000\026j\000\n\026n\026V\026r\026v\000\000\026z\000\000\000\000\0262\000\000\000\000\000\000\026~\000\000\000\000\026\130\000\000\026Z\000\000\0266\000\000\026:\000\000\000\000\000\000\026>\000\000\000\000\000\000\000\000\026\134\026B\000\000\000\000\000\000\026\138\026\142\026F\000\000\000\000\026N\000\000\000\000\000\000\026R\000\000\000\000\000\000\026^\000\000\026V\026b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\026f\000\000\026Z\026.\000\000\026j\000\n\026n\000\000\026r\026v\000\000\026z\000\000\000\000\0262\000\000\000\000\000\000\026~\000\000\000\000\026\130\000\000\000\000\000\000\0266\000\000\026:\000\000\000\000\000\000\026>\026^\000\000\000\000\026b\026\134\026B\000\000\000\000\000\000\026\138\026\142\026F\000\000\000\000\026N\000\000\026f\000\000\026R\026.\000\000\026j\000\n\026n\026V\026r\026v\000\000\026z\000\000\000\000\0262\000\000\000\000\000\000\026~\000\000\000\000\026\130\000\000\030&\000\000\0266\000\000\026:\000\000\000\000\000\000\026>\000\000\000\000\000\000\000\000\026\134\026B\000\000\000\000\000\000\026\138\026\142\000\000\000\000\000\000\026N\000\000\000\000\000\000\026R\000\000\000\000\000\000\026^\000\000\026V\026b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\026f\000\000\026Z\000\000\000\000\026j\000\n\026n\000\000\026r\026v\000\000\026z\000\000\000\000\000\000\000\000\000\000\000\000\026~\000\000\000\000\026\130\000\000\000\000\017\129\000\000\000\000\017\129\000\000\000\000\000\000\000\000\026^\000\000\000\000\026b\026\134\000\000\000\000\000\000\000\000\026\138\026\142\000\000\000\000\000\000\000\000\000\000\026f\000\000\017\129\017\129\000\000\026j\030R\026n\000\000\026r\026v\000\000\026z\000\000\000\000\000\000\000\000\017\129\000\000\026~\000\000\017\129\026\130\017\129\017\129\000\249\000\000\000\000\000\249\000\000\000\000\b:\000\000\017\129\000\000\000\000\017\129\026\134\017\129\000\000\000\000\000\000\026\138\026\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\230\004\014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\129\003\238\000\000\000\000\000\000\000\249\000\000\000\249\000\249\000\000\000\000\000\225\000\000\000\000\000\225\000\000\000\000\004\022\000\000\000\000\003\246\000\000\004\006\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\225\000\225\000\000\017\129\017\129\000\000\017\129\000\000\000\000\000\000\017\129\000\000\004\030\000\000\000\000\003\238\000\000\000\000\000\000\000\225\000\000\000\225\000\225\000\221\017\129\000\000\000\221\000\000\017\129\017\129\000\000\000\225\000\000\000\000\003\246\017\129\004\006\000\000\000\000\017\129\017\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\221\000\221\000\000\004&\000\000\000\000\000\249\000\000\000\000\000\000\003\254\000\000\000\000\000\000\000\225\003\238\000\000\000\000\000\000\000\221\000\000\000\221\000\221\000\000\000\249\000\000\000\000\000\000\000\249\000\249\000\000\000\221\000\000\000\000\003\246\000\000\004\006\000\000\000\000\000\249\004.\000\000\000\000\000\000\000\000\000\000\000\000\000\213\000\000\000\000\000\213\000\000\000\000\000\000\000\225\000\000\000\000\000\225\000\000\000\000\000\000\003\254\000\000\000\221\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\213\000\213\000\225\000\000\000\000\000\000\000\225\000\225\000\000\000\000\000\000\000\000\000\000\004\134\000\000\000\213\001\001\000\225\000\225\000\213\000\000\000\213\000\213\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\221\000\213\000\000\000\221\003\246\000\000\000\213\003\254\000\000\003\230\004\014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\221\000\000\000\000\003\238\000\221\000\221\000\000\001\001\000\000\001\001\004\142\000\000\000\213\000\000\000\000\000\221\000\221\000\000\000\000\004\022\000\000\000\000\003\246\000\000\004\006\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\134\000\000\000\000\000\245\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\030\000\213\000\000\000\000\000\213\000\000\000\000\000\000\003\254\000\000\003\230\004\014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\213\000\000\000\000\003\238\000\213\000\213\000\000\000\245\000\000\000\245\000\245\000\237\000\000\000\000\000\237\000\213\000\213\000\000\004&\004\022\000\000\001\001\003\246\000\000\004\006\003\254\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\230\004\014\001\001\000\000\000\000\000\000\001\001\001\001\000\000\000\000\000\000\000\000\000\000\000\000\004\030\003\238\000\000\004\150\004.\000\237\000\000\000\237\000\237\000\000\000\217\000\000\000\000\000\217\000\000\000\000\000\000\000\237\000\000\000\000\003\246\000\000\004\006\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\217\000\217\000\000\000\000\004&\000\000\000\000\000\245\000\000\000\000\000\000\003\254\000\000\004\030\000\000\000\217\000\000\000\000\000\000\000\217\000\229\000\217\000\217\000\229\000\000\000\245\000\000\000\000\000\000\000\245\000\245\000\217\000\000\000\000\003\246\000\000\000\217\000\000\000\000\000\000\000\245\004.\000\000\000\000\000\000\000\000\003\230\004\014\000\000\000\000\000\000\000\000\000\000\000\237\000\000\000\000\000\237\000\000\000\000\000\000\003\254\003\238\000\000\000\217\000\000\000\229\000\000\000\229\000\229\000\000\000\233\000\000\000\000\000\233\000\237\000\000\000\000\000\229\000\237\000\237\003\246\000\000\004\006\000\000\000\000\000\000\000\000\000\000\000\000\000\237\000\237\000\000\000\000\000\000\000\000\000\000\003\230\004\014\000\000\000\000\000\000\000\000\000\000\000\217\000\000\000\000\000\217\000\000\000\000\000\229\003\254\003\238\000\000\000\000\000\000\000\233\004\134\000\233\000\233\000\253\000\000\000\000\000\000\000\000\000\217\000\000\000\000\000\233\000\217\000\217\003\246\000\000\004\006\000\000\000\000\000\000\000\000\000\000\000\000\000\217\000\217\000\000\003\230\004\014\000\000\000\000\000\000\000\000\000\000\000\229\000\000\000\000\000\229\000\000\000\000\000\000\003\254\003\238\000\000\004\030\000\000\000\253\000\000\000\253\004\142\000\000\000\241\000\000\000\000\000\241\000\229\000\000\000\000\004\022\000\229\000\229\003\246\000\000\004\006\000\000\000\000\000\000\000\000\000\000\000\000\000\229\000\229\000\000\000\000\000\000\000\000\000\000\003\230\004\014\000\000\000\000\000\000\000\000\000\000\000\233\000\000\000\000\000\233\000\000\000\000\004\030\003\254\003\238\000\000\000\000\000\000\000\241\004\134\000\241\000\241\000\000\000\177\000\000\000\000\000\000\000\233\000\000\000\000\004\022\000\233\000\233\003\246\000\000\004\006\000\000\000\000\000\000\000\000\000\000\000\000\000\233\000\233\000\000\003\230\004\014\000\000\000\000\003\230\004\014\000\000\004&\000\000\000\000\000\253\000\000\000\000\000\000\003\254\003\238\000\000\004\030\000\000\003\238\000\000\000\185\000\185\000\000\000\157\000\177\000\177\000\000\000\253\000\000\000\000\004\022\000\253\000\253\003\246\000\177\004\006\000\000\003\246\000\000\004\006\000\000\000\000\000\253\004.\000\000\000\000\000\000\000\000\000\169\000\157\000\157\000\000\000\000\000\000\000\000\000\000\004&\000\000\000\000\000\241\000\000\000\000\004\030\003\254\000\157\000\000\004\030\000\000\000\000\000\000\000\157\000\157\000\000\000\000\003\230\004\014\000\000\000\241\000\000\000\000\000\157\000\241\000\241\003\246\000\000\000\157\000\000\000\000\000\000\003\238\000\000\000\000\000\241\000\241\000\000\000\169\000\169\000\000\000\000\000\000\000\000\000\000\004&\000\000\000\000\000\169\000\177\000\000\003\246\003\254\004\006\000\000\000\157\003\254\000\173\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\185\000\000\000\000\000\000\000\177\000\000\000\000\000\185\000\000\000\000\000\000\000\177\000\000\000\000\000\169\000\185\004.\003\230\004\014\000\177\000\177\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\157\000\000\000\000\003\238\000\000\000\000\000\000\003\254\004\134\000\173\000\173\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\173\000\000\000\157\003\246\000\000\004\006\000\169\000\000\000\000\000\157\000\000\000\000\000\000\003\254\000\181\003\230\004\014\000\157\000\157\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\169\000\000\000\000\003\238\000\000\004\030\000\000\000\169\000\000\000\193\004\142\000\000\000\000\003\230\004\014\000\169\000\169\000\000\000\000\004\022\000\000\000\000\003\246\000\000\004\006\000\000\000\000\000\000\003\238\000\000\000\000\000\000\000\000\000\000\000\181\000\181\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\022\000\173\000\000\003\246\000\000\004\006\000\000\004\030\003\254\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\173\000\000\000\000\000\000\000\000\000\000\000\000\000\173\000\000\000\000\004\030\000\000\000\000\000\000\000\000\000\173\000\173\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004&\000\000\000\000\000\000\000\000\000\000\000\000\003\254\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\193\000\000\000\000\000\000\004&\000\000\000\000\000\193\000\000\000\000\000\000\003\254\000\000\000\000\000\000\000\193\004.\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\181\000\000\000\000\000\000\000\000\000\000\000\000\000\181\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\181\000\181"))
+    ((16, "\002\130\000\151\000\000\000\000\021\244\000\151\000\000\000\000\000\015\000\000\000\000\000\000\001\015\000\000\000\000\000\000\002\130\000\000\000\0052\246\000\000\023\144\023\172\000\000\000\000B\130\023\144\023\144\000\000\000\000PbP\198\023\144\000\000\000\000\023\144\000\000\000\000\023\144\000\000\023\144\000\000\000\191\000\143\023\144\000\000\023\144\000\000\000\000\000\000\023\144\000\000\023\144\000\000CZa(\023\144\000\000\000\000X\236ah\023\144\000\000\000\000\023\144\000\000\000\000\023\144\000\000\023\144\000\000\000\159\000q\023\144\000\000\023\144\000\000av\023\144\000\000\000\000\023\144\000\000Q\210a\146\023\144\000\000\000\000\023\144\000\000\023\144\000\000\000\000\023\144\000\000\023\144\000\000\000\006\000\000\000\017\000\017\000\000\000\000\000\000\000\000\000\159\000\000\000\000\000#\000\017\000\000\000#\000\000\000\000\000\017\000\164\000\160\000\017\000r\000\000\000f\000R\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000I\000\017\000\000\000\136\002\220\000\017\000\000\000\142\001f\000\000\000\000\000\000\000\208\023\144\000\000\023\144\000\017\000\232\023\144\000\000\000\000\023\144\000\000\000\000\023\144\000\000\023\144\000\000\0018\001\154\023\144\000\0002\246Q\2108\132\000\0008\132\000\000\000\000\000\000\000\017\000\0008\132\000\0007h\002\2488\132\003\014\000\000\000\017\007|O:\000\000\000\000Y\026Y\220\000\000]\b\000\000ZtO:\030\202\030\202]\bO:\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000[\012\030\202\000\000\000\000[\012[\012[\012\000\000[\012\000\006\000\000\000\000O:[\012\000\000\000\000'\230\000\017\000\000\025.\030\202O:\000\000)6O:4\206O:5LO:\000\000\000\000\000\000\000\000\000\000\000\000\000\000C\196O:\000\000D\224O:6hO:7\132O:\000\000O:\000\000O:8\160O:9\188O::\216O:;\244O:=\016O:>,O:\026,O:\000\000\000\000\000\000\002\240O:\000\000\000\000\000\000\000\000O:EhO:F\132O:G\012O:H(O:?HO:@dO:A\128O:H\176O:I\204O:\000\000O:JTO:KpO:K\248O:\000\000O:M\020O:M\156O:\000\000\000\000O:\000\000\002\206\000\000\000\000\000\017\000\000\000\000\000\000\003\006\000\000\003\b\000\000\000\020O:\000\000\000\020\000\000\000\000\000b2\246\000\000\031\172\023\144\000\000\0032a\184\023\144\000\000\000\000[\226a\206\023\144\000\000\000\000\023\144\000\000\000\000\023\144\000\000\023\144\000\000\003\148\0048\023\144\000\000\023\144\000\000\023\144\000\000\023\144\000\000\005\144a\210\023\144\000\000\000\000\\\na\248\023\144\000\000\000\000\023\144\000\000\000\000\023\144\000\000\023\144\000\000\004\024\004\134\023\144\000\000\023\144\000\000b<\023\144\000\000\000\000\023\144\000\000R\154bx\023\144\000\000\000\000\023\144\000\000\023\144\000\000\000\000\023\144\000\000\023\144\000\000\007\212\000\017\004N\023\144\000\000X\236\000\017\004T\023\144\000\000\000\000\023\144\000\000\023\144\000\000\023\144\000\000\004\250\0058\023\144\000\000\\\n8\132\000\000\000\000\005*\023\144\000\0008\132\000\000\000\000<\244:\188\000\000\001f\006$\000\017\005r\006R>\016>\016\000\000\000\000\000\000\000\195L\248>\016\001X@H\000\000\000\000\000\000\006h\006D\002\162\006r>\016\000\000\000\000\005\192\000\000\005\198\006\164>\016\005\216\000\000\000+\000\000\007|\000\000\000\000\002\004Fh\000\000\000\000\000\000\006>\007D\000\000\007R\000\000*\182\001f8\132\006`\023\144\000\000a(8\132\006l\023\144\000\000\000\000\000\000\000\017\007b\000\000\000\000\000\000\000b\000\000\000\000\030\202\006~\000\000\006\136]\b.<\000\000]\152\030\202\006\140\000\000\006\146-\n.<]\b\000\000\000\000\000\000\000\000\000\000\000\000[\012\000\000\000\000[\012\000\000\000\000[\012\000\000\000\006\000\000]\b\000\000\000\000m\196\000\017\000\000\025.\025.\000\000\002\138\029\174\025.\025\178O:\000\000O:\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\028\238O:A\226O:\006\194O:\000\000O:v>O:v\164O:w\006O:w\152O:w\230O:xxO:\000\000O:x\218O:y>O:y\154O:\000\000O:y\254O:zZ\002\224\026\174\000\000\000\000\003\002\028.\000\000\000\000\000\000\000\000\006\156\000\000O:\006\156\000\000\000\000\000\017\000\000\000\000\000\000\002\184]\b\000\000\000\000\007|\000\000\000[^p\007fO:\007&\000\000\000\000]\b\000[\000\000\000\000O:\006\178\000\000\030\202\006\178\000\000\006\182nH.<]\b\006\190\000\000O:\000\232O:\006\196\000\000\000\000.<.<\000\000\000\000\000\000\000\000+\148\000\000\000\000\000\000\000\000\000\000[\012\000\000\000\000\001(\007\144O:.<\000\017\000\000[\012\000\000\000\000[\012\000\000\000\006\000\000,\188nH\000\000\000\000\027x\000\017\000\000\025.\006\220\000\000O:\006\218\000\000\000\000\000\017\000\000\000\000\000\000\000\000\000\000&0\000\000\000\000\007\n.<\007&.<\000\000\000\026\000\000\000\0001tO:C\252O:D O:]\166O:k\166O:l&O:z\190O:{\026O:\000\000O:{\"O:{~O:{\176O:\000\000O:|4O:|\144\000\000\006\254\000\000\002x/(\000\000\003\2141\000.<\000\000\004\n0\020\000\000\000\000\000\000\000\000\007\132\000\000\000\000\000\000\007\002\000\000\007\n\000\000\000\000\007\012\000\000\000\000\007\016\000\000\000\000\007\024\000\000\000\000\000\000\000\000\000\000\000\000\007\026\007\236\000\000\007&\000\000\0078\000\000\007<S\128\000\000\030\202\007@u\220\000\000\b\028\000\000\030\202\007J1\246\000\000\030\202\007N3\018\000\000\007L\000\000\000\000\b@\000\000\007N\023\144\000\000a\1468\132\007P\023\144\000\000\000\000\002\0008\132\000\000\002\000\000\000\000\000\007Z\000\000\002\162\007T\023\144\000\000\000\000\001p2\246\000\0002\246\000\000\007D\000\000\001p\000\000\019\152-\188\023\172\000\000\007\166\023\186\023\172\000\000\000\000P\nRZ\023\172\000\000\000\000\023\172\000\000\000\000\023\172\000\000\023\172\000\000\007\136\007\186\023\172\000\000\023\172\000\000\023\172\000\000\023\172\000\000\b\208R\224\023\172\000\000\000\000P4TP\023\172\000\000\000\000\023\172\000\000\000\000\023\172\000\000\023\172\000\000\007\144\007\194\023\172\000\000\023\172\000\000Th\023\172\000\000\000\000\023\172\000\000\023\172Tx\023\172\000\000\000\000\023\172\000\000\023\172\000\000\000\000\023\172\000\000\023\172\000\000\007\226\000\017\007l\023\172\000\000\023\172\000\017\007r\023\172\000\000\000\000\023\172\000\000\023\172\000\000\023\172\000\000\007\178\007\224\023\172\000\0002\246\000\000\007\148\000\000\002n2\246\000\000\000\000\002n\000\000\000\000\023\1868\132\007\186\023\172\000\000\000\000\000\000\000\026\000\000\000\000\000\031\000\026\000\000\000\000\000\000\b\196\000\000\007\1848\132\007\218\023\172\000\000 :8\132\007\220\023\172\000\000\000\000,J\023\172\000\000\t:T\228\023\172\000\000\000\000P\166T\252\023\172\000\000\000\000\023\172\000\000\000\000\023\172\000\000\023\172\000\000\b\012\b:\023\172\000\000\023\172\000\000\023\172\000\000\023\172\000\000\011\212U\n\023\172\000\000\000\000P\172U\"\023\172\000\000\000\000\023\172\000\000\000\000\023\172\000\000\023\172\000\000\b\018\bH\023\172\000\000\023\172\000\000U<\023\172\000\000\000\000\023\172\000\000N\154UV\023\172\000\000\000\000\023\172\000\000\023\172\000\000\000\000\023\172\000\000\023\172\000\000\t\018\000\017\007\240\023\172\000\000N\154\000\017\007\244\023\172\000\000\000\000\023\172\000\000\023\172\000\000\023\172\000\000\b.\b^\023\172\000\000P\n8\132\b\006\023\172\000\000\000\000\nr8\132\b\b\023\172\000\000P48\132\b\014\023\172\000\000\000\000\000\000\000\000\000\000\000\000\b\230O:\b\026\"$\b\160\000\000\b\244O:\b*\b\2422\246\000\000\000\000\000\0002\246\000\017\000\000\003\000O:\t\030\000\000\000\017\000\000\001<\t \000\000\t.\b\240\000\017\b6\t\006>\016\b>\001\154\000\000O:\t4\000\000\000\000\000\000\t\022>\016\bJ\t>\000\000\003\186\004>O:\tP\000\000\tX\000\000*\182\000\017\004lO:\tZ\000\000\tb\000\000\000\017\004vO:\td\000\000\tt\000\000\0013\b\188\t\n%:\000\000_\000\030\202\b\152Q\164\000\000V6\000\000\t\136\000\000\003\002\tbO:\t6\000\000\t~O:\t@\000\000\001p\000\000\t\n\t\n\030\202\b\196\000\000\b\202o\no\n\000\000\000\000\000\000\000\000\000\000\000\000[\012\000\000\000\000[\012\000\000\000\000[\012\000\000\000\006\000\000o\n\000\000\000\0004.\000\017\000\000\025.\b\204\000\000O:\b\202\000\000\000\000\000\017\000\000\000\000\000\000\000\000\000\000V\186O:\000\000O:\000\000\b\210\000\000\000\020\000\000\000\000\000\000\000\000\000\000crO:c\218O:\b\252O:\000\000O:d\246O:e^O:fzO:f\226O:g\254O:hfO:\000\000O:i\130O:i\234O:k\006O:\000\000O:knO:l\138.<\b\206\000\000\000\000\003\002\000\000\003\002\000\000\019\152\t\n\t\n\000\000\000\000\000\000\000\003\000\000\000\000\000\000\t\164O:\b\216\"$#6\000\017\t\202\000\000\t\174W~\t\208W~\t\212O:\b\234\"$\"$\001\022\001\022\004\012\001\226\001\022\000\000\000\000\004\018\004\026\000\000\004\028\n\"\000\000\000\000\000\000\000\000\000\000\b\244\000\000\000\000\t\228\000\000\t\232\000\000\000\000\n*\t\206O:\t\002\t\248\000\000\t\250\000\000\t8\000\000\t\230\025.\t\030\"$\000\000\000\000\000\000\007\136\000\000\000\000\003\002\000\000\t\192\000\000\015\018\0012\000\000\015\018\000\000\000\000&d\000\000\011\182\000\000\000\000\012\014\000\000\015\018\000\000\n\020\025.\tV\001\166\000\000O:\nH\000\000\0032\000\000\n\024\000\017\tb\n4>\016\th\003\132\000\000O:\nZ\000\000\n>>\016\tt\nd\000\000\004\128O:\nf\000\000\nj\000\000*\182\000\017\004\140O:\np\000\000\nt\000\000\000\000\000\000\012\014\000\000\000\000\006\016\000\000\t\n\000\000\0032\000\000\000\000\005\b#6\000\000\005\b\000\000\000\000\t\144\000\000\000\020\001\128\"$\000\000\006\006\0007\006\006\000\000\0007\000\000\t\n\000\000\t\n\000\000\000\000\000\000\t\138\000\000\000\000\t\156\000\000\0050\007\136\0007\006\006\000\000\000\000\000\000\0007\000\000\t\n\000\000\0050\000\000\000\000\025\018\n\130\019\152\000\000\020R\000\000\n\140\019\152\000\000\000\000\n\140\000\000\000\000\t\158\000\000\000\000\t\166\000\000\005@\t\n\000\000\005@\000\000\000\000\n,\000\000\006\016\000\000\t\n\000\000\000\000\000\000\022\152X\022\000\000\n\162\000\000\022\152\000\000\n\164\000\000\n\168\000\0002\246\000\017\004H\000\000O:\n\174\000\000\0122\n\128\000\017\t\200\n\152>\016\t\204\005<\000\000O:\n\192\000\000\005b\000\000O:\n\196\000\000*\182\000\017\005|\000\000O:\n\206\000\000\005\146\022\152\000\000\000\017\005\196\000\000O:\n\208\000\000&d\n\210\000\000\000\000\000\000\n\188\025.\t\248\005\198\000\000O:\n\232\000\000\007\184\000\000\n\196\000\017\n\n\n\218>\016\n\018\005\206\000\000O:\011\002\000\000\005\248\000\000O:\011\004\000\000*\182\000\017\006\004\000\000O:\011\006\000\000\005\146\000\000\000\000\n\030\000\000\025\178\n\158\000\000\000\000\000\000\n\170\000\000\000\165\001p\000\000\019\152\011\016\000\000\000\000O:\nd\t\n\000\000\n:\000\000\0013\000\0002\246\000\000\000\000\001\182\019\152\000\000\019\152\000\000\n(\000\000\001\182\000\000O:\003\236O:\000\000O:\000\000\n*\000\000\003\236\000\000O:\003\236\n4\000\000\021\024$\182\000\000\005\216\021\024\000\000\000\000\021\024\000\000\n>\000\000\005\216\000\000O:\003\236\nB\000\0002\246\005\2202\246\000\0002\246\000\000\nD\000\000\005\220\000\000O:\003\236\nH\000\000\000\000 J\000\000\000\151\n\232\000\000\000\000\n\190_\220\000\000\000\000\000\000\000\000\000\000\000\000\n\154\006\006\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002v_\220\000\000\001\b\003P\n\158\000\151\000\000\000\000\n\160\000\151\000\000\000\000\000\000\000\000\002\222\003P\000\000\000\000\000\000\000\000\011\000\000\000\000\000\000\000\000\000'\230*6\000\000[\232\000\000_\220\000\000\004@_\220\000\000\002\196\001H\001H\000\000\005\024\001H\000\000\nz\000\000\000\000\000\000\000\000\011\014\000\000+\148\000\000-\188_\220\000\000\003\224_\220\000\000\011\020\000\000_\220\011\022\000\000rh`^\011\026\000\000\011$\000\000r\246o\202_\220\000\000\000\000\n\192_\220\011\\\000\000\011b\000\000\011d\000\0002\246\000\000\005\1502\246\000\000\n\222\023\148\000\000_\220\011j\000\000\003\020_\220\000\000\004\154_\220\000\000\004\132\011\240\000\000\011\246\000\000`^_\220\n\236\000\000\000\000\000\000\000\000\000\000\000\000\011~\000\000sX_\220\011\130\000\000\011\136\000\000s\230o\218_\220\011\004_\220\011\142\000\000\011\148\000\000\011\150\000\000_\220\011<\000\151\000\000\000\000\006`_\220\000\000\004\132\000\000\011\156\000\000_\220\011\160\000\000tHp\228_\220\011\026_\220\011\170\000\000\011\172\000\000\011\174\000\000m,\023\148\000\000\023\148\000\000`^_\220\011*_\220\011\184\000\000\011\186\000\000\023\148\000\000qF\000\000\000\000\006j_\220\000\000\001\128\001\218\001H\0114\000\000\000\000\001\212\001\212\000\000\000\000\000\000\000\000\005\216\001\212\000\000\0116\000\000\000\000\000\000\000\000\000\000\000\000\000\000_\220\000\000\006\158_\220\000\000\006\006\002\220\000\151\011D\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\208\000\000\011\210\000\000_\220\011\212\000\000t\214_\220\011\216\000\000\011\220\000\000_\220\011\222\000\000!\174\011\142u8N\154r\006\011j\000\000_\220\011\244\000\000\011\252\000\000\011\204!\174_\220\012\000\000\000_\220\012\016\000\000\012\024\000\000_\220\012\026\000\000\000\151\011\138\000\000\000\000 J\000\000\000\000\0044\012\132\000\000\000\000\001C\000\000\000\000\000\000O:\000\000\000\000\000\000\004\132\000\000\000J\000\000\000\000\000\000\006\0062\2462\2462\246\000\000\003`\003`\003`\003`\000\000\000\000\000\000\000\000\000\000\000\000\003\002\019\152\012z\016\148\0012\000\000\000\000\004P\000\000\012\014\000\000.<\011\156\000\000\003\002\019\152\011\162\018\022\000\000\003\002\016\148\000\000\000\000\000\0002\246/6\000\000\000\000\000\000\011\240\0032\012|H\012H\012\000\000\004\136d\144H\012\006xI\176\000\000\000\000\b\170\012t\000\017\000\000\006\138KT\000\000\000\000\000\000\000\000\000\000\011\188\012\134\t\n\011\188\000\000\000\000\004P\000\000\012\014\000\000\021r\004\156\000\000\000\000\012p\000\000\000\000\0044\000\000\002\030\000\000\000\000\000\000O:\000\000\004\132\000\000\003N\000\000\000\000\000\000\007\136\000\000\r\144\005L\r\144\000\000\t\n\r\144\000\000\005\246\000\000\t\n\000\000\t\n\000\000\t\n\000\000\019\242\000\000\000\000\000\000\000\000\000\000\t\n\000\000\005\246\000\000\t\n\000\000#\144\000\000\000\000\n\140\011\248\000\151\000\151\012\164\001h\000\000\001h\012\204\000\000\012\206\000\000\004\b\000\000\001h\002\196\001h\0110\001h\000\000\000\000\003\170\000\000\0144\000\151\011\198\000\000\011\200\000\000\012\n\000\151\000\151\011\210\000\000\n\140\012\222\000\000\014\234\012\254\012\242\000\225\012\242\000\000\000\000\b\214\000\151\000\000\001D\000\000\000\000\000\007\000\000\011\218\000\000\000\000\000\000\012\024\000\151\000\151\011\226\000\000\000\000\n\140\014\234\012\254\b\214\001D\000\007\011\230\000\000\014\234\012\254\b\214\001D\000\007\011\232\000\000\005T\000\026\012\006\000\151\012\002\007\b\006J\012,\000\151\000\000\012.\000\151\000\000\012\142\000\000\012\020\003B\012\014\007\b\012\148\000\000\012\018\007\b\012\152\000\000\000\000\007\b\000\000\012\156\000\000"), (16, "\014\177\014\177\014\177\014\177\014\177\014\177\014\177\014\177\014\177\014\177\014\177\014\177\014\177\014\177\018&\014\177\014\177\014\177\014\177\014\177\014\177\014\177\014\177\014\177\014\177\025\"\007\217\030\247\030\251\014\177\007I\002\186\030\255\014%\011\005\014-\014\177\001\138\014\177\014%\014%\000&\014\177\018Z\014\177\014\177\014\149\014\177\001\138\"r\014\177\014%\019\250\0007\000;\014\177\014\177\014\177\002\162\002\226\014\177\000*\006)\000\n!\218\000\174\014\177\000\178\001\146\014\177\014\177\011\005\001\182\002\190\001\202\014\177\014\177\014%\014\177\007\"\014\177\001\"\001&\nQ\001\142\014\177\001\138\014\177\014\177!F\014\177\014\177\014\177\n2\025\n\001\150\014\177\014\177\014\177\005*\001\170\014\177\014\177\014\177\014\250\001\154\001\238\014\177\014\177\014\177\014\177\014\177\014\177\t\218\004\253\001\210\014\177\014\177\000N\r2\025r\025\154\025\170\025\222\025\238\026\022\014\254\014\177\014\177\014\177\000\n\021*\014\177\014\177\014\177\014\177\007\217\014\177\005B\014\177\002\026\000\n\014\177\001\234\001\238\014\177\014\177\t\237\"\002\001\242\001\206\000\n\006)\001\246\001\250\007A\014\177\014\177\b\217\007A\014\177\015\006\007\153\001\214\014\177\014\177\014\177\014\177\005\133\007Y\014\177\001\254\014\177\n\150\001\222\t\241\014\177\014\177\014\177\000\n\014\177\n\138\014\177\014\177\001\138\014\177\006\209\014\177\014\177\007\161\014\177\014\177\014\177\014\189\014\189\014\189\014\189\014\189\014\189\014\189\014\189\014\189\014\189\014\189\014\189\014\189\014\189\001\230\014\189\014\189\014\189\014\189\014\189\014\189\014\189\014\189\014\189\014\189\002\186\014=\026b\020z\014\189\018Z\001\138\031\031\031#\005\133\007\145\014\189\031'\014\189\019\250\018\130\005\133\014\189!N\014\189\014\189\029\138\014\189\r\018\001\150\014\189\002&\027R\r\137\0026\014\189\014\189\014\189\t\253\001\154\014\189\002m\001\146\006\250!R\0059\014\189\007\186\001\202\014\189\014\189!V\0059\017\158\018\134\014\189\014\189\015}\014\189\021\134\014\189\n:\029\158\025R\000\n\014\189\001\138\014\189\014\189\001\150\014\189\014\189\014\189\001\138\002J\026\202\014\189\014\189\014\189\001\154\026b\014\189\014\189\014\189\020~\nF\002^\014\189\014\189\014\189\014\189\014\189\014\189\011\t!\246\r\137\014\189\014\189\021*\r\026\005\173!\250\029\162\002\138\000\n\029\142\005a\014\189\014\189\014\189\020\134\005A\014\189\014\189\014\189\014\189\023j\014\189\005A\014\189!^\017j\014\189\023n\001\206\014\189\014\189\023r\015}\015}\002\142\001\150\012\222\015}\025Z\007.\022n\014\189\005\173\nA\014\189\001\154\000\006\000\"\014\189\014\189\014\189\014\189\017\162\002q\014\189\029\166\014\189!f\021\138\011\t\014\189\014\189\014\189\000\n\014\189\024\246\014\189\014\189\007i\014\189\000\n\014\189\014\189\001\138\014\189\014\189\014\189\007\225\007\225\007\225\007\225\007\225\007\225\007\225\007\225\007\225\007\225\007\225\007\225\007\225\007\225\014\194\007\225\007\225\007\225\007\225\007\225\007\225\007\225\007\225\007\225\007\225\001\138\007\137\001\146\006\250\007\225\018^\018n\018~\005\017\005Z\t\229\007\225\005j\007\225\005\138\005B!v\007\225\014\133\007\225\007\225\005\146\007\225\007\142\007\209\007\225\027N\002\157\017\006\001\150\007\225\001\146\007\225\017\n\014=\007\225\029\254\002*\031B\001\154\017\014\007\225\"\174\001\138\000.\017\018\031F\026\206 \139 \143\007\225\007\225\002\206 \147\005\154\007\225\007\225\b\017\001\150\021\154\007\225\026\218\007\225\007\225\000\n\007\225\007\225\007\225\001\154\026\222\014\157\007\225\007\225\007\225\001\146\021\158\007\225\007\225\007\225\007\185\026\190\011\186\007\225\007\225\007\225\007\225\007\225\007\225\n\t\005\170\b\170\007\225\007\225\000\n\t\197\005\017\017\174\002\214\007a\007a\021\186\001\150\017\178\007\225\007\225\007\145\007J\007\225\007\225\007\225\007\225\001\154\007\225\t\194\007\225\022>\026\234\007\225\005\017\b\017\007\225\007\225\n\237!\134\004R\0282\026\238\007A\026\250\017^\004\254!v\014\157\tr!~\007\225\000\n\t\181\n\001\007\225\007\225\007\225\007\225\005\213\000\n\007\225\002\226\007\225\025z\017j\t\130\007\225\007\225\007\225\002M\005\026\005\"\007\225\007\225\001\138\007\225!j\007\225\007\225\005\245\007\225\007\225\007\225\b\001\b\001\b\001\b\001\b\001\b\001\b\001\b\001\b\001\b\001\b\001\b\001\b\001\b\001!n\b\001\b\001\b\001\b\001\b\001\b\001\b\001\b\001\b\001\b\001\014=\b\001\021\190\020z\b\001\023\170\014] \171 \175\011\005\b\001\b\001 \179\b\001\005\158\028J\028R\b\001\018Z\b\001\b\001\030\230\b\001\014=\001\150\b\001\025\130\019\250\014=\007A\b\001\b\001\b\001\014=\001\154\b\001\b\001\b\001\b\001\014= k\b\001\b\001\b\001\b\001!\142\b\001\b\001 o\007A\b\001\b\001\b\001\b\001\014\141\b\001!~\028Z r\000\n\b\001\030\230\b\001\011\198\b\001\b\001\b\001\b\001\027\154\b\001\n\025\b\001\b\001\b\001\005\162\014]\b\001\b\001\b\001\020~\006\n\b\001\b\001\b\001\b\001\b\001\b\001\b\001\011\025\011\214\020\130\007y\b\001\020\150\t\225\017\210\002}\t\209\020\162\014u\023\174\t\213\002]\b\001\b\001\b\001\021*\b\001\b\001\b\001\b\001\b\001\b\001\006\014\b\001\017j\027B\b\001\017\242\005\198\b\001\b\001\005\214\018\014\005\246\b\001\b\001\023\218\021\226\022J\006z\005\254\b\001\006\142\022\002\b\001\015}\015}\017j\b\001\b\001\015}\b\001\017j\018Z\b\001\023\238\b\001\017j\022\190\011\025\b\001\031\246\019\250\017j\"n\n5\023>\b\001\024\n\b\001\028>\b\001\b\001\006\006\b\001\b\001\b\001\000R\000V\000f\000\194\r6\000\198\017\006\000\202\000\210\000\218\0016\017\n\001F\001N\026J\001v\031.\001~\017\014\001\134\002j\002r\002v\017\018\0312\006\182\026N\024.\024b\017\022\024\030\006\022\024\150\025\186\006\186\025\246\017&\026R\002~\026V\028J\028R\002\230\026Z\018.\017.\029\138\0182\000\n\026^\0186\007\201\011\005\024\170\023\222\002\134\027^\018J\026j\024\198\011\001\018Z\026n\014M\021*\011\005\002\246\"\134\026r\031f\019\250\007\169\006\214\023\242\018Z\020\014\018\142\031\146\031\158\007\177\020\018\022z\029\250\019\250\026v\003\026\024\014\003\030\006\005\"\146\002\154\021\"\020\026\001\138\0115\0115\018\166\003&\020\030\0115\006\254\018\170\nb\003.\025\198\007\006\025\254\018\174\018\178\017B\017F\018\182\020\"\011\017\007\n\026z\007F\020&\026~\028\014\007\193\015}\0242\024f\001\146\007B\0145\024\154\nr\018\186\007N\026\130\020*\020.\018\190\0202\026\134\000\n\026\138\020F\026\142\026\146\005\225\026\150\007^\020R\018\198\007f\024\174\021*\026\154\001\150\029\186\026\158\024\202\007j\007r\031\178\014}\014E\020r\001\154\021*\014e\020v\020\194\006\005\017J\026\162\007\129\018\202\007q\020\198\026\166\026\170\011\017\018\210\006\005\006\005\0115\0115\"\130\006\005\020\206\0115\018\214\000\n\b\t\b\t\014m\018\222\003r\b\t\000R\000V\000f\000\194\r6\000\198\017\006\000\202\000\210\000\218\0016\017\n\001F\001N\007\162\001v\031.\001~\017\014\001\134\002j\002r\002v\017\018\0312\rF\007\166\028\226\rV\017\022\rv\0049\029~\007\174\007\194\0049\017&\r~\002~ \002\007\214\007\238\002\230\n%\018.\017.\b\014\0182 \"\"\215\0186\b\022\002\141\b.\007A\002\134\b6\018J\029\238\b\254\011\001\t\154\002\186\t\166\t\210\t\226\002\246\t\234\001\138\018Z\r\134\n\n\n\022\002\226\n\030\020\014\018\142\031\146\019\250\n.\020\018\022\194\001\138\nB\024v\003\026\n\142\003\030\006\021\001\138\002\154\021\"\020\026\n\222\n\234\011\026\018\166\003&\020\030\001\146\024z\018\170\nb\003.\015\"\r\150\011\"\018\174\018\178\017B\017F\018\182\020\"\011\178\011\238\011\254\021&\020&\006r\012\006\012\018\017\174\012\030\012*\012F\014^\001\150\017\178\nr\018\186\b:\012R\020*\020.\018\190\0202\001\154\000\n\012Z\020F\001\238\012b\005\225\012r\012~\020R\018\198\001\238\012\138\007A\012\154\012\166\012\178\012\186\012\206\012\246\r\002\021*\r'\r\138\020r\000\n\r\142\r\246\020v\020\194\r\250\017J\014f\007A\018\202\014z\020\198\007A\r\178\000\n\018\210\r\194\006\021\r\226\014\162\014\166\000\n\020\206\014\186\018\214\r\234\b\025\b\025\001\138\018\222\003r\b\025\000R\000V\000f\000\194\r6\000\198\017\006\000\202\000\210\000\218\0016\017\n\001F\001N\014\230\001v\031.\001~\017\014\001\134\002j\002r\002v\017\018\0312\015\026\r\242\001\146 \018\017\022\015*\015>\015\158\015\162\015Z\016\n\017&\015j\002~\015\138\016\014\016z\002\230\016\142\018.\017.\015\146\0182\001\138\016\182\0186\016\186\016\206\016\230\001\150\002\134\016\250\018J\017\026\017\"\011\001\014\002\001\138\017*\001\154\0172\002\246\017:\017>\018Z\017f\017z\017\134\017\142\017\146\018\138\018\142\017\154\019\250\015\154\020\018\017\170\017\186\017\194\016r\003\026\017\198\003\030\0061\000\n\002\154\020\022\020\026\001\146\017\130\017\218\018\166\003&\020\030\017\226\017\250\018\170\nb\003.\018\002\018\022\001\238\018\174\018\178\017B\017F\018\182\020\"\018\030\015\170\017\174\015\133\020&\007\249\018*\001\150\017\178\018B\018V\007\249\007\249\018b\0049\nr\018\186\001\154\0049\020*\020.\018\190\0202!\234\000\n\018j\020F\018r\000\n\005\225\018z\018\150\020R\018\198\018\158\019\006\019\018\019J\019z\019\242\0206\020>\000\n\020N\021*\020V\020^\020r\020f\007\249\020n\020v\020\194\0061\017J\020\190\020\202\018\202\020\210\020\198\020\222\020\226\020\234\018\210\0061\0061\020\238\020\246\020\254\0061\020\206\001\138\018\214\021\006\011=\011=\021\014\018\222\003r\011=\000R\000V\000f\000\194\r6\000\198\017\006\000\202\000\210\000\218\0016\017\n\001F\001N\0216\001v\021z\001~\017\014\001\134\002j\002r\002v\017\018\021\130\002\186\021\146\021\162\020z\017\022\021\170\001\138\021\174\021\182\005\201\021\198\017&\021\206\002~\021\214\021\218\021\234\002\230\021\242\018.\017.\022\n\0182\022\018\001\150\0186\tq\022b\022\170!:\002\134\ty\018J\022\182\001\154\011\001\023*\001\146\0236\018Z\tq\002\246\016\222\023V\018Z\ty\023\130\023\146\019\250\023\154\018\138\018\142\023\182\019\250\023\194\020\018\023\202\023\206\023\214\000\n\003\026\023\230\003\030\023\250\001\150\002\154\020\022\020\026\024\022\024:\024F\018\166\003&\020\030\001\154\024V\018\170\nb\003.\020~\024^\024n\018\174\018\178\017B\017F\018\182\020\"\024~\024\134\024\138\004\245\020&\024\146\024\162\024\182\024\210\tq\024\230\000\n\024\242\002a\ty\nr\018\186!\170\025\002\020*\020.\018\190\0202\025\026\000\n\025*\020F!\190\0256\025g\025\143\005\201\020R\018\198\"\022\025\167!\194\005\201\005\201\021*\025\211\004\245\025\235\026\011\021*\026#\026;\020r\026F\005\201\005\201\020v\020\194\026f\017J\026\210\026\226\018\202\027\019\020\198\027j\015\198\tq\018\210\015\214\027\127\015\246\ty\027\167\027\179\020\206\027\195\018\214\015\254\tq\005\201\027\203\018\222\003r\ty\000R\000V\000f\000\194\r6\000\198\017\006\000\202\000\210\000\218\0016\017\n\001F\001N\027\230\001v\011\005\001~\017\014\001\134\002j\002r\002v\017\018\027\239\018Z\016\006\027\247\027\255\017\022\028\026\028+\028N\004\245\019\250\028V\017&\028f\002~\004\245\004\245\028\131\002\230\028\147\018.\017.\028\155\0182\028\174\028\183\0186\004\245\028\191\028\199\028\210\002\134\028\247\018J\029\003\029\022\011\001\016\022\001\138\029\031\029'\029/\002\246\029R\004\245\018Z\029[\029c\015}\029\150\029\198\018\138\018\142\004\245\019\250!~\020\018\030\006\030'\030/\030;\003\026\030K\003\030\030S\030_\002\154\020\022\020\026\001\146\023\190\030j\018\166\003&\020\030\030z\030\135\018\170\nb\003.\030\143\030\150\030\163\018\174\018\178\017B\017F\018\182\020\"\021*\030\175\017\174\015\133\020&\030\183\030\195\001\150\017\178\030\207\030\234\031r\031\154\031\170\031\222\nr\018\186\001\154\031\230\020*\020.\018\190\0202 \022\000\n >\020F B J w\015}\015}\020R\018\198!>\015}!J!Z!b!\159!\167!\210\000\n!\174\021*!\187!\198\020r!\214\"\011\"\026\020v\020\194\"'\017J\"K\"g\018\202\"v\020\198\"~\"\138\"\150\018\210\"\163\"\170\"\178\"\187\"\194\"\203\020\206\"\223\018\214\000\000\015\133\015\133\000\000\018\222\003r\015\133\000R\000V\000f\000\194\r6\000\198\017\006\000\202\000\210\000\218\0016\017\n\001F\001N\000\000\001v\031.\001~\017\014\001\134\002j\002r\002v\017\018\0312\000\000\000\000\000\000\000\000\017\022\000\000\000\000\000\000\000\000\000\000\000\000\017&\000\000\002~\000\000\000\000\000\000\002\230\000\000\018.\017.\000\000\0182\000\000\000\000\0186\000\000\000\000\000\000\000\000\002\134\000\000\018J\000\000\000\000\011\001\000\000\000\000\000\000\000\000\000\000\002\246\000\000\000\000\000\000\000\000\007\241\000\000\000\000\000\000\020\014\018\142\007\241\007\241\000\000\020\018 \194\000\000\000\000\000\000\003\026\000\000\003\030\000\000\007\241\002\154\021\"\020\026\000\000\000\000\000\000\018\166\003&\020\030\000\000\000\000\018\170\nb\003.\000\000\000\000\000\000\018\174\018\178\017B\017F\018\182\020\"\000\000\000\000\007\241\005\001\020&\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\nr\018\186\000\000\000\000\020*\020.\018\190\0202\000\000\000\n\000\000\020F\000\000\000\000\005\225\000\000\000\000\020R\018\198\000\000\000\000\000\000\000\000\000\000\000\000\000\000!v\000\000\000\000\000\000\000\000\000\000\020r\000\000\000\000\000\000\020v\020\194\000\000\017J\000\000\000\000\018\202\000\000\020\198\000\000\000\000\000\000\018\210\000\000\000\000\000\000\000\000\000\000\000\000\020\206\000\000\018\214\000\000\011!\011!\000\000\018\222\003r\011!\000R\000V\000f\000\194\r6\000\198\017\006\000\202\000\210\000\218\0016\017\n\001F\001N\004\253\001v\000\000\001~\017\014\001\134\002j\002r\002v\017\018\000\000\000\000\000\000\000\000\000\000\017\022\000\000\000\000\000\000\005\001\000\000\000\000\017&\000\000\002~\005\001\005\001\000\000\002\230\000\000\018.\017.\000\000\0182\000\000\000\000\0186\005\001\000\000\000\000\000\000\002\134\000\000\018J\000\000\000\000\011\001\000\000\000\000\000\000\000\000\000\000\002\246\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\014\018\142\005\001\000\000!~\020\018\021>\000\000\000\000\000\000\003\026\000\000\003\030\000\000\000\000\002\154\021\"\020\026\000\000\000\000\000\000\018\166\003&\020\030\000\000\000\000\018\170\nb\003.\000\000\000\000\000\000\018\174\018\178\017B\017F\018\182\020\"\000\000\000\000\000\000\015a\020&\000\000\000\000\000\000\000\000\000\000\000\000\004\253\000\000\000\000\000\000\nr\018\186\004\253\004\253\020*\020.\018\190\0202\000\000\000\n\000\000\020F\000\000\000\000\004\253!F\000\000\020R\018\198\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020r\000\000\000\000\000\000\020v\020\194\000\000\017J\004\253\000\000\018\202\000\000\020\198\000\000\000\000\000\000\018\210\000\000\000\000\000\000\000\000\000\000\000\000\020\206\000\000\018\214\000\000\015a\015a\000\000\018\222\003r\015a\000R\000V\000f\000\194\r6\000\198\017\006\000\202\000\210\000\218\0016\017\n\001F\001N\000\000\001v\000\000\001~\017\014\001\134\002j\002r\002v\017\018\000\000\000\000\000\000\000\000\000\000\017\022\000\000\000\000\000\000\000\000\000\000\000\000\017&\000\000\002~\000\000\000\000\000\000\002\230\000\000\018.\017.\000\000\0182\000\000\000\000\0186\000\000\000\000\000\000\000\000\002\134\000\000\018J\000\000\000\000\011\001\000\000\000\000\000\000\000\000\000\000\002\246\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\014\018\142\000\000\000\000\000\000\020\018\031v\000\000\000\000\000\000\003\026\000\000\003\030\000\000\000\000\002\154\021\"\020\026\000\000\000\000\000\000\018\166\003&\020\030\000\000\000\000\018\170\nb\003.\000\000\000\000\000\000\018\174\018\178\017B\017F\018\182\020\"\000\000\000\000\000\000\000\000\020&\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\nr\018\186\000\000\000\000\020*\020.\018\190\0202\000\000\000\n\000\000\020F\000\000\000\000\000\000\000\000\000\000\020R\018\198\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020r\000\000\000\000\000\000\020v\020\194\000\000\017J\000\000\000\000\018\202\000\000\020\198\000\000\000\000\000\000\018\210\000\000\000\000\000\000\000\000\000\000\000\000\020\206\000\000\018\214\000\000\015\173\015\173\000\000\018\222\003r\015\173\000R\000V\000f\000\194\r6\000\198\017\006\000\202\000\210\000\218\0016\017\n\001F\001N\000\000\001v\000\000\001~\017\014\001\134\002j\002r\002v\017\018\000\000\000\000\000\000\000\000\000\000\017\022\000\000\000\000\000\000\000\000\000\000\000\000\017&\000\000\002~\000\000\000\000\000\000\002\230\000\000\018.\017.\000\000\0182\000\000\000\000\0186\000\000\000\000\000\000\000\000\002\134\000\000\018J\000\000\000\000\011\001\000\000\000\000\000\000\000\000\000\000\002\246\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\014\018\142\000\000\000\000\000\000\020\018\031v\000\000\000\000\000\000\003\026\000\000\003\030\000\000\000\000\002\154\021\"\020\026\000\000\000\000\000\000\018\166\003&\020\030\000\000\000\000\018\170\nb\003.\000\000\000\000\000\000\018\174\018\178\017B\017F\018\182\020\"\000\000\000\000\000\000\000\000\020&\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\nr\018\186\000\000\000\000\020*\020.\018\190\0202\000\000\000\n\000\000\020F\000\000\000\000\000\000\000\000\000\000\020R\018\198\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020r\000\000\000\000\000\000\020v\020\194\000\000\017J\000\000\000\000\018\202\000\000\020\198\000\000\000\000\000\000\018\210\000\000\000\000\000\000\000\000\000\000\000\000\020\206\000\000\018\214\000\000\015\169\015\169\000\000\018\222\003r\015\169\000R\000V\000f\000\194\r6\000\198\017\006\000\202\000\210\000\218\0016\017\n\001F\001N\000\000\001v\000\000\001~\017\014\001\134\002j\002r\002v\017\018\000\000\000\000\000\000\000\000\000\000\017\022\000\000\000\000\000\000\000\000\000\000\000\000\017&\000\000\002~\000\000\000\000\000\000\002\230\000\000\018.\017.\000\000\0182\000\000\000\000\0186\017\006\000\000\000\000\000\000\002\134\017\n\018J\000\000\000\000\011\001\031B\000\000\017\014\000\000\000\000\002\246\000\000\017\018\031F\000\000\000\000\000\000\000\000\000\000\020\014\018\142\000\000\000\000\000\000\020\018\022\246\000\000\000\000\000\000\003\026\000\000\003\030\000\000\001\138\002\154\021\"\020\026\000\000\000\000\000\000\018\166\003&\020\030\000\000\000\000\018\170\nb\003.\000\000\021\154\000\000\018\174\018\178\017B\017F\018\182\020\"\000\000\000\000\000\000\000\000\020&\000\000\000\000\001\146\021\158\000\000\000\000\000\000\000\000\000\000\000\000\nr\018\186\000\000\000\000\020*\020.\018\190\0202\000\000\000\n\000\000\020F\000\000\000\000\017\174\000\000\000\000\020R\018\198\001\150\017\178\tq\000\000\000\000\000\000\011\005\000\000\000\000\000\000\001\154\000\000\000\000\020r\000\000\018Z\tq\020v\020\194\000\000\017J\000\000\000\000\018\202\019\250\020\198\000\000\000\000\000\000\018\210\000\000\000\000\000\000\000\000\000\000\000\n\020\206\000\000\018\214\000\000\005\245\000\000\000\000\018\222\003r\000R\000V\000f\000\194\r6\000\198\017\006\000\202\000\210\000\218\0016\017\n\001F\001N\000\000\001v\000\000\001~\017\014\001\134\002j\002r\002v\017\018\000\000\000\000\000\000\000\000\tq\017\022\000\000\000\000\000\000\000\000\000\000\000\000\017&\000\000\002~\000\000\000\000\000\000\002\230\000\000\018.\017.\000\000\0182\000\000\000\000\0186\017\006\000\000\000\000\000\000\002\134\017\n\018J\021*\000\000\011\001\031B\000\000\017\014\000\000\000\000\002\246\000\000\017\018\031F\000\000\000\000\000\000\000\000\000\000\025\174\018\142\000\000\000\000\000\000\020\018\tq\000\000\000\000\000\000\003\026\000\000\003\030\000\000\001\138\002\154\000\000\020\026\tq\000\000\000\000\018\166\003&\020\030\000\000\000\000\018\170\nb\003.\000\000\021\154\000\000\018\174\018\178\017B\017F\018\182\020\"\000\000\000\000\000\000\000\000\020&\000\000\000\000\001\146\021\158\000\000\000\000\000\000\000\000\000\000\000\000\nr\018\186\000\000\000\000\020*\020.\018\190\0202\000\000\000\n\000\000\020F\000\000\000\000\017\174\014U\014U\020R\018\198\001\150\017\178\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\154\000\000\000\000\020r\000\000\000\000\000\000\020v\020\194\000\000\017J\000\000\000\000\018\202\000\000\020\198\000\000\000\000\000\000\018\210\000\000\000\000\000\000\000\000\000\000\000\n\020\206\000\000\018\214\000\000\005\245\000\000\000\000\018\222\003r\000R\000V\000f\000\194\000\000\000\198\017\006\000\202\000\210\000\218\0016\017\n\001F\001N\000\000\001v\000\000\001~\017\014\001\134\002j\002r\002v\017\018\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014U\000\000\000\000\000\000\000\000\000\000\000\000\002~\000\000\t-\t-\002\230\000\000\018.\t-\000\000\0182\000\000\000\000\0186\014U\000\000\000\000\000\000\002\134\000\000\023v\000\000\000\000\011\001\000\000\014U\000\000\000\000\000\000\002\246\000\000\014U\014U\000\000\000\000\000\000\000\000\000\000\023\134\018\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\026\000\000\003\030\000\000\000\000\002\154\000\000\000\000\000\022\000\000\000\000\018\166\003&\000\000\000\000\014U\018\170\001\238\003.\000\000\014U\014U\018\174\018\178\017B\023\138\018\182\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\nr\018\186\0079\000\000\000\000\000\000\018\190\0079\000\000\000\n\000\000\000n\0079\000\000\0079\000\000\0079\000\000\018\198\0079\0079\0079\000\000\014&\0079\0146\0079\000\000\0079\000\000\014>\0079\rJ\0079\0079\0079\0079\0079\000\000\017J\0079\0079\018\202\0079\023\142\000\000\000\000\0079\018\210\0079\000\000\000\000\0079\0079\0079\023\150\0079\018\214\000\000\0079\0079\0079\018\222\003r\000\000\0079\0079\000\000\0079\000\000\0079\0079\0079\000\000\000\000\0079\002V\000\000\0079\0079\000\000\000Z\0079\000Z\0079\0079\0079\000\000\000\000\0079\014r\000\000\000\000\0079\0079\000Z\0079\014\222\0079\0079\0079\0079\000Z\000\000\000\000\000\000\000\000\0079\0079\000\000\000\000\000\000\0079\0079\000\000\000\000\0079\000\000\000\000\000\000\000\000\000\000\0079\0079\000\000\0079\0079\000\000\0079\0079\000\000\000\000\0079\0079\0079\0079\0079\0079\0079\0079\000\000\0079\000\000\000\000\000\000\000\000\0079\0079\0079\000\000\0079\0079\0079\0079\0079\0079\000\000\0079\0079\000\000\0079\000\000\000\000\0079\000\000\000\000\0079\0079\000\000\000\000\0079\0079\0079\000\000\0079\0079\000\000\000\000\0079\000\000\000\000\000\000\000\000\0079\0079\0079\000\000\000\000\0079\0079\0079\0079\0079\000\000\000\000\000\000\000\000\0079\0079\000\000\000\000\000\000\0079\000R\000V\000f\000\194\000\000\000\198\000\000\000\202\000\210\000\218\0016\000\000\001F\001N\000\000\001v\000\000\001~\000\000\001\134\002j\002r\002v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\138\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002~\000\000\000\000\000\000\002\230\000\000\001\138\000\000\021\154\002\254\000\000\000\000\003\002\000\000\000\000\000\000\000\000\002\134\000\000\000\000\000\000\000\000\000\000\001\146\021\158\000\000\000\000\000\000\002\246\000\000\000\000\002\250\000\000\000\000\000\000\000\000\005B\003\150\b\006\000\000\003\018\000\000\000\000\b\158\000\000\017\174\000\000\003\026\000\000\003\030\001\150\017\178\002\154\001\225\000\000\000\000\001\225\000\000\bB\003&\001\154\000\000\000\000\bF\001\238\003.\000\000\000\000\b\162\bJ\bN\000\000\001\138\bR\003>\000\000\000\000\000\000\000\000\001\225\001\225\000\000\000\000\000\000\000\000\000\n\000\000\000\000\024v\000\000\000\000\bV\000\000\000\000\001\225\000\000\bZ\000\000\001\225\000\n\001\225\001\225\000\000\001\146\024z\000\000\000\000\000\000\bb\000\000\001\225\000\000\000\000\001\225\000\000\001\225\005B\000\000\000\000\b\166\000\000\000\000\000\000\000\000\000\000\017\174\007\145\000\000\000\000\000\000\001\150\017\178\bf\000\000\000\000\000\000\000\000\000\000\bn\000\000\001\154\005Y\001\225\000\000\000\000\005Q\000\000\br\000\000\005Q\000\000\000\000\bz\003r\000R\000V\000f\000\194\000\000\000\198\000\000\000\202\000\210\000\218\0016\000\n\001F\001N\000\000\001v\000\000\001~\000\000\001\134\002j\002r\002v\005Q\000\000\000\000\000\000\000\000\001\225\b\182\000\000\001\225\000\000\000\000\000\000\001\225\000\000\000\000\002~\000\000\000\000\000\000\002\230\000\000\001\138\000\000\000\000\002\254\000\000\001\225\003\002\005Q\007\145\001\225\001\225\002\134\000\000\000\000\000\000\000\000\b\190\000\000\005Q\000\000\001\225\001\225\002\246\000\000\000\000\002\250\000\000\000\000\000\000\000\000\000\000\003\150\b\006\000\000\003\018\000\000\000\000\b\158\000\000\000\000\000\000\003\026\000\000\003\030\000\000\000\000\002\154\000\000\005Q\005Q\000\000\000\000\bB\003&\000\000\000\000\000\000\bF\001\238\003.\000\000\000\000\b\162\bJ\bN\000\000\004>\bR\003>\005Q\005Q\000\000\005Q\000\000\000\000\000\000\000\000\000\000\005Q\005Q\000\000\000\000\017Y\005Q\000\000\bV\000\000\000\000\000\000\000\000\bZ\000\000\000\000\000\n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bb\000\000\000\000\000\000\000\000\000\000\017Y\017Y\000\000\000\000\000\000\b\166\000\000\000\000\n\206\000\000\000\000\000\000\000\000\000\000\000\000\017Y\000\000\000\000\bf\000\000\000\000\017Y\017Y\000\000\bn\n\214\000\000\t\185\n\226\000\000\000\000\017Y\000\000\br\017Y\000\000\017Y\000\000\bz\003r\000R\000V\000f\000\194\000\000\000\198\000\000\000\202\000\210\000\218\0016\000\000\001F\001N\000\000\001v\000\000\001~\000\000\001\134\002j\002r\002v\017Y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002~\000\000\000\000\000\000\002\230\n\238\001\138\000\000\000\000\002\254\000\000\000\000\003\002\000\000\000\000\000\000\000\000\002\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017Y\000\000\000\000\002\246\000\000\n\242\002\250\017Y\000\000\000\000\000\000\000\000\003\150\b\006\000\000\003\018\n\250\000\000\b\158\000\000\000\000\017Y\003\026\000\000\003\030\000\000\000\000\002\154\017Y\000\000\000\000\000\000\000\000\bB\003&\000\000\017Y\017Y\bF\001\238\003.\000\000\000\000\b\162\bJ\bN\000\000\000\000\bR\003>\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\238\000\000\000\000\b\246\000\000\000\000\000\000\000\000\bV\000\000\000\000\000\000\000\000\bZ\000\000\000\000\000\n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bb\t\006\t\014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\166\000\000\000\000\000\000\000\000\t\022\000\000\000\000\000\000\0025\000\000\t\030\t&\bf\000\000\000\000\000\000\000\000\000\000\bn\000\000\t.\002Q\000\000\t6\000\000\t>\000\000\br\000\000\000\000\000\000\000\000\bz\003r\000R\000V\000f\000\194\000\000\000\198\000\000\000\202\000\210\000\218\0016\000\000\001F\001N\000\000\001v\000\000\001~\tF\001\134\002j\002r\002v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002~\000\000\000\000\000\000\002\230\000\000\001\138\000\000\000\000\002\254\000\000\000\000\003\002\000\000\000\000\000\000\000\000\002\134\000\000\000\000\tN\000\000\000\000\0025\000\000\000\000\000\000\tV\002\246\000\000\000\000\002\250\000\000\000\000\000\000\000\000\000\000\003\150\b\006\000\000\003\018\0025\000\000\b\174\000\000\0025\0025\003\026\000\000\003\030\000\000\000\000\002\154\000\000\000\000\000\000\t^\tf\bB\003&\000\000\000\000\000\000\bF\001\238\003.\000\000\000\000\b\162\bJ\bN\000\000\000\000\bR\003>\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bV\000\000\000\000\000\000\000\000\bZ\000\000\000\000\000\n\000\000\000\000\000\000\000\000\000R\000V\000f\000\194\bb\000\198\000\000\000\202\000\210\000\218\0016\000\000\001F\001N\000\000\001v\000\000\001~\000\000\001\134\002j\002r\002v\000\000\000\000\000\000\000\000\000\000\bf\000\000\000\000\000\000\000\000\000\000\bn\000\000\000\000\t\201\002~\000\000\000\000\000\000\002\230\br\001\138\000\000\000\000\002\234\bz\003r\002\238\000\000\000\000\000\000\000\000\002\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\246\000\000\000\000\002\250\000\000\000\000\000\000\000\000\000\000\003\014\003\n\000\000\003\018\000\000\000\000\000\000\000\000\000\000\000\000\003\026\000\000\003\030\000\000\000\000\002\154\000\000\000\000\000\000\000\000\000\000\003\"\003&\000\000\000\000\000\000\003*\001\238\003.\000\000\000\000\000\000\0032\0036\000\000\000\000\003:\003>\000\000\005N\005V\000\194\000\000\000\198\000\000\005\178\005\186\005\194\006\030\000\000\006.\0066\000\000\006^\003B\006f\000\000\006n\006\154\003F\006\162\000\000\000\n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003N\000\000\000\000\000\000\000\000\006\170\000\000\000\000\000\000\000\000\000\000\003R\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\178\000\000\003V\000\000\000\000\000\000\000\000\000\000\003b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003z\000\000\000\000\000\000\000\000\003j\003r\001\133\001\133\001\133\001\133\000\000\001\133\0079\001\133\001\133\001\133\001\133\006\194\001\133\001\133\000\000\001\133\000\000\001\133\0079\001\133\001\133\001\133\001\133\000\000\000\000\000\000\000\000\026.\000\000\0079\000\000\0079\000\000\000\000\000\000\0079\0079\001\133\001\133\001\133\000\000\0079\000\000\0262\000\000\000\000\000\000\0079\000\000\001\133\0079\000\000\000\000\000\000\0079\001\133\000\000\000\000\001\133\000\000\0079\000\000\001\133\000\000\000\000\026>\000\000\000\000\001\133\000\000\000\000\0079\0156\000\000\000\000\001\133\0079\000Z\000\000\000\000\001\133\000\000\0079\000\000\000\000\000\000\000\000\000\000\000\000\001\133\001\133\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0079\000\000\000\000\0079\000\000\000\000\0079\000\000\001\133\000\000\000\000\001\133\000\000\000\000\001\133\000\000\000\000\000\000\000\000\0079\000\000\000\000\000\000\000\000\0079\0079\0079\001\133\0079\0079\000\000\0079\001\133\000\000\001\133\000\000\000\000\001\133\0079\026B\000\000\0079\000\000\000\000\001\133\000\000\001\133\000\000\000\000\001\133\000\000\000\000\000\000\000\000\000\000\000\000\0079\000\000\000\000\000\000\000\000\0079\0079\000\000\001\133\001\133\000\000\000\000\000\000\001\133\001\133\000\000\000\000\000\000\000R\r:\rB\000\194\000\000\000\198\027\022\r\158\r\166\r\174\014\n\000\000\014\026\014\"\026J\014J\000\000\014R\000\000\014Z\014\134\002r\014\142\000\000\000\000\000\000\026N\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\026R\014\150\026V\000\000\000\000\000\000\026Z\000\000\000\000\000\000\000\000\000\000\026^\000\000\000\000\000\000\000\000\000\000\030f\000\000\000\000\026j\000\000\000\000\000\000\026n\000\000\000\000\000\000\000\000\000\000\026r\000\000\000\000\000\000\000\000\000\000\000\000\014\174\000\000\000\000\000\000\000\000\028\002\000\000\000\000\000\000\026v\029n\000\000\000\000\017\022\000\000\014\218\000\000\000\000\000\000\000\000\017&\000\000\000\000\000\000\000\000\000\000\002\230\000\000\001\138\017.\000\000\0182\000\000\000\000\0186\000\000\000\000\014\242\000\000\000\000\026z\018J\000\000\026~\011\001\000\000\000\000\000\000\000\000\000\000\002\246\000\000\000\000\000\000\000\000\000\000\026\130\000\000\000\000\020B\018\142\026\134\000\n\026\138\020\018\026\142\026\146\000\000\026\150\003\026\000\000\003\030\000\000\000\000\000\000\026\154\020\026\000\000\026\158\000\000\018\166\003&\020\030\000\000\000\000\018\170\nb\003.\000\000\000\000\000\000\018\174\018\178\026\162\000\000\018\182\020\"\000\000\026\166\026\170\000\000\020&\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\nr\018\186\000\000\000\000\020*\020.\018\190\0202\000\000\000\n\000\000\020F\000\000\000\000\000\000\000\000\000\000\020R\018\198\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020r\000\000\000\000\000\000\020v\020\194\017\022\000\000\000\000\000\000\018\202\000\000\020\198\017&\000\000\000\000\018\210\000\000\000\000\002\230\000\000\001\138\017.\020\206\0182\018\214\000\000\0186\017\006\000\000\018\222\003r\000\000\017\n\018J\000\000\000\000\011\001\031B\000\000\017\014\000\000\000\000\002\246\000\000\017\018\031F\000\000\000\000\000\000\000\000\000\000\018\162\018\142\000\000\000\000\000\000\020\018\000\000\000\000\000\000\000\000\003\026\000\000\003\030\000\000\001\138\000\000\000\000\020\026\000\000\000\000\000\000\018\166\003&\020\030\000\000\000\000\018\170\nb\003.\000\000\021\154\000\000\018\174\018\178\000\000\000\000\018\182\020\"\000\000\000\000\000\000\000\000\020&\000\000\000\000\001\146\021\158\000\000\000\000\000\000\000\000\000\000\000\000\nr\018\186\000\000\000\000\020*\020.\018\190\0202\000\000\000\n\000\000\020F\000\000\000\000\017\174\000\000\000\000\020R\018\198\001\150\017\178\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\154\000\000\000\000\020r\000\000\000\000\000\000\020v\020\194\000\000\000\000\000\000\000\000\018\202\000\000\020\198\000\000\000\000\000\000\018\210\000\000\000\000\000\000\000\000\000\000\000\n\020\206\000\000\018\214\000\000\005\245\000\000\000\000\018\222\003r\000R\000V\000f\000\194\000\000\000\198\000\000\000\202\000\210\000\218\0016\000\000\001F\001N\000\000\001v\000\000\001~\000\000\001\134\002j\002r\002v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002~\000\000\011m\011m\002\230\000\000\001\138\011m\000\000\0182\000\000\000\000\0186\000\000\000\000\000\000\000\000\002\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\246\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\025\174\018\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\026\000\000\003\030\000\000\000\000\002\154\017\253\000\000\000\000\017\253\000\000\018\166\003&\000\000\000\000\000\000\018\170\001\238\003.\000\000\000\000\000\000\018\174\018\178\000\000\r\153\018\182\000\000\000\000\000\000\000\000\000\000\017\253\017\253\000\000\000\000\000\000\017\253\000\000\000\000\017\253\017\253\000\000\nr\018\186\000\000\000\000\017\253\000\000\018\190\017\253\017\253\000\n\017\253\017\253\000\000\r\153\017\253\000\000\017\253\017\253\018\198\000\000\017\253\000\000\000\000\017\253\000\000\017\253\017\253\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\r\153\000\000\018\202\000\000\000\000\000\000\000\000\000\000\018\210\000\000\r\153\000\000\017\253\000\000\017\253\000\000\000\000\018\214\000\000\000\000\000\000\000\000\018\222\003r\000\000\017\253\000\000\000\000\000\000\000\000\000\000\000\000\017\253\000\000\000\000\r\153\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006Y\000\000\000\000\006Y\000\000\000\000\017\253\017\253\000\000\017\253\017\253\017\253\000\000\017\253\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\253\000\000\000\000\000\000\006Y\006Y\000\000\006Y\017\253\000\000\017\253\000\000\006Y\006Y\000\000\000\000\017\253\017\253\017\253\006Y\017\253\017\253\017\253\r\149\000\000\006Y\006Y\000\000\000\000\006Y\006Y\006Y\006Y\000\000\000\000\006Y\000\000\000\000\006Y\006Y\006Y\006Y\000\000\000\000\000\000\006Y\000\000\000\000\006Y\006Y\000\000\006Y\006Y\000\000\r\149\006Y\000\000\006Y\006Y\000\000\000\000\006Y\000\000\000\000\006Y\000\000\006Y\006Y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\r\149\000\000\000\000\000\000\000\000\000\000\006Y\000\000\000\000\000\000\r\149\000\000\006Y\000\000\006Y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006Y\006Y\006Y\000\000\000\000\b\209\006Y\006Y\006Y\000\000\r\149\000\000\000\000\000\000\000\000\000\000\000\000\006Y\000\000\000\000\000\000\000\000\006Y\000\000\000\000\006Y\000\000\006Y\006Y\006Y\006Y\b\209\006Y\006Y\006Y\000\000\000\000\006Y\006Y\000\000\000\000\000\000\000\000\006Y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006Y\000\000\006Y\000\000\000\000\000\000\000\000\000\000\006Y\006Y\006Y\000\000\006Y\006Y\006Y\r\005\r\005\r\005\r\005\000\000\r\005\000\000\r\005\r\005\r\005\r\005\000\000\r\005\r\005\000\000\r\005\000\000\r\005\000\000\r\005\r\005\r\005\r\005\000\000\000\000\017\173\000\000\000\000\017\173\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\r\005\r\005\r\005\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\r\005\000\000\017\173\017\173\000\000\000\000\r\005\017\173\000\000\027&\003\138\017\173\000\000\027.\000\000\000\000\000\000\017\173\000\000\r\005\017\173\017\173\000\000\017\173\017\173\000\000\r\005\003\146\000\000\017\173\003\166\r\005\000\000\017\173\000\000\000\000\017\173\000\000\017\173\017\173\r\005\r\005\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\r\005\000\000\017\173\r\005\017\173\000\000\r\005\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\173\000\000\000\000\000\000\r\005\000\000\000\000\005\002\000\000\r\005\000\000\r\005\000\000\000\000\r\005\000\000\000\000\000\000\000\000\000\000\000\000\r\005\000\000\r\005\000\000\000\000\r\005\017\173\017\173\000\000\017\173\017\173\005\006\000\000\017\173\000\000\000\000\000\000\000\000\000\000\000\000\r\005\r\005\005\014\000\000\000\000\027\130\r\005\017\173\000\000\000\000\017\173\017\173\017\173\017\173\017\173\000\000\000\000\000\000\017\173\017\173\017\173\000\000\017\173\017\173\017\173\017=\000\000\000\000\017=\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017=\017=\000\000\000\000\000\000\017=\000\000\000\000\003\138\017=\000\000\000\000\000\000\000\000\000\000\017=\000\000\000\000\017=\017=\000\000\017=\017=\000\000\000\000\003\146\000\000\017=\003\166\000\000\000\000\017=\000\000\000\000\017=\000\000\017=\017=\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017=\000\000\017=\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017=\012\245\012\245\012\245\012\245\000\000\012\245\005\002\012\245\012\245\012\245\012\245\000\000\012\245\012\245\000\000\012\245\000\000\012\245\000\000\012\245\012\245\012\245\012\245\000\000\000\000\000\000\017=\017=\000\000\017=\017=\005\006\000\000\017=\000\000\000\000\000\000\012\245\012\245\012\245\000\000\000\000\005\014\000\000\000\000\000\000\000\000\017=\000\000\012\245\017=\017=\017=\017=\017=\012\245\000\000\000\000\017=\017=\017=\000\000\017=\017=\017=\005N\005V\000\194\012\245\000\198\000\000\005\178\005\186\005\194\006\030\012\245\006.\0066\000\000\006^\012\245\006f\000\000\006n\006\154\000\000\006\162\000\000\000\000\012\245\012\245\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\170\000\000\000\000\000\000\000\000\000\000\002\162\000\000\000\000\000\000\012\245\000\000\000\000\012\245\000\000\000\000\012\245\006\178\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\245\000\000\000\000\000\000\000\000\012\245\000\000\012\245\000\000\000\000\012\245\000\000\000\000\000\000\000\000\000\000\000\000\012\245\000\000\012\245\000\000\000\000\012\245\006\194\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\245\012\245\000\000\000\000\000\000\027*\012\245\012\249\012\249\012\249\012\249\000\000\012\249\000\000\012\249\012\249\012\249\012\249\000\000\012\249\012\249\000\000\012\249\000\000\012\249\000\000\012\249\012\249\012\249\012\249\000\000\000\000\006a\000\n\000\000\006a\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\249\012\249\012\249\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\249\000\000\006a\006a\000\000\000\000\012\249\006a\000\000\027\134\006a\006a\000\000\000\000\000\000\000\000\000\000\006a\000\000\012\249\006a\006a\000\000\006a\006a\000\000\012\249\006a\000\000\006a\006a\012\249\000\000\006a\000\000\000\000\006a\000\000\006a\006a\012\249\012\249\000\000\015N\015V\000\194\000\000\000\198\000\000\015\178\015\186\015\194\016\030\000\000\016.\0166\000\000\016^\000\000\016f\000\000\016n\016\154\012\249\016\162\006a\012\249\006a\000\000\012\249\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006a\000\000\016\170\000\000\012\249\000\000\000\000\006a\000\000\012\249\000\000\012\249\000\000\000\000\012\249\000\000\000\000\000\000\000\000\016\178\000\000\012\249\000\000\012\249\000\000\000\000\012\249\006a\006a\000\000\006a\b\221\006a\000\000\006a\000\000\000\000\000\000\000\000\000\000\000\000\012\249\012\249\006a\000\000\000\000\006]\012\249\006a\006]\000\000\006a\000\000\006a\016\194\006a\000\000\000\000\000\000\006a\006a\006a\000\000\006a\006a\006a\000\000\000\000\000\000\000\000\000\000\000\000\006]\006]\000\000\000\000\000\000\006]\000\000\000\000\006]\006]\000\000\000\000\000\000\017q\000\000\006]\000\000\000\000\006]\006]\000\000\006]\006]\000\000\000\000\006]\000\000\006]\006]\000\000\000\000\006]\000\000\000\000\006]\000\000\006]\006]\000\000\017q\017q\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017q\000\000\000\000\000\000\000\000\000\000\017q\017q\000\000\006]\000\000\006]\000\000\000\000\b:\000\000\017q\000\000\000\000\017q\000\000\017q\006]\000R\r:\rB\000\194\000\000\000\198\006]\r\158\r\166\r\174\014\n\000\000\014\026\014\"\000\000\014J\000\000\014R\000\000\014Z\014\134\002r\014\142\000\000\000\000\017q\006]\006]\000\000\006]\b\213\006]\000\000\006]\000\000\000\000\000\000\027\142\014\150\027\170\000\000\000\000\006]\000\000\000\000\000\000\000\000\006]\000\000\027\182\006]\000\000\006]\000\000\006]\014\158\000\000\000\000\006]\006]\006]\000\000\006]\006]\006]\017q\000\000\000\000\027\206\000\000\000\000\000\000\017q\000\000\000\000\014\174\000\000\000\000\000\000\000\000\028\002\000\000\000\000\000\000\000\000\000\000\017q\000\000\000\000\028\"\014\218\000\000\000\000\017q\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017q\017q\000\000\000\000\000\000\002\230\000\000\001\138\000\000\000\000\b\030\014\242\000\000\b\"\028.\000\000\000\000\028\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\246\028\158\000\000\b>\000\000\000\000\028\202\000\000\n\233\n\002\n\014\028\250\n&\n2\nJ\nN\000\000\000\000\029\006\003\026\0292\003\030\000\000\0302\000\000\000\000\000\000\000\000\000\000\000\000\nR\003&\000\000\nV\nZ\n^\nb\003.\030>\030V\000\000\nf\nj\000\000\030b\nn\001\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\nr\nv\000\000\017\006\000\000\000\000\nz\000\000\017\n\000\n\000\000\000\000\000\000\031B\000\000\017\014\000\000\000\000\n\130\000\000\017\018\031F\000\000\000\000\000\000\000\000\000\000\007Y\000\000\n\134\000\000\n\150\002\230\000\000\001\138\000\000\000\000\b\030\000\000\000\000\b\"\001\138\n\158\000\000\000\000\000\000\000\000\000\000\n\166\000\000\000\000\000\000\000\000\000\000\005i\000\000\002\246\n\170\000\000\b>\000\000\000\000\n\178\003r\000\000\n\002\n\014\000\000\n&\n2\nJ\nN\001\146\017\130\000\000\003\026\000\000\003\030\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\nR\003&\000\000\nV\nZ\n^\nb\003.\017\174\000\000\000\000\nf\nj\001\150\017\178\nn\001\154\000\000\000\000\000\000\000\000\000\000\000\000\001\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\nr\nv\000\000\000\000\000\000\000\000\nz\000\000\000\000\000\n\000\000\000\000\000\000\000\000\000\000\000\000\000\n\000\000\n\130\000\000\000\000\005\245\000\000\000\000\000\000\000\000\000\000\007Y\000\000\n\134\000\000\n\150\002\230\000\000\001\138\000\000\000\000\b\030\000\000\000\000\b\"\000\000\n\158\000\000\000\000\000\000\000\000\000\000\n\166\000\000\000\000\000\000\000\000\000\000\n\r\000\000\002\246\n\170\000\000\b>\000\000\000\000\n\178\003r\000\000\n\002\n\014\000\000\n&\n2\nJ\nN\000\000\000\000\000\000\003\026\000\000\003\030\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\nR\003&\000\000\nV\nZ\n^\nb\003.\000\000\000\000\000\000\nf\nj\000\000\000\000\nn\001\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\nr\nv\000\000\000\000\000\000\000\000\nz\000\000\000\000\000\n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007Y\000\000\n\134\000\000\n\150\002\230\000\000\001\138\000\000\000\000\b\030\000\000\000\000\b\"\000\000\n\158\000\000\000\000\000\000\000\000\000\000\n\166\000\000\000\000\000\000\000\000\000\000\002\129\000\000\002\246\n\170\000\000\b>\000\000\000\000\n\178\003r\000\000\n\002\n\014\000\000\n&\n2\nJ\011\202\000\000\011:\000\000\003\026\000\000\003\030\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\nR\003&\000\000\nV\nZ\n^\nb\003.\000\000\000\000\000\000\nf\nj\011B\011J\nn\001\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011R\000\000\000\000\000\000\nr\nv\011Z\011b\000\000\000\000\nz\000\000\000\000\000\n\000\000\000\000\011j\000\000\000\000\011r\000\000\011z\n\130\000\000\017\197\000\000\000\000\017\197\000\000\000\000\000\000\007Y\000\000\000\000\000\000\n\150\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n\158\000\000\011\130\000\000\017\197\017\197\n\166\000\000\000\000\017\197\000\000\000\000\n\029\017\197\000\000\n\170\000\000\000\000\000\000\017\197\n\178\003r\017\197\017\197\000\000\017\197\017\197\000\000\000\000\000\000\000\000\017\197\000\000\b:\000\000\017\197\000\000\000\000\017\197\000\000\017\197\017\197\011\138\000\000\000\000\000\000\000\000\000\000\000\000\011\146\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\173\000\000\000\000\000\000\017\197\000\000\017\197\006\173\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\154\011\162\017\197\000R\000V\000f\000\194\r6\000\198\017\006\000\202\000\210\000\218\0016\017\n\001F\001N\000\000\001v\031.\001~\017\014\001\134\002j\002r\002v\017\018\0312\000\000\017\197\017\197\000\000\017\197\017\197\000\000\000\000\017\197\000\000\000\000\000\000\000\000\002~\017U\000\000\000\000\017U\000\000\002\162\000\000\000\000\017\197\000\000\000\000\017\197\017\197\017\197\017\197\017\197\002\134\000\000\000\000\017\197\017\197\017\197\000\000\017\197\017\197\017\197\017U\017U\000\000\000\000\000\000\017U\000\000\000\000\000\000\017U\002\150\000\000\000\000\000\000\000\000\017U\000\000\000\000\017U\017U\000\000\017U\017U\000\000\000\000\002\154\000\000\017U\000\000\b:\000\000\017U\000\000\000\000\017U\000\000\017U\017U\000\000\000\000\000\000\000\000\000\000\000\000\017B\017F\000\000\014\178\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017U\000\000\017U\000\000\000\000\000\000\000\000\000\000\000\000\000\n\000\000\000\000\000\000\017U\005\225\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007Q\017J\017U\017U\000\000\017U\017U\000\000\000\000\017U\000\000\007Q\000\000\000\000\000\000\017\145\007Q\000\000\017\145\000\000\000\000\000\000\000\000\017U\000\000\000\000\017U\017U\017U\017U\017U\000\000\000\000\000\000\017U\017U\017U\000\000\017U\017U\017U\017\145\017\145\000\000\000\000\000\000\017\145\000\000\000\000\018\246\017\145\000\000\000\000\000\000\000\000\000\000\017\145\000\000\000\000\017\145\017\145\000\000\017\145\017\145\000\000\000\000\018\254\000\000\017\145\019\n\000\000\000\000\017\145\000\000\000\000\017\145\000\000\017\145\017\145\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\209\000\000\000\000\001\209\000\000\000\000\000\000\000\000\000\000\017\145\000\000\017\145\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\145\000\000\000\000\000\000\001\209\001\209\000\000\019\022\000\000\001\209\000\000\000\000\000\000\001\209\000\000\000\000\000\000\000\000\000\000\001\209\000\000\000\000\001\209\001\209\000\000\001\209\001\209\017\145\017\145\000\000\017\145\001\209\019\026\000\000\017\145\001\209\000\000\000\000\001\209\000\000\001\209\001\209\000\000\019\"\001\209\000\000\000\000\000\000\000\000\000\000\000\000\017\145\000\000\017\145\000\000\000\000\000\000\000\000\000\000\017\145\017\145\017\145\000\000\017\145\017\145\017\145\000\000\001\209\001\209\001\209\000\000\000\000\001\209\000\000\000\000\000\000\001\209\000\000\000\000\000\000\001\209\000\000\001\209\000\000\000\000\001\209\001\209\000\000\001\209\001\209\000\000\000\000\000\000\000\000\001\209\000\000\000\000\000\000\001\209\000\000\000\000\001\209\000\000\001\209\001\209\000\000\000\000\001\209\003\174\000\000\001\209\001\209\000\000\000\000\001\209\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\209\000\000\001\209\001\209\001\209\001\209\001\209\000\000\000\000\000\000\000\000\004\242\001\209\001\209\000\000\001\209\001\209\001\209\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\209\003\182\000\000\001\209\001\209\000\000\000\000\001\209\000\000\000\000\000\000\000\000\000\000\001Y\000\000\000\000\001Y\000\000\000\000\000\000\000\000\001\209\000\000\000\000\001\209\001\209\001\209\001\209\000\000\000\000\000\000\000\000\004\230\001\209\001\209\000\000\001\209\001\209\001\209\001Y\001Y\000\000\000\000\000\000\001Y\000\000\000\000\000\000\001Y\000\000\000\000\000\000\000\000\000\000\003\238\000\000\000\000\001Y\001Y\000\000\001Y\001Y\000\000\000\000\000\000\000\000\001Y\000\000\000\000\000\000\001Y\000\000\000\000\003\246\000\000\004\006\001Y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001Y\000\000\001Y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001Y\005I\005I\005I\005I\000\000\005I\000\000\005I\005I\005I\005I\000\000\005I\005I\000\000\005I\000\000\005I\000\000\005I\005I\005I\005I\000\000\000\000\000\000\001Y\000\000\000\000\001Y\001Y\000\000\002\202\003\254\000\000\000\000\000\000\000\000\005I\001M\000\000\000\000\001M\000\000\005I\000\000\000\000\001Y\000\000\000\000\001Y\001Y\001Y\001Y\001Y\005I\000\000\000\000\000\000\001Y\001Y\000\000\001Y\001Y\001Y\001M\001M\000\000\000\000\000\000\001M\000\000\000\000\000\000\001M\005I\000\000\000\000\000\000\000\000\001M\005I\000\000\001M\001M\000\000\001M\001M\000\000\000\000\005I\000\000\001M\000\000\000\000\000\000\001M\000\000\000\000\003\246\000\000\001M\001M\000\000\005I\005I\000\000\000\000\000\000\000\000\000\000\000\000\005I\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001M\000\000\001M\000\000\000\000\000\000\000\000\000\000\000\000\005I\000\000\000\000\000\000\001M\000R\000V\000f\000\194\000\000\000\198\000\000\000\202\000\210\000\218\0016\000\000\001F\001N\000\000\001v\000\000\001~\000\000\001\134\002j\002r\002v\000\000\000\000\000\000\001M\000\000\000\000\001M\001M\000\000\000\000\003\254\000\000\000\000\000\000\000\000\002~\001Q\005I\000\000\001Q\000\000\002\162\000\000\000\000\001M\000\000\000\000\001M\001M\001M\001M\001M\002\134\000\000\000\000\000\000\001M\001M\000\000\001M\001M\001M\001Q\001Q\000\000\000\000\000\000\001Q\000\000\000\000\000\000\001Q\002\166\000\000\000\000\000\000\000\000\001Q\002\194\000\000\001Q\001Q\000\000\001Q\001Q\000\000\000\000\002\154\000\000\001Q\000\000\000\000\000\000\001Q\000\000\000\000\003\246\000\000\001Q\001Q\000\000\002\170\002\174\000\000\000\000\000\000\000\000\000\000\000\000\002\178\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001Q\000\000\001Q\000\000\000\000\000\000\000\000\000\000\000\000\000\n\000\000\000\000\000\000\001Q\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\198\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001Q\000\000\000\000\001Q\001Q\000\000\000\000\003\254\000\000\000\000\000\000\000\000\000\000\001U\015\029\000\000\001U\000\000\000\000\000\000\000\000\001Q\000\000\000\000\001Q\001Q\001Q\001Q\001Q\000\000\000\000\000\000\000\000\001Q\001Q\000\000\001Q\001Q\001Q\001U\001U\000\000\000\000\000\000\001U\000\000\000\000\000\000\001U\000\000\000\000\000\000\000\000\000\000\003\238\000\000\000\000\001U\001U\000\000\001U\001U\000\000\000\000\000\000\000\000\001U\000\000\000\000\000\000\001U\000\000\000\000\003\246\000\000\004\006\001U\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001U\000\000\001U\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001U\000R\000V\000f\000\194\000\000\000\198\000\000\000\202\000\210\000\218\0016\000\000\001F\001N\000\000\001v\000\000\001~\000\000\001\134\002j\002r\002v\000\000\000\000\000\000\001U\000\000\000\000\001U\001U\000\000\000\000\003\254\000\000\000\000\000\000\000\000\002~\001e\000\000\000\000\001e\000\000\002\162\000\000\000\000\001U\000\000\000\000\001U\001U\001U\001U\001U\002\134\000\000\000\000\000\000\001U\001U\000\000\001U\001U\001U\003\230\004\014\000\000\000\000\000\000\001e\000\000\000\000\000\000\001e\002\166\000\000\000\000\000\000\000\000\003\238\002\194\000\000\001e\001e\000\000\001e\001e\000\000\000\000\002\154\000\000\001e\000\000\000\000\000\000\001e\000\000\000\000\003\246\000\000\004\006\001e\000\000\002\170\002\174\000\000\000\000\000\000\000\000\000\000\000\000\002\178\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\030\000\000\001e\000\000\000\000\000\000\000\000\000\000\000\000\000\n\000\000\000\000\000\000\001e\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\198\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001e\000\000\000\000\001e\001e\000\000\000\000\003\254\000\000\000\000\000\000\000\000\000\000\001]\002\181\000\000\001]\000\000\000\000\000\000\000\000\001e\000\000\000\000\001e\001e\001e\001e\001e\000\000\000\000\000\000\000\000\001e\001e\000\000\001e\001e\001e\003\230\004\014\000\000\000\000\000\000\001]\000\000\000\000\000\000\001]\000\000\000\000\000\000\000\000\000\000\003\238\000\000\000\000\001]\001]\000\000\001]\001]\000\000\000\000\000\000\000\000\001]\000\000\000\000\000\000\001]\000\000\000\000\003\246\000\000\004\006\001]\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001]\000\000\001]\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001]\000R\000V\000f\000\194\000\000\000\198\000\000\000\202\000\210\000\218\0016\000\000\001F\001N\000\000\001v\000\000\001~\000\000\001\134\002j\002r\002v\000\000\000\000\000\000\001]\000\000\000\000\001]\001]\000\000\000\000\003\254\000\000\000\000\000\000\000\000\002~\001a\000\000\000\000\001a\000\000\002\162\000\000\000\000\001]\000\000\000\000\001]\001]\001]\001]\001]\002\134\000\000\000\000\000\000\001]\001]\000\000\001]\001]\001]\003\230\004\014\000\000\000\000\000\000\001a\000\000\000\000\000\000\001a\002\166\000\000\000\000\000\000\000\000\003\238\002\194\000\000\001a\001a\000\000\001a\001a\000\000\000\000\002\154\000\000\001a\000\000\000\000\000\000\001a\000\000\000\000\003\246\000\000\004\006\001a\000\000\002\170\002\174\000\000\000\000\000\000\000\000\000\000\000\000\002\178\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\030\000\000\001a\000\000\000\000\000\000\000\000\000\000\000\000\000\n\000\000\000\000\000\000\001a\000R\000V\000f\000\194\000\000\000\198\000\000\000\202\000\210\000\218\0016\000\000\001F\001N\000\000\001v\000\000\001~\000\000\001\134\002j\002r\002v\000\000\000\000\000\000\001a\000\000\000\000\001a\001a\000\000\000\000\003\254\000\000\000\000\000\000\000\000\002~\001i\002\173\000\000\001i\000\000\000\000\000\000\000\000\001a\000\000\000\000\001a\001a\001a\001a\001a\002\134\000\000\000\000\000\000\001a\001a\000\000\001a\001a\001a\003\230\004\014\000\000\000\000\000\000\001i\000\000\000\000\000\000\001i\002\150\000\000\000\000\000\000\000\000\003\238\007\014\000\000\001i\001i\000\000\001i\001i\000\000\000\000\002\154\000\000\001i\000\000\007\018\007\022\004\022\000\000\000\000\003\246\000\000\004\006\001i\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\026\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\030\000\000\001i\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001i\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\030\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004&\000\000\000\000\001i\001i\000\000\000\000\003\254\000\000\000\000\000\000\005y\000\000\001q\000\000\000\000\001q\000\000\000\000\000\000\000\000\001i\000\000\000\000\001i\001i\001i\001i\001i\000\000\000\000\000\000\000\000\001i\001i\000\000\001i\001i\001i\003\230\004\014\000\000\000\000\000\000\001q\000\000\000\000\000\000\001q\000\000\000\000\000\000\000\000\000\000\003\238\000\000\000\000\001q\001q\000\000\001q\001q\000\000\000\000\000\000\000\000\001q\000\000\000\000\000\000\004\022\000\000\000\000\003\246\000\000\004\006\001q\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\030\000\000\001q\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001q\000R\000V\000f\000\194\000\000\000\198\000\000\000\202\000\210\000\218\0016\000\000\001F\001N\000\000\001v\000\000\001~\000\000\001\134\002j\002r\002v\000\000\000\000\000\000\004&\000\000\000\000\001q\001q\000\000\000\000\003\254\000\000\000\000\000\000\000\000\002~\004\134\000\000\000\000\001m\000\000\000\000\000\000\000\000\001q\000\000\000\000\001q\001q\001q\001q\001q\002\134\000\000\000\000\000\000\001q\001q\000\000\001q\004.\001q\003\230\004\014\000\000\000\000\000\000\001m\000\000\000\000\000\000\001m\002\150\000\000\000\000\000\000\000\000\003\238\007\014\000\000\001m\001m\000\000\001m\001m\000\000\000\000\002\154\000\000\001m\000\000\007\018\007\022\004\022\000\000\000\000\003\246\000\000\004\006\001m\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\026\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\030\000\000\001m\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001m\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\030\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004&\000\000\000\000\001m\001m\000\000\000\000\003\254\000\000\000\000\000\000\nE\000\000\004\134\000\000\000\000\001u\000\000\000\000\000\000\000\000\001m\000\000\000\000\001m\001m\001m\001m\001m\000\000\000\000\000\000\000\000\001m\001m\000\000\001m\004.\001m\003\230\004\014\000\000\000\000\000\000\001u\000\000\000\000\000\000\001u\000\000\000\000\000\000\000\000\000\000\003\238\000\000\000\000\001u\001u\000\000\001u\004\142\000\249\000\000\000\000\000\249\001u\000\000\000\000\000\000\004\022\000\000\000\000\003\246\000\000\004\006\001u\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\230\004\014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\030\003\238\001u\000\000\000\000\000\249\000\000\000\249\000\249\000\000\000\000\000\000\000\000\001u\000\000\000\000\000\000\004\022\000\000\000\000\003\246\004%\004\006\000\000\000\000\000j\004%\000\000\000z\000\000\000\154\004%\000\000\004%\000\000\000\000\000\000\000\162\004%\004%\004&\000\000\000\000\001u\001u\000\000\000\000\003\254\000\000\004\030\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004%\000\000\001u\000\000\000\000\001u\001u\001u\001u\001u\000\000\000\170\004%\000\000\001u\001u\004%\001u\004.\001u\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004&\004%\004%\000\249\000\000\000\000\000\000\003\254\000\000\000\000\000\000\000\000\000\000\000\000\004%\000\000\000\186\000\000\000\000\000\000\000\000\000\249\000\000\004%\000\000\000\249\000\249\000\000\004%\004%\000\000\000\000\000\000\000\000\000\000\000\000\000\249\004.\004%\000\000\004!\000\000\004%\000\000\000\222\004!\000\000\000\238\000\000\001\014\004!\000\000\004!\004%\000\000\000\000\001\022\004!\004!\000\000\000\000\000\000\000\000\004%\000\000\000\000\000\000\000\000\004%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\030\004!\000\000\000\000\000\000\004!\000\000\000\000\000\000\000\000\000\000\000\000\004%\000\000\000\000\004%\004%\000\000\000\000\004%\004!\004!\000\000\003\218\004%\004%\0046\000\000\000\000\004%\000\000\000\000\000\000\004!\000\000\001.\000\000\000\000\000\000\000\000\000\000\000\000\004!\000\000\000\000\000\000\000\000\004!\004!\004f\004n\000\189\000\000\000\000\002-\000\000\000\000\004!\002-\000\000\000\000\004!\000\000\000\000\004v\000\000\000\000\002-\002-\000\165\004~\004\158\004!\000\000\000\000\000\000\002-\003\230\004\014\000\000\004\166\000\000\004!\004\174\000\000\004\182\002-\004!\000\000\000\000\000\000\000\000\003\238\000\000\000\000\000\165\000\165\000\000\000\189\000\189\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\022\000\000\003\238\003\246\004\190\004\006\002-\000\000\000\165\000\165\000\000\000\000\004!\000\000\000\000\004!\004!\002-\000\165\004!\000\000\003\246\000\000\004\006\004!\004!\000\000\000\000\000\000\004!\000\000\000\000\004\030\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\198\000\000\000\000\002-\002-\000\000\000\165\004\206\000\000\000\000\000\000\000\000\000\000\000\129\000\000\000\000\000\129\000\000\000\000\000\000\000\000\002-\000\000\000\000\002-\002-\002-\002-\004&\000\000\000\000\000\000\000\000\002-\002-\003\254\004\214\004\222\002-\003\230\004\014\000\000\000\000\000\000\000\129\000\000\000\165\000\000\000\129\000\189\000\000\000\000\000\000\003\254\003\238\000\000\000\189\000\129\000\129\000\000\000\129\000\129\000\000\000\000\000\189\004.\000\129\000\165\000\000\000\000\004\022\000\000\000\000\003\246\000\165\004\006\000\129\000\000\000\000\000\000\000\000\000i\000\165\000\165\000i\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\030\000\000\000\129\000\000\000\000\000i\000i\000\000\000\000\000\000\000i\000\000\000\000\000\129\000i\000\000\000\000\000\000\000\000\000\000\003\238\000\000\000\000\000i\000i\000\000\000i\000i\000\000\000\000\000\000\000\000\000i\000\000\000\000\000\000\000i\000\000\000\000\003\246\004&\004\006\000i\000\129\000\129\000\000\000\000\003\254\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\129\000\000\000\000\000\129\000\129\000\129\000\129\000i\000\000\000i\000\000\000\000\000\129\000\129\000\000\000\129\004.\000\129\000\000\000\000\000i\000R\000V\000f\000\194\000\000\000\198\000\000\000\202\000\210\000\218\0016\000\000\001F\001N\000\000\001v\000\000\001~\000\000\001\134\002j\002r\002v\000\000\000\000\000\000\000i\000\000\000\000\000i\000i\000\000\000\000\003\254\000\000\000\000\000\000\000\000\002~\000e\000\000\000\000\000e\000\000\000\000\000\000\000\000\000i\000\000\000\000\000i\000i\000i\000i\000\000\002\134\000\000\000\000\000\000\000i\000i\000\000\000i\000i\000i\000e\000e\000\000\000\000\000\000\000e\000\000\000\000\000\000\000e\002\150\000\000\000\000\000\000\000\000\003\238\007\014\000\000\000e\000e\000\000\000e\000e\000\000\000\000\002\154\000\000\000e\000\000\007\018\007\022\000e\000\000\000\000\003\246\000\000\004\006\000e\000\000\000\000\000\000\000\000\000]\000\000\000\000\000]\000\000\007\026\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000e\000\000\000e\000\000\000\000\000]\000]\000\000\000\000\000\000\000]\000\000\000\000\000e\000]\000\000\000\000\000\000\000\000\000\000\000]\000\000\000\000\000]\000]\000\000\000]\000]\000\000\007\030\000\000\000\000\000]\000\000\000\000\000\000\000]\000\000\000\000\003\246\000e\000]\000]\000e\000e\000\000\000\000\003\254\000\000\000\000\000\000\002\161\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000e\000\000\000\000\000e\000e\000e\000e\000]\000\000\000]\000\000\000\000\000e\000e\000\000\000e\000e\000e\000\000\000\000\000]\000R\000V\000f\000\194\000\000\000\198\000\000\000\202\000\210\000\218\0016\000\000\001F\001N\000\000\001v\000\000\001~\000\000\001\134\002j\002r\002v\000\000\000\000\000\000\000]\000\000\000\000\000]\000]\000\000\000\000\003\254\000\000\000\000\000\000\000\000\002~\004\134\000\000\000\000\000\137\000\000\000\000\000\000\000\000\000]\000\000\000\000\000]\000]\000]\000]\000\000\002\134\000\000\000\000\000\000\000]\000]\000\000\000]\000]\000]\003\230\004\014\000\000\000\000\000\000\000\137\000\000\000\000\000\000\000\137\002\150\000\000\000\000\000\000\000\000\003\238\031\234\000\000\000\137\000\137\000\000\000\137\004\142\000\000\000\000\002\154\000\000\000\137\000\000\031\238\007\022\004\022\000\000\000\000\003\246\000\000\004\006\000\137\000\000\000\000\000\000\000\000\004\134\000\000\000\000\000}\000\000\007\026\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\030\000\000\000\137\000\000\000\000\003\230\004\014\000\000\000\000\000\000\000}\000\000\000\000\000\137\000}\000\000\000\000\000\000\000\000\000\000\003\238\000\000\000\000\000}\000}\000\000\000}\000}\000\000\031\242\000\000\000\000\000}\000\000\000\000\000\000\004\022\000\000\000\000\003\246\004&\004\006\000}\000\137\000\137\000\000\000\000\003\254\000\000\000\000\000\000\005q\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\137\000\000\000\000\000\137\000\137\000\137\000\137\004\030\000\000\000}\000\000\000\000\000\137\000\137\000\000\004\150\004.\000\137\000\000\000\000\000}\000R\000V\000f\000\194\000\000\000\198\000\000\000\202\000\210\000\218\0016\000\000\001F\001N\000\000\001v\000\000\001~\000\000\001\134\002j\002r\002v\000\000\000\000\000\000\004&\000\000\000\000\000}\000}\000\000\000\000\003\254\000\000\000\000\000\000\000\000\002~\000u\000\000\000\000\000u\000\000\000\000\000\000\000\000\000}\000\000\000\000\000}\000}\000}\000}\000\000\002\134\000\000\000\000\000\000\000}\000}\000\000\000}\004.\000}\003\230\004\014\000\000\000\000\000\000\000u\000\000\000\000\000\000\000u\002\150\000\000\000\000\000\000\000\000\003\238\031\234\000\000\000u\000u\000\000\000u\000u\000\000\000\000\002\154\000\000\000u\000\000\031\238\007\022\000u\000\000\000\000\003\246\000\000\004\006\000u\000\000\000\000\000\000\000\000\000a\000\000\000\000\000a\000\000\007\026\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\030\000\000\000u\000\000\000\000\000a\000a\000\000\000\000\000\000\000a\000\000\000\000\000u\000a\000\000\000\000\000\000\000\000\000\000\000a\000\000\000\000\000a\000a\000\000\000a\000a\000\000\031\242\000\000\000\000\000a\000\000\000\000\000\000\000a\000\000\000\000\003\246\000u\000a\000a\000u\000u\000\000\000\000\003\254\000\000\000\000\000\000\n)\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000u\000\000\000\000\000u\000u\000u\000u\000a\000\000\000a\000\000\000\000\000u\000u\000\000\000u\000u\000u\000\000\000\000\000a\000R\000V\000f\000\194\000\000\000\198\000\000\000\202\000\210\000\218\0016\000\000\001F\001N\000\000\001v\000\000\001~\000\000\001\134\002j\002r\002v\000\000\000\000\000\000\000a\000\000\000\000\000a\000a\000\000\000\000\003\254\000\000\000\000\000\000\000\000\002~\000m\000\000\000\000\000m\000\000\000\000\000\000\000\000\000a\000\000\000\000\000a\000a\000a\000a\000\000\002\134\000\000\000\000\000\000\000a\000a\000\000\000a\000a\000a\003\230\004\014\000\000\000\000\000\000\000m\000\000\000\000\000\000\000m\002\150\000\000\000\000\000\000\000\000\003\238\031\234\000\000\000m\000m\000\000\000m\000m\000\000\000\000\002\154\000\000\000m\000\000\031\238\007\022\000m\000\000\000\000\003\246\000\000\004\006\000m\000\000\000\000\000\000\000\000\000q\000\000\000\000\000q\000\000\007\026\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000m\000\000\000m\000\000\000\000\003\230\004\014\000\000\000\000\000\000\000q\000\000\000\000\000m\000q\000\000\000\000\000\000\000\000\000\000\003\238\000\000\000\000\000q\000q\000\000\000q\000q\000\000\031\242\000\000\000\000\000q\000\000\000\000\000\000\000q\000\000\000\000\003\246\000m\004\006\000q\000m\000m\000\000\000\000\003\254\000\000\000\000\000\000\002\145\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000m\000\000\000\000\000m\000m\000m\000m\004\030\000\000\000q\000\000\000\000\000m\000m\000\000\000m\000m\000m\000\000\000\000\000q\000R\000V\000f\000\194\000\000\000\198\000\000\000\202\000\210\000\218\0016\000\000\001F\001N\000\000\001v\000\000\001~\000\000\001\134\002j\002r\002v\000\000\000\000\000\000\000q\000\000\000\000\000q\000q\000\000\000\000\003\254\000\000\000\000\000\000\000\000\002~\004\134\000\000\000\000\000\133\000\000\000\000\000\000\000\000\000q\000\000\000\000\000q\000q\000q\000q\000\000\002\134\000\000\000\000\000\000\000q\000q\000\000\000q\000q\000q\003\230\004\014\000\000\000\000\000\000\000\133\000\000\000\000\000\000\000\133\002\150\000\000\000\000\000\000\000\000\003\238\007&\000\000\000\133\000\133\000\000\000\133\004\142\000\000\000\000\002\154\000\000\000\133\000\000\007\018\007\022\004\022\000\000\000\000\003\246\000\000\004\006\000\133\000\000\000\000\000\000\000\000\000y\000\000\000\000\000y\000\000\007\026\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\030\000\000\000\133\000\000\000\000\003\230\004\014\000\000\000\000\000\000\000y\000\000\000\000\000\133\000y\000\000\000\000\000\000\000\000\000\000\003\238\000\000\000\000\000y\000y\000\000\000y\000y\000\000\000\000\000\000\000\000\000y\000\000\000\000\000\000\004\022\000\000\000\000\003\246\004&\004\006\000y\000\133\000\133\000\000\000\000\003\254\000\000\000\000\000\000\nU\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\133\000\000\000\000\000\133\000\133\000\133\000\133\004\030\000\000\000y\000\000\000\000\000\133\000\133\000\000\000\133\004.\000\133\000\000\000\000\000y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016:\0079\016J\000\000\000\000\000\000\000\000\016R\000\000\000\000\000\000\000\000\000\000\0079\004&\000\000\000\000\000y\000y\000\000\000\000\003\254\000\000\000\000\0079\000\000\0079\r\t\r\t\000\000\0079\0079\000\000\r\t\000\000\000y\0079\000\000\000y\000y\000y\000y\0079\000\000\000\000\0079\000\000\000y\000y\0079\000y\000y\000y\000\000\000\000\0079\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0079\016\134\000\000\r\t\000\000\0079\000Z\000\000\000\000\000\000\000\000\0079\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0079\r\t\000\000\0079\000\000\000\000\0079\000\000\000\000\000\000\002\230\000\000\001\138\000\000\000\000\002\234\000\000\000\000\002\238\0079\000\000\000\000\000\000\000\000\0079\0079\0079\000\000\0079\0079\000\000\0079\000\000\000\000\002\246\000\000\000\000\002\250\0079\000\000\000\000\0079\000\000\003\006\003\n\000\000\003\018\000\000\n\146\000\000\000\000\000\000\000\000\003\026\000\000\003\030\0079\000\000\000\000\000\000\000\000\0079\0079\r\t\003\"\003&\000\000\000\000\011\230\003*\001\238\003.\000\000\000\000\000\000\0032\0036\000\000\000\000\003:\003>\000\000\000\000\000\000\000\000\rZ\0079\rj\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003B\0079\000\000\000\000\000\000\003F\000\000\000\000\000\n\r\198\0079\r\214\0079\000\000\0079\000\000\000\000\003N\0079\0079\000\000\000\000\0079\000\000\0079\0079\000\000\000\000\003R\n\249\0079\000\000\000~\0079\000\142\0079\000\000\0079\000\000\0079\0079\003V\0079\0079\000\000\0079\000\000\003b\000\000\000\000\n\249\0079\n\249\000\000\0079\016\198\003z\000\000\0079\0079\000Z\003j\003r\0079\0079\0079\015n\0079\015~\015\218\0079\015\234\000\000\000\000\000\000\0079\016\242\000\000\000\000\0079\0079\000Z\0079\000\000\000\130\0079\0079\0079\000\000\000\000\0079\000\000\0079\0079\0079\0079\0079\0079\000\000\0079\0079\000\000\0079\000\000\000Z\0079\0079\0079\0079\000\000\000\000\0079\0079\0079\0079\0079\0079\000\000\0079\000\000\000\000\0079\0079\000\000\0079\0079\000\000\0079\0079\0079\000\000\0079\0079\0079\0079\0079\0079\0079\000Z\0079\0079\000Z\000\000\0079\0079\0079\0079\000\000\0079\0079\000\000\000\000\000\000\000\000\000Z\000\000\0079\0079\000\000\000\000\000\000\0079\000\000\000\000\0079\0079\0079\000\000\0079\0079\0079\0079\0079\000\000\0079\000\000\000\000\000\000\000\000\000\000\000\000\0079\000\000\000\000\0079\0079\000\000\0079\000\000\0079\0079\0079\0079\0079\0079\000\000\0079\0079\0079\0079\000\000\0079\000\000\0079\000\000\017\169\0079\0079\017\169\0079\000\000\0079\000\000\000\000\0079\000\000\001R\000\000\001b\0079\000\000\0079\000\000\001j\0079\000\000\0079\0079\000\000\0079\0079\017\169\017\169\000\000\000\000\000\000\017\169\000\000\000\000\000\000\017\169\000\000\000\000\000\000\0079\000\000\017\169\0079\0079\017\169\017\169\0079\017\169\017\169\000\000\000\000\0079\0079\017\169\0079\b:\0079\017\169\0079\000\000\017\169\000\000\017\169\017\169\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0079\0079\000\000\000\000\000\000\002\158\000\000\0079\r^\000\000\000Z\000\000\000\000\0079\000\000\000\000\017\169\000\000\017\169\0079\000\000\000\000\0079\000\000\000\000\000\000\000\000\0079\0079\017\169\0079\0079\0079\000\000\000\000\000\000\0079\0079\006:\000\000\006J\0079\0079\0079\000\000\006R\000\000\000\000\0079\0079\000\000\0079\0079\000\000\000\000\0079\017\169\017\169\000\000\017\169\000\000\0079\0079\017\169\000\000\000\000\000\000\0079\000\000\0079\000\000\000\000\0079\000\000\0079\r\182\000\000\0079\000Z\000\000\017\169\0079\017\169\0079\000\000\0079\0079\000\000\017\169\017\169\017\169\000\000\017\169\017\169\017\169\000\000\000\000\0079\000\000\0079\0079\0079\000\000\0079\0079\0079\000\000\0079\0079\0079\000Z\0079\0079\0079\000\000\0079\000\000\0079\0079\000\000\000\000\000\000\0079\000\000\0079\000\000\000\000\0079\0079\0079\0079\0079\000\000\0079\0079\000\000\0079\0079\000\000\0079\000\000\0079\000\000\0079\0079\000Z\0079\000\000\000\000\000\000\0079\000\000\0079\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0079\0079\000\000\000\000\000\000\0079\0079\000\000\000\000\000\000\000\000\0079\000\000\000\000\0079\000\000\000\000\0079\000\000\000\000\000\000\002\230\000\000\001\138\000\000\000\000\002\234\000\000\000\000\002\238\0079\000\000\000\000\000\000\000\000\0079\0079\0079\000\000\0079\0079\000\000\0079\0079\000\000\002\246\0079\000\000\002\250\0079\000\000\0079\0079\000\000\003\006\003\n\0079\003\018\000\000\b:\000\000\000\000\000\000\000\000\003\026\000\000\003\030\0079\000\000\000\000\000\000\000\000\0079\0079\000\000\003\"\003&\000\000\000\000\000\000\003*\001\238\003.\000\000\000\000\000\000\0032\0036\000\000\000\000\003:\003>\000\000\000\000\000\000\000\000\000\000\0079\r\202\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003B\0079\014\014\000\000\000\000\003F\000\000\000\000\000\n\0079\014*\000\000\0079\0079\0079\000\000\000\000\003N\0079\0079\000\000\0079\000\000\000\000\0079\000\000\0079\000\000\003R\000\000\0079\0079\0079\0079\0079\000\000\0079\0079\0079\0079\000\000\003V\0079\0079\0079\0079\000\000\003b\000\000\0079\0079\000\000\000\000\0079\0079\0079\003z\0079\000\000\0079\000Z\003j\003r\0079\015^\0079\0079\000\000\000\000\000\000\000\000\0079\000Z\000\000\0079\0079\015r\0079\000\000\0079\000Z\000\000\0079\015\202\000\000\0079\0079\0079\0079\000\000\0079\000\000\0079\0079\0079\015\222\000\000\000\000\0079\0079\0079\000\000\0079\000\000\0079\0079\0079\0079\016\"\000\000\0079\0079\0079\0079\000\000\0079\0079\0079\0079\0079\0079\016>\000\000\0079\0079\0079\0079\0079\0079\0079\0079\0079\0079\0079\000Z\0079\0079\0079\0079\0079\0079\000\000\0079\0079\000\000\0079\000Z\0079\0079\0079\0079\0079\0079\000Z\000\000\0079\000\000\000\000\0079\0079\0079\0079\000\000\0079\0079\000Z\000\000\0079\0079\0079\0079\000\000\0079\0079\0079\000\000\0079\0079\000Z\0079\0079\000\000\000\000\0079\000\000\0079\0079\0079\000\000\0079\0079\000Z\0079\000\000\000\000\0079\0079\0079\0079\0079\000\000\0079\0079\000\000\0079\0079\0079\000\000\0079\0079\000\000\0079\000\000\000\000\0079\000\000\0079\0079\0079\000\000\0079\0079\0079\0079\0079\000\000\000\000\000\000\000\000\0079\0079\0079\000\000\0079\0079\0079\0079\0079\000\000\000\000\000\000\0079\0079\0079\0079\000\000\0079\0079\0079\0079\000\000\000\000\000\000\0079\0079\000\000\0079\000\000\000\000\0079\002\230\0079\001\138\000\000\000\000\002\234\0079\0079\002\238\000\000\000\000\000\000\000\000\000\000\0079\000\000\000\000\000\000\018N\0079\0079\000\000\000\000\000\000\002\246\000\000\000\000\002\250\000\000\000\000\000\000\000\000\000\000\003\006\003\n\000\000\003\018\000\000\000\000\000\000\000\000\000\000\000\000\003\026\000\000\003\030\000\000\000\000\000\000\001\233\000\000\000\000\001\233\000\000\003\"\003&\000\000\000\000\000\000\003*\001\238\003.\000\000\000\000\000\000\0032\0036\000\000\000\000\003:\003>\000\000\000\000\000\000\000\000\001\233\001\233\000\000\000\000\000\000\001\233\000\000\000\000\000\000\001\233\000\000\000\000\003B\000\000\000\000\001\233\000\000\003F\001\233\001\233\000\n\001\233\001\233\000\000\000\000\000\000\000\000\001\233\000\000\003N\000\000\001\233\000\000\000\000\001\233\000\000\001\233\001\233\000\000\000\000\003R\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003V\000\000\000\000\000\000\000\000\000\000\003b\000\000\000\000\000\000\001\233\000\000\001\233\000\000\000\000\003z\000\000\000\000\000\000\000\000\003j\003r\000\000\001\233\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\230\000\000\001\138\000\000\000\000\002\234\000\000\000\000\002\238\000\000\000\000\000\000\000\000\000\000\001\233\0196\000\000\001\233\n\249\000\000\000\000\001\233\000\000\000\000\002\246\000\000\000\000\002\250\000\000\000\000\000\000\000\000\000\000\003\006\003\n\000\000\003\018\000\000\001\233\000\000\001\233\000\000\000\000\003\026\000\000\003\030\019>\001\233\001\233\000\000\001\233\001\233\001\233\000\000\003\"\003&\000\000\000\000\000\000\003*\001\238\003.\000\000\000\000\000\000\0032\0036\000\000\000\000\003:\003>\000\000\000\000\000\000\000\000\000\000\002\230\000\000\001\138\000\000\000\000\002\234\000\000\000\000\002\238\000\000\000\000\003B\000\000\000\000\000\000\000\000\003F\000\000\023z\000\n\000\000\000\000\000\000\000\000\002\246\000\000\000\000\002\250\003N\000\000\000\000\000\000\000\000\003\006\003\n\000\000\003\018\000\000\000\000\003R\000\000\000\000\000\000\003\026\000\000\003\030\000\000\000\000\000\000\000\000\000\000\000\000\003V\000\000\003\"\003&\000\000\000\000\003b\003*\001\238\003.\000\000\000\000\000\000\0032\0036\003z\000\000\003:\003>\0079\003j\003r\000\000\000\000\0079\000\000\000\242\000\000\001\002\0079\000\000\0079\000\000\000\000\000\000\003B\0079\0079\000\000\000\000\003F\000\000\000\000\000\n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003N\000\000\000\000\000\000\000\000\0079\000\000\000\000\000\000\000\000\000\000\003R\000\000\000\000\000\000\000\000\000\000\0079\000\000\000\000\000\000\0079\000\000\000\000\003V\000\000\002\230\000\000\001\138\000\000\003b\002\234\000\000\000\000\002\242\000\000\0079\0079\000\000\003z\000\000\006\134\000\000\000\000\003j\003r\000Z\000\000\000\000\0079\002\246\000\000\000\000\002\250\000\000\000\000\000\000\000\000\0079\003\006\012\146\000\000\003\018\0079\0079\000\000\000\000\000\000\000\000\003\026\000\000\003\030\000\000\0079\000\000\000\000\000\000\0079\000\000\000\000\003\"\003&\000\000\000\000\000\000\003*\001\238\003.\0079\000\000\000\000\0032\0036\000\000\000\000\003:\003>\000\000\0079\000\000\000\000\000\000\000\000\0079\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003B\000\000\000\000\000\000\000\000\003Z\000\000\000\000\000\n\000\000\002\230\000\000\001\138\000\000\000\000\002\234\000\000\003N\002\242\000\000\000\000\000\000\000\000\0079\000\000\000\000\0079\0079\003R\000\000\0079\000\000\000\000\000\000\002\246\0079\0079\002\250\000\000\000\000\0079\003^\000\000\003\006\012\130\000\000\003\018\003b\000\000\000\000\000\000\000\000\000\000\003\026\000\000\003\030\003f\000\000\000\000\000\000\000\000\003j\003r\000\000\003\"\003&\000\000\000\000\000\000\003*\001\238\003.\000\000\000\000\000\000\0032\0036\000\000\000\000\003:\003>\000\000\000\000\000\000\000\000\000\000\002\230\000\000\001\138\000\000\000\000\002\234\000\000\000\000\002\242\000\000\000\000\003B\000\000\000\000\000\000\000\000\003Z\000\000\000\000\000\n\000\000\000\000\000\000\000\000\002\246\000\000\000\000\002\250\003N\000\000\000\000\000\000\000\000\003\006\012j\000\000\003\018\000\000\000\000\003R\000\000\000\000\000\000\003\026\000\000\003\030\000\000\000\000\000\000\000\000\000\000\000\000\003^\000\000\003\"\003&\000\000\000\000\003b\003*\001\238\003.\000\000\000\000\000\000\0032\0036\003f\000\000\003:\003>\000\000\003j\003r\000\000\000\000\002\230\000\000\001\138\000\000\000\000\002\234\000\000\000\000\002\242\000\000\000\000\003B\000\000\000\000\000\000\000\000\003Z\000\000\000\000\000\n\000\000\000\000\000\000\000\000\002\246\000\000\000\000\002\250\003N\000\000\000\000\000\000\000\000\003\006\003J\000\000\003\018\000\000\000\000\003R\000\000\000\000\000\000\003\026\000\000\003\030\000\000\000\000\000\000\000\000\000\000\000\000\003^\000\000\003\"\003&\000\000\000\000\003b\003*\001\238\003.\000\000\000\000\000\000\0032\0036\003f\000\000\003:\003>\0079\003j\003r\000\000\000\000\0079\000\000\005n\000\000\005~\0079\n\241\0079\000\000\000\000\000\000\003B\0079\0079\000\000\0079\003Z\000\000\n\241\000\n\0079\000\000\005\218\000\000\005\234\0079\000\000\0079\003N\n\241\000\000\n\241\0079\0079\000\000\n\241\000\000\000\000\000\000\003R\000\000\n\241\000\000\000\000\000\000\0079\000\000\n\241\000\000\0079\n\241\000\000\003^\0079\n\241\0272\000\000\000\000\003b\000\000\n\241\000\000\000\000\000\000\0079\0079\000\000\003f\000\000\0079\000\000\000\000\003j\003r\000Z\000\000\n\241\0079\000\000\000\000\000\000\000\000\000\000\000\000\0079\0079\0079\000\000\000\000\006\198\000\000\0079\0079\000\000\000Z\000\000\000\000\0079\000\000\000\000\000\000\0079\000\000\000\000\000\000\0079\0079\n\241\000\000\000\000\n\241\0079\0079\000\000\000\000\000\000\0079\000\000\000\000\000\000\000\000\0079\000\000\n\241\000\000\0079\0079\000\000\n\241\n\241\n\241\0079\n\241\n\241\000\000\n\241\0079\000\000\000\000\000\000\000\000\000\000\n\241\000\000\000\000\n\241\0079\000\000\000\000\000\000\000\000\0079\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n\241\000\000\000\000\000\000\0079\n\241\n\241\0079\0079\000\000\000\000\0079\000\000\000\000\000\000\000\000\0079\0079\002\230\000\000\001\138\0079\000\000\002\254\0079\000\000\003\002\0079\0079\000\000\000\000\0079\000\000\000\000\000\000\000\000\0079\0079\000\000\000\000\000\000\0079\002\246\000\000\000\000\002\250\000\000\000\000\000\000\000\000\000\000\003\022\b\006\000\000\003\018\000\000\b\026\000\000\000\000\000\000\000\000\003\026\000\000\003\030\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bB\003&\000\000\000\000\000\000\bF\001\238\003.\000\161\000\000\000\000\bJ\bN\000\000\000\000\bR\003>\000\000\002\230\000\000\001\138\000\000\000\000\002\234\000\000\000\000\002\242\000\000\000\000\000\000\000\000\000\000\000\000\bV\000\161\000\161\000\000\000\000\bZ\000\000\000\000\000\n\002\246\000\000\000\000\002\250\000\000\000\000\000\000\003\238\bb\003\006\b&\000\000\003\018\000\161\000\161\000\000\000\000\000\000\000\000\003\026\000\000\003\030\000\000\000\161\000\000\000\000\003\246\000\000\004\006\000\000\003\"\003&\bf\000\000\000\000\003*\001\238\003.\bn\000\000\000\000\0032\0036\000\000\000\000\003:\003>\br\000\000\000\000\000\000\000\000\bz\003r\000\000\000\161\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003B\000\000\000\000\000\000\000\000\003Z\000\000\000\000\000\n\000\000\000\000\t\222\000\000\000\000\000\000\000\000\000\000\003N\000\000\000\000\000\000\0051\000\000\0051\000\000\000\000\0051\000\000\003R\0051\000\000\000\000\000\161\000\000\000\000\000\000\000\000\000\000\000\000\003\254\000\000\003^\000\000\000\000\000\000\0051\000\000\003b\0051\000\000\000\000\000\000\000\000\000\161\0051\0051\003f\0051\000\000\000\000\000\161\003j\003r\000\000\0051\000\000\0051\000\000\000\161\000\161\000\000\000\000\000\000\000\000\000\000\0051\0051\000\000\000\000\000\000\0051\0051\0051\000\000\000\000\000\000\0051\0051\000\000\000\000\0051\0051\000\000\002\230\000\000\001\138\000\000\000\000\002\234\000\000\000\000\002\242\000\000\000\000\000\000\000\000\000\000\000\000\0051\000\000\000\000\000\000\000\000\0051\000\000\000\000\0051\002\246\000\000\000\000\002\250\000\000\000\000\000\000\000\000\0051\003\006\018:\000\000\003\018\000\000\000\000\000\000\000\000\000\000\000\000\003\026\000\000\003\030\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\"\003&\0051\000\000\000\000\003*\001\238\003.\0051\000\000\000\000\0032\0036\000\000\000\000\003:\003>\0051\000\000\000\000\000\000\000\000\0051\0051\000\000\000\000\000\000\000\000\026J\000\000\000\000\000\000\000\000\003B\000\000\000\000\000\000\000\000\003Z\000\000\026N\000\n\000\000\000\000\000\000\000\000\000\000\028\206\000\000\000\000\003N\026R\000\000\026V\r]\r]\000\000\026Z\000\000\000\000\000\000\003R\000\000\026^\000\000\000\000\000\000\000\000\000\000\026b\000\000\000\000\026j\000\000\003^\000\000\026n\000\000\000\000\000\000\003b\000\000\026r\000\000\000\000\000\000\000\000\000\000\000\000\003f\000\000\000\000\000\000\026J\003j\003r\r]\000\000\026v\000\000\000\000\000\000\000\000\000\000\000\000\026N\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\026R\000\000\026V\000\000\000\000\000\000\026Z\000\000\000\000\r1\000\000\r]\026^\026z\000\000\000\000\026~\000\000\026b\000\000\000\000\026j\000\000\000\000\000\000\026n\000\000\027\218\000\000\026\130\000\000\026r\000\000\000\000\026\134\000\n\026\138\000\000\026\142\026\146\000\000\026\150\029J\028^\000\000\r1\000\000\026v\026\154\000\000\000\000\026\158\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\026\162\000\000\000\000\000\000\0079\026\166\026\170\r]\000\000\0079\r1\000\000\026z\000\226\0079\026~\0079\000\000\000\000\000\000\000\000\0079\0079\000\000\000\000\000\000\000\000\000\000\026\130\000\000\000\000\000\000\000\000\026\134\000\n\026\138\0079\026\142\026\146\000\000\026\150\0079\0079\0079\000\000\000\246\0079\026\154\0079\000\000\026\158\000\000\001:\0079\0079\0079\000\000\0079\0079\000\000\0079\0079\0079\000\000\000\000\026\162\001V\0079\000\000\0079\026\166\026\170\r1\0079\0079\0079\0079\000\000\007\206\000\000\000\000\0079\000\000\000Z\000\000\005^\0079\0079\0079\0079\0079\000\000\0079\0079\0079\0079\005r\0079\005\202\0079\0079\0079\000\000\000\000\0079\0079\0079\0079\0079\000\000\0079\0079\0079\0079\0079\000Z\000\000\005\222\0079\000\000\0079\000\000\000Z\000\000\000\000\0079\0079\0079\000\000\000\000\0079\012\198\0079\0079\0079\0079\000Z\0079\000\000\0079\0079\0079\0079\0079\000\000\0079\0079\0079\0079\0079\000\000\006\"\0079\0079\0079\000Z\0079\0079\0079\0079\0079\000\000\0079\0079\0079\000\000\000Z\0079\000Z\0079\000\000\0079\0079\0079\0079\000\000\0079\0079\0079\0079\0079\006>\0079\0079\0079\0079\0079\000Z\0079\0079\0079\000\000\0079\0079\000\000\0079\0079\0079\000\000\0079\000\000\000\000\000\000\000\000\0079\0079\000\000\0079\0079\0079\0079\0079\0079\000\000\0079\0079\0079\0079\0079\0079\0079\000Z\0079\0079\0079\0079\0079\000\000\000\000\0079\0079\000\000\000\000\0079\000\000\000\000\000\000\000\000\0079\0079\000\000\0079\0079\0079\0079\0079\000\000\000\000\0079\0079\000\000\000Z\0079\000\000\0079\000\000\0079\0079\0079\0079\0079\0079\0079\0079\000\000\0079\000\000\000\000\0079\0079\0079\0079\000\000\0079\000\000\0079\000\000\0079\0079\000\000\0079\0079\0079\000\000\0079\000\000\000\000\000\000\000\000\0079\0079\000\000\000\000\0079\0079\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0079\000\000\000\000\000\000\000\000\0079\000\000\000\000\0079\000\000\000\000\0079\0079\019j\000\000\0079\019r\000\000\000\000\000\000\0079\0079\000\000\000\000\000\000\0079\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0079\019\130\019\138\0079\0079\000\000\002=\0079\000\000\000\000\002=\000\000\0079\0079\000\000\000\000\019\146\0079\000\000\002=\002=\000\000\019\154\019\162\000\000\000\000\000\000\0015\002=\000\000\0015\000\000\019\170\000\000\000\000\019\178\000\000\019\186\002=\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\230\004\014\000\000\000\000\000\000\0015\000\000\000\000\000\000\0015\000\000\019\194\000\000\002=\000\000\003\238\000\000\000\000\0015\0015\000\000\0015\0015\000\000\002=\000\000\000\000\0015\000\000\000\000\000\000\004\022\000\000\000\000\003\246\000\000\004\006\0015\000\000\000\000\000R\000V\000f\000\194\000\000\000\198\000\000\000\202\000\210\000\218\0016\019\202\001F\001N\002=\001v\000\000\001~\019\210\001\134\002j\002r\002v\004\030\000\000\0015\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002=\0015\002=\002~\000\000\000\000\000\000\000\000\000\000\002=\002=\000\000\019\218\019\226\002=\000\000\000\000\000\000\000\000\000\000\002\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004&\000\000\000\000\0015\000\000\000\000\000\000\003\254\000\000\000\000\000\000\000\000\002\150\001\029\000\000\000\000\001\029\000\000\031\250\000\000\000\000\000\000\000\000\000\000\0015\000\000\0015\002\154\000\000\000\000\000\000\031\238\007\022\0015\0015\000\000\0015\004.\0015\001\029\001\029\000\000\000\000\000\000\001\029\000\000\000\000\000\000\001\029\007\026\000\000\000\000\000\000\000\000\003\238\000\000\000\000\001\029\001\029\000\000\001\029\001\029\000\000\000\000\000\000\001\025\001\029\000\000\001\025\000\000\001\029\000\000\000\000\003\246\000\000\004\006\001\029\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\025\001\025\000\000\000\000\000\000\001\025\000\000\000\000\000\000\001\025\000\000\001\029\000\000\001\029\000\000\003\238\000\000\000\000\001\025\001\025\000\000\001\025\001\025\000\000\001\029\n9\000\000\001\025\000\000\000\000\000\000\001\025\000\000\000\000\003\246\000\000\004\006\001\025\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\029\000\000\000\000\001\029\000\000\000\000\000\000\003\254\000\000\000\000\000\000\000\000\001\025\000\000\001\025\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\029\001\025\001\029\000\000\000\000\000\000\000\000\000\000\000\000\001\029\001\029\000\000\001\029\001\029\001\029\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\025\000\000\000\000\001\025\000\000\000\000\000\000\003\254\000\000\000\000\000\000\000\000\000\000\001\017\000\000\000\000\001\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\025\000\000\001\025\000\000\000\000\000\000\000\000\000\000\000\000\001\025\001\025\000\000\001\025\001\025\001\025\001\017\001\017\000\000\000\000\000\000\001\017\000\000\000\000\000\000\001\017\000\000\000\000\000\000\000\000\000\000\001\017\000\000\000\000\001\017\001\017\000\000\001\017\001\017\000\000\000\000\000\000\004\134\001\017\000\000\001=\000\000\001\017\000\000\000\000\003\246\000\000\001\017\001\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\230\004\014\000\000\000\000\000\000\001=\000\000\000\000\000\000\001=\000\000\001\017\000\000\001\017\000\000\003\238\000\000\000\000\001=\001=\000\000\001=\004\142\000\000\001\017\000\000\000\000\001=\000\000\000\000\000\000\004\022\000\000\000\000\003\246\000\000\004\006\001=\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\017\000\000\000\000\001\017\000\000\000\000\000\000\003\254\000\000\000\000\000\000\000\000\004\030\000\000\001=\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\017\001=\001\017\000\000\000\000\000\000\000\000\000\000\000\000\001\017\001\017\000\000\001\017\001\017\001\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004&\000\000\000\000\001=\000\000\000\000\000\000\003\254\000\000\000\000\000\000\000\000\000\000\004\134\000\000\000\000\0011\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001=\000\000\001=\000\000\000\000\000\000\000\000\000\000\000\000\001=\001=\000\000\004\150\004.\001=\003\230\004\014\000\000\000\000\000\000\0011\000\000\000\000\000\000\0011\000\000\000\000\000\000\000\000\000\000\003\238\000\000\000\000\0011\0011\000\000\0011\0011\000\000\000\000\000\000\001)\0011\000\000\001)\000\000\004\022\000\000\000\000\003\246\000\000\004\006\0011\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\230\004\014\000\000\000\000\000\000\001)\000\000\000\000\000\000\001)\000\000\004\030\000\000\0011\000\000\003\238\000\000\000\000\001)\001)\000\000\001)\001)\000\000\0011\000\000\000\000\001)\000\000\000\000\000\000\001)\000\000\000\000\003\246\000\000\004\006\001)\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004&\000\000\000\000\0011\000\000\000\000\000\000\003\254\000\000\000\000\000\000\000\000\004\030\000\000\001)\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0011\001)\0011\000\000\000\000\000\000\000\000\000\000\000\000\0011\0011\000\000\0011\004.\0011\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001)\000\000\000\000\001)\000\000\000\000\000\000\003\254\000\000\000\000\000\000\000\000\000\000\001\021\000\000\000\000\001\021\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001)\000\000\001)\000\000\000\000\000\000\000\000\000\000\000\000\001)\001)\000\000\001)\001)\001)\001\021\001\021\000\000\000\000\000\000\001\021\000\000\000\000\000\000\001\021\000\000\000\000\000\000\000\000\000\000\001\021\000\000\000\000\001\021\001\021\000\000\001\021\001\021\000\000\000\000\000\000\001!\001\021\000\000\001!\000\000\001\021\000\000\000\000\003\246\000\000\001\021\001\021\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\230\004\014\000\000\000\000\000\000\001!\000\000\000\000\000\000\001!\000\000\001\021\000\000\001\021\000\000\003\238\000\000\000\000\001!\001!\000\000\001!\001!\000\000\001\021\000\000\000\000\001!\000\000\000\000\000\000\001!\000\000\000\000\003\246\000\000\004\006\001!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\021\000\000\000\000\001\021\000\000\000\000\000\000\003\254\000\000\000\000\000\000\000\000\001!\000\000\001!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\021\001!\001\021\000\000\000\000\000\000\000\000\000\000\000\000\001\021\001\021\000\000\001\021\001\021\001\021\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001!\000\000\000\000\001!\000\000\000\000\000\000\003\254\000\000\000\000\000\000\000\000\000\000\001%\000\000\000\000\001%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001!\000\000\001!\000\000\000\000\000\000\000\000\000\000\000\000\001!\001!\000\000\001!\001!\001!\003\230\004\014\000\000\000\000\000\000\001%\000\000\000\000\000\000\001%\000\000\000\000\000\000\000\000\000\000\003\238\000\000\000\000\001%\001%\000\000\001%\001%\000\000\000\000\000\000\004\134\001%\000\000\0019\000\000\001%\000\000\000\000\003\246\000\000\004\006\001%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\230\004\014\000\153\000\000\000\000\0019\000\000\000\000\000\000\0019\000\000\004\030\000\000\001%\000\000\003\238\000\000\000\000\0019\0019\000\000\0019\004\142\000\000\001%\000\000\000\000\0019\000\153\000\153\000\000\004\022\000\000\000\000\003\246\000\000\004\006\0019\000\000\000\000\000\000\000\000\000\000\000\153\000\000\000\000\000\000\000\000\000\000\000\153\000\153\001%\000\000\000\000\001%\000\000\000\000\000\000\003\254\000\153\000\000\000\000\003\246\004\030\000\153\0019\004\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001%\0019\001%\000\000\000\000\000\000\000\000\000\000\000\000\001%\001%\000\000\001%\001%\001%\000\000\000\153\003\230\004\014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004&\000\000\000\000\0019\003\238\000\000\000\000\003\254\000\000\000\000\000\197\004\142\000\000\001-\000\000\000\000\001-\000\000\000\000\000\000\004\022\000\000\000\000\003\246\0019\004\006\0019\000\000\000\153\000\000\000\000\000\000\000\000\0019\0019\003\254\0019\004.\0019\003\230\004\014\000\000\000\000\000\000\001-\000\000\000\000\000\000\001-\000\153\000\000\000\000\004\030\000\000\003\238\000\000\000\153\001-\001-\000\000\001-\001-\000\000\000\000\000\153\000\153\001-\000\000\000\000\000\000\004\022\000\000\0296\003\246\029>\004\006\001-\000\000\000\000\000\000\000\000\000\000\000\000\029F\000\000\000\000\000\000\000\000\029f\000\000\000\000\000\000\004&\000\000\000\000\026N\000\000\000\000\000\000\003\254\000\000\000\000\004\030\000\000\001-\000\000\026R\000\000\026V\000\000\000\000\000\000\026Z\000\197\000\000\001-\000\000\000\000\026^\000\000\000\197\000\000\000\000\000\000\026b\000\000\000\000\026j\004\150\004.\000\000\026n\000\000\000\000\000\000\000\000\000\000\026r\000\000\000\000\000\000\000\000\004&\000\000\000\000\001-\000\000\000\000\000\000\003\254\000\000\000\000\000\000\026v\029n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001-\000\000\001-\000\000\017u\000\000\000\000\017u\000\000\001-\001-\000\000\001-\001-\001-\000\000\000\000\000\000\026z\000\000\000\000\026~\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017u\017u\000\000\000\000\026\130\000\000\000\000\000\000\b\146\026\134\000\n\026\138\000\000\026\142\026\146\017u\026\150\000\000\000\000\017u\000\000\017u\017u\026\154\000\000\b\154\026\158\000\000\t\158\000\000\000\000\017u\000\000\000\000\017u\000\000\017u\000\000\000\000\000\000\000\000\026\162\000\000\000\000\000\000\000\000\026\166\026\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\230\000\000\001\138\000\000\000\000\b\030\017u\000\000\b\"\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\246\000\000\t\170\000\000\000\000\000\000\000\000\000\000\000\000\n\002\n\014\000\000\000\000\000\000\n\"\000\000\000\000\000\000\000\000\003\026\000\000\003\030\017u\017u\000\000\017u\000\000\t\174\000\000\017u\nR\003&\000\000\000\000\000\000\n^\001\238\003.\t\182\000\000\000\000\nf\nj\017u\000\000\nn\000\000\017u\017u\000\000\000\000\000\000\000\000\000\000\017u\000\000\000\000\000\000\017u\017u\000\000\000\000\nr\nv\000\000\000\000\000\000\000\000\nz\000\000\000\000\000\n\000\000\002\230\000\000\001\138\000\000\000\000\0182\000\000\n\130\0186\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\246\000\000\000\000\000\000\000\000\000\000\000\000\n\158\000\000\018\162\018\142\000\000\000\000\n\166\019\234\000\000\000\000\000\000\000\000\003\026\000\000\003\030\n\170\000\000\000\000\000\000\000\000\n\178\003r\000\000\018\166\003&\000\000\000\000\000\000\018\170\001\238\003.\000\000\000\000\000\000\018\174\018\178\000\000\026J\018\182\000\000\000\000\000\000\000\000\000\000\000\000\026J\000\000\000\000\000\000\026N\000\000\000\000\000\000\000\000\000\000\nr\018\186\026N\000\000\000\000\026R\018\190\026V\000\000\000\n\000\000\026Z\000\000\026R\000\000\026V\000\000\026^\018\198\026Z\000\000\000\000\000\000\026b\000\000\026^\026j\000\000\000\000\000\000\026n\026b\000\000\000\000\026j\000\000\026r\000\000\026n\000\000\000\000\000\000\018\202\000\000\026r\000\000\000\000\027\214\018\210\000\000\000\000\000\000\026v\000\000\000\000\028\166\000\000\018\214\000\000\000\000\026v\000\000\018\222\003r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\r1\000\000\026z\000\000\000\000\026~\000\000\000\000\r1\000\000\026z\000\000\000\000\026~\000\000\000\000\000\000\000\000\026\130\000\000\000\000\000\000\000\000\026\134\000\n\026\138\026\130\026\142\026\146\000\000\026\150\026\134\000\n\026\138\000\000\026\142\026\146\026\154\026\150\000\000\026\158\000\000\026J\000\000\000\000\026\154\000\000\000\000\026\158\000\000\000\000\000\000\000\000\000\000\026N\026\162\000\000\000\000\000\000\000\000\026\166\026\170\r1\026\162\000\000\026R\000\000\026V\026\166\026\170\r1\026Z\000\000\000\000\000\000\000\000\000\000\026^\000\000\000\000\000\000\000\000\000\000\026b\000\000\000\000\026j\000\000\000\000\000\000\026n\t\173\000\000\000\000\000\000\000\000\026r\000\000\000\000\000\000\000\000\000\000\000\000\t\173\000\000\000\000\000\000\029\014\000\000\000\000\000\000\000\000\026v\000\000\t\173\000\000\t\173\000\000\000\000\000\000\t\173\000\000\000\000\000\000\000\000\000\000\t\173\000\000\000\000\000\000\000\000\000\000\t\173\000\000\000\000\t\173\000\000\000\000\000\000\t\173\000\000\r1\000\000\026z\000\000\t\173\026~\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\026\130\000\000\t\173\029n\000\000\026\134\000\n\026\138\000\000\026\142\026\146\000\000\026\150\000\000\000\000\000\000\000\000\000\000\000\000\026\154\000\000\000\000\026\158\000\000\000\000\000\000\000\000\000\000\b)\000\000\000\000\000\000\000\000\t\173\000\000\000\000\t\173\026\162\000\000\000\000\b)\000\000\026\166\026\170\r1\000\000\000\000\000\000\000\000\t\173\000\000\b)\000\000\b)\t\173\t\173\t\173\b)\t\173\t\173\000\000\t\173\000\000\b)\000\000\000\000\000\000\000\000\t\173\b)\000\000\t\173\b)\000\000\000\000\000\000\b)\027\186\000\000\000\000\000\000\000\000\b)\000\000\000\000\000\000\t\173\000\000\000\000\026N\000\000\t\173\t\173\030v\000\000\000\000\000\000\000\000\b)\000\000\026R\000\000\026V\000\000\000\000\000\000\026Z\000\000\000\000\000\000\000\000\000\000\026^\000\000\000\000\000\000\000\000\000\000\026b\000\000\000\000\026j\000\000\000\000\000\000\026n\000\000\000\000\000\000\b)\000\000\026r\b)\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b)\000\000\026v\027\210\000\000\b)\b)\b)\000\000\b)\b)\000\000\b)\000\000\000\000\026N\000\000\000\000\000\000\b)\000\000\000\000\b)\000\000\000\000\000\000\026R\000\000\026V\000\000\000\000\000\000\026Z\026z\000\000\000\000\026~\b)\026^\000\000\000\000\000\000\b)\b)\026b\000\000\000\000\026j\000\000\026\130\000\000\026n\026J\000\000\026\134\000\n\026\138\026r\026\142\026\146\000\000\026\150\000\000\000\000\026N\000\000\000\000\000\000\026\154\000\000\000\000\026\158\000\000\026v\000\000\026R\000\000\026V\000\000\000\000\000\000\026Z\000\000\000\000\000\000\000\000\026\162\026^\000\000\000\000\000\000\026\166\026\170\026b\000\000\000\000\026j\000\000\000\000\000\000\026n\000\000\000\000\000\000\026z\000\000\026r\026~\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\026\130\000\000\028\138\028\162\000\000\026\134\000\n\026\138\000\000\026\142\026\146\000\000\026\150\000\000\000\000\026N\000\000\000\000\000\000\026\154\000\000\000\000\026\158\000\000\000\000\000\000\026R\000\000\026V\000\000\000\000\000\000\026Z\026z\000\000\000\000\026~\026\162\026^\000\000\000\000\000\000\026\166\026\170\026b\000\000\000\000\026j\000\000\026\130\000\000\026n\029\n\000\000\026\134\000\n\026\138\026r\026\142\026\146\000\000\026\150\000\000\000\000\026N\000\000\000\000\000\000\026\154\000\000\000\000\026\158\000\000\026v\000\000\026R\000\000\026V\000\000\000\000\000\000\026Z\000\000\000\000\000\000\000\000\026\162\026^\000\000\000\000\000\000\026\166\026\170\026b\000\000\000\000\026j\000\000\000\000\000\000\026n\000\000\000\000\000\000\026z\000\000\026r\026~\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\026\130\000\000\026v\026J\000\000\026\134\000\n\026\138\000\000\026\142\026\146\000\000\026\150\000\000\000\000\026N\000\000\000\000\000\000\026\154\000\000\000\000\026\158\000\000\000\000\000\000\026R\000\000\026V\000\000\000\000\000\000\026Z\026z\000\000\000\000\026~\026\162\026^\000\000\000\000\000\000\026\166\026\170\026b\000\000\000\000\026j\000\000\026\130\000\000\026n\026J\000\000\026\134\000\n\026\138\026r\026\142\026\146\000\000\026\150\000\000\000\000\026N\000\000\000\000\000\000\026\154\000\000\000\000\026\158\000\000\030B\000\000\026R\000\000\026V\000\000\000\000\000\000\026Z\000\000\000\000\000\000\000\000\026\162\026^\000\000\000\000\000\000\026\166\026\170\000\000\000\000\000\000\026j\000\000\000\000\000\000\026n\000\000\000\000\000\000\026z\000\000\026r\026~\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\026\130\000\000\026v\000\000\000\000\026\134\000\n\026\138\000\000\026\142\026\146\000\000\026\150\000\000\000\000\000\000\000\000\000\000\000\000\026\154\000\000\000\000\026\158\000\000\000\000\017\141\000\000\000\000\017\141\000\000\000\000\000\000\000\000\026z\000\000\000\000\026~\026\162\000\000\000\000\000\000\000\000\026\166\026\170\000\000\000\000\000\000\000\000\000\000\026\130\000\000\017\141\017\141\000\000\026\134\030n\026\138\000\000\026\142\026\146\000\000\026\150\000\000\000\000\000\000\000\000\017\141\000\000\026\154\000\000\017\141\026\158\017\141\017\141\000\225\000\000\000\000\000\225\000\000\000\000\b:\000\000\017\141\000\000\000\000\017\141\026\162\017\141\000\000\000\000\000\000\026\166\026\170\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\225\000\225\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\141\003\238\000\000\000\000\000\000\000\225\000\000\000\225\000\225\000\000\000\000\000\221\000\000\000\000\000\221\000\000\000\000\000\225\000\000\000\000\003\246\000\000\004\006\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\221\000\221\000\000\017\141\017\141\000\000\017\141\000\000\000\000\000\000\017\141\000\000\000\225\000\000\000\000\003\238\000\000\000\000\000\000\000\221\000\000\000\221\000\221\000\213\017\141\000\000\000\213\000\000\017\141\017\141\000\000\000\221\000\000\000\000\003\246\017\141\004\006\000\000\000\000\017\141\017\141\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\213\000\213\000\000\000\225\000\000\000\000\000\225\000\000\000\000\000\000\003\254\000\000\000\000\000\000\000\221\000\213\000\000\000\000\000\000\000\213\000\000\000\213\000\213\000\000\000\225\000\000\000\000\000\000\000\225\000\225\000\000\000\213\000\000\000\000\003\246\000\000\000\213\000\000\000\000\000\225\000\225\000\000\000\000\000\000\000\000\000\000\000\000\004\134\000\000\000\000\001\001\000\000\000\000\000\000\000\221\000\000\000\000\000\221\000\000\000\000\000\000\003\254\000\000\000\213\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\230\004\014\000\221\000\000\000\000\000\000\000\221\000\221\000\000\000\000\000\000\000\000\000\000\004\134\000\000\003\238\000\245\000\221\000\221\001\001\000\000\001\001\004\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\213\004\022\000\000\000\213\003\246\000\000\004\006\003\254\000\000\003\230\004\014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\213\000\000\000\000\003\238\000\213\000\213\000\000\000\245\000\000\000\245\000\245\000\000\004\030\000\000\000\000\000\213\000\213\000\000\000\000\004\022\000\000\000\000\003\246\000\000\004\006\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\237\000\000\000\000\000\237\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\030\004&\000\000\000\000\001\001\000\000\000\000\000\000\003\254\000\000\003\230\004\014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\001\000\000\000\000\003\238\001\001\001\001\000\000\000\237\000\000\000\237\000\237\000\217\000\000\000\000\000\217\004\150\004.\000\000\004&\000\237\000\000\000\245\003\246\000\000\004\006\003\254\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\217\000\217\000\245\000\000\000\000\000\000\000\245\000\245\000\000\000\000\000\000\000\000\000\000\000\000\004\030\000\217\000\000\000\245\004.\000\217\000\000\000\217\000\217\000\000\000\229\000\000\000\000\000\229\000\000\000\000\000\000\000\217\000\000\000\000\003\246\000\000\000\217\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\230\004\014\000\000\000\000\000\237\000\000\000\000\000\237\000\000\000\000\000\000\003\254\000\000\000\217\000\000\003\238\000\000\000\000\000\000\000\229\000\233\000\229\000\229\000\233\000\000\000\237\000\000\000\000\000\000\000\237\000\237\000\229\000\000\000\000\003\246\000\000\004\006\000\000\000\000\000\000\000\237\000\237\000\000\000\000\000\000\000\000\003\230\004\014\000\000\000\000\000\000\000\000\000\000\000\217\000\000\000\000\000\217\000\000\000\000\000\000\003\254\003\238\000\000\000\229\000\000\000\233\000\000\000\233\000\233\000\000\004\134\000\000\000\000\000\253\000\217\000\000\000\000\000\233\000\217\000\217\003\246\000\000\004\006\000\000\000\000\000\000\000\000\000\000\000\000\000\217\000\217\000\000\000\000\000\000\000\000\000\000\003\230\004\014\000\000\000\000\000\000\000\000\000\000\000\229\000\000\000\000\000\229\000\000\000\000\004\030\003\254\003\238\000\000\000\000\000\000\000\253\000\241\000\253\004\142\000\241\000\000\000\000\000\000\000\000\000\229\000\000\000\000\004\022\000\229\000\229\003\246\000\000\004\006\000\000\000\000\000\000\000\000\000\000\000\000\000\229\000\229\000\000\003\230\004\014\000\000\000\000\000\000\000\000\000\000\000\233\000\000\000\000\000\233\000\000\000\000\000\000\003\254\003\238\000\000\004\030\000\000\000\241\000\000\000\241\000\241\000\000\004\134\000\000\000\000\000\000\000\233\000\000\000\000\004\022\000\233\000\233\003\246\000\000\004\006\000\000\000\000\000\000\000\000\000\000\000\000\000\233\000\233\000\000\000\000\000\000\000\000\000\000\003\230\004\014\000\000\000\000\000\000\000\000\000\000\004&\000\000\000\000\000\253\000\000\000\000\004\030\003\254\003\238\000\000\000\000\000\000\000\000\000\177\000\185\000\185\000\000\000\157\000\000\000\000\000\000\000\253\000\000\000\000\004\022\000\253\000\253\003\246\000\000\004\006\000\000\000\000\000\000\000\000\000\000\000\000\000\253\004.\000\000\003\230\004\014\000\000\000\000\000\157\000\157\000\000\004&\000\000\000\000\000\241\000\000\000\000\000\000\003\254\003\238\000\000\004\030\000\000\000\157\000\000\000\177\000\177\000\000\000\169\000\157\000\157\000\000\000\241\000\000\000\000\000\177\000\241\000\241\003\246\000\157\004\006\000\000\003\246\000\000\000\157\000\000\000\000\000\241\000\241\000\000\000\000\000\000\000\000\000\173\003\230\004\014\000\000\000\000\000\000\000\000\000\000\004&\000\000\000\000\000\000\000\000\000\000\004\030\003\254\003\238\000\000\000\157\000\000\000\000\000\000\000\169\000\169\000\000\000\000\003\230\004\014\000\000\000\185\000\000\000\000\000\169\000\000\000\000\003\246\000\185\004\006\000\000\000\000\000\000\003\238\000\000\000\000\000\185\004.\000\000\000\173\000\173\000\000\000\000\000\000\000\000\000\000\000\177\000\000\000\000\000\173\000\157\000\000\003\246\003\254\004\006\000\000\000\169\003\254\004\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\177\000\000\000\000\000\000\000\157\000\000\000\000\000\177\000\000\000\000\000\000\000\157\000\000\000\000\004\030\000\177\000\177\003\230\004\014\000\157\000\157\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\169\000\000\000\000\003\238\000\000\000\000\000\000\003\254\000\181\000\193\004\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\022\000\000\000\169\003\246\000\000\004\006\000\173\000\000\000\000\000\169\000\000\000\000\000\000\003\254\000\000\003\230\004\014\000\169\000\169\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\173\000\000\000\000\003\238\000\000\004\030\000\000\000\173\000\000\000\181\000\181\000\000\000\000\000\000\000\000\000\173\000\173\000\000\000\000\004\022\000\000\000\000\003\246\000\000\004\006\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004&\000\000\000\000\000\000\000\000\000\000\004\030\003\254\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\193\000\000\000\000\000\000\000\000\000\000\000\000\000\193\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\193\004.\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004&\000\000\000\000\000\000\000\000\000\000\000\000\003\254\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\181\000\000\000\000\000\000\000\000\000\000\000\000\000\181\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\181\000\181"))
   
   let lhs =
-    (16, "\000\012\000\011\000\n\000\t\000\b\000\007\000\006\000\005\000\004\000\003\000\002\000\001\000\000\0012\0012\0012\0011\0011\0011\0011\0010\0010\0010\0010\0010\0010\0010\0010\0010\0010\0010\0010\0010\0010\0010\001/\001/\001/\001/\001/\001/\001/\001/\001/\001/\001/\001/\001/\001/\001/\001.\001.\001.\001.\001.\001.\001.\001.\001.\001.\001.\001.\001.\001.\001.\001-\001-\001-\001-\001-\001-\001-\001-\001-\001-\001-\001-\001-\001-\001-\001,\001,\001,\001,\001,\001,\001,\001,\001,\001,\001,\001,\001,\001,\001+\001+\001+\001+\001*\001)\001)\001)\001(\001(\001(\001'\001'\001'\001&\001&\001&\001%\001$\001#\001\"\001\"\001!\001!\001 \001 \001\031\001\031\001\030\001\030\001\029\001\028\001\027\001\026\001\025\001\024\001\023\001\022\001\021\001\020\001\019\001\018\001\017\001\016\001\015\001\014\001\014\001\r\001\r\001\012\001\012\001\011\001\011\001\n\001\n\001\n\001\n\001\t\001\t\001\t\001\t\001\b\001\b\001\b\001\b\001\007\001\007\001\007\001\007\001\006\001\006\001\006\001\006\001\005\001\005\001\005\001\005\001\004\001\004\001\004\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\003\001\002\001\001\001\000\001\000\001\000\001\000\001\000\000\255\000\255\000\254\000\253\000\252\000\252\000\252\000\252\000\251\000\251\000\251\000\251\000\250\000\250\000\250\000\250\000\250\000\250\000\250\000\250\000\250\000\250\000\250\000\250\000\250\000\250\000\250\000\250\000\250\000\250\000\250\000\250\000\250\000\250\000\249\000\248\000\248\000\247\000\247\000\247\000\247\000\247\000\247\000\247\000\247\000\246\000\246\000\245\000\245\000\245\000\244\000\243\000\242\000\242\000\241\000\241\000\240\000\239\000\238\000\238\000\237\000\237\000\236\000\236\000\235\000\235\000\234\000\233\000\232\000\232\000\231\000\231\000\230\000\230\000\229\000\229\000\228\000\228\000\227\000\226\000\226\000\225\000\225\000\225\000\225\000\225\000\225\000\224\000\224\000\224\000\223\000\222\000\221\000\221\000\221\000\221\000\220\000\220\000\219\000\218\000\218\000\218\000\217\000\217\000\217\000\217\000\217\000\216\000\216\000\216\000\216\000\215\000\215\000\215\000\215\000\214\000\214\000\214\000\214\000\213\000\212\000\212\000\211\000\211\000\211\000\210\000\209\000\209\000\209\000\208\000\207\000\207\000\206\000\206\000\206\000\205\000\205\000\205\000\204\000\204\000\204\000\204\000\203\000\203\000\202\000\202\000\202\000\202\000\202\000\202\000\201\000\201\000\201\000\200\000\200\000\200\000\200\000\200\000\200\000\199\000\198\000\197\000\197\000\196\000\196\000\195\000\195\000\194\000\194\000\193\000\193\000\192\000\192\000\191\000\191\000\191\000\191\000\191\000\191\000\191\000\191\000\190\000\189\000\188\000\188\000\187\000\187\000\186\000\186\000\185\000\185\000\184\000\184\000\183\000\183\000\182\000\182\000\181\000\181\000\180\000\180\000\179\000\179\000\178\000\178\000\177\000\177\000\176\000\176\000\175\000\175\000\174\000\174\000\173\000\173\000\172\000\172\000\171\000\171\000\170\000\170\000\169\000\169\000\168\000\168\000\167\000\167\000\166\000\166\000\165\000\165\000\164\000\164\000\163\000\163\000\162\000\162\000\161\000\161\000\160\000\160\000\159\000\159\000\158\000\158\000\157\000\157\000\156\000\156\000\156\000\155\000\155\000\154\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\153\000\152\000\152\000\152\000\152\000\151\000\150\000\149\000\148\000\147\000\146\000\145\000\144\000\143\000\142\000\141\000\140\000\139\000\139\000\139\000\138\000\138\000\138\000\137\000\137\000\137\000\137\000\136\000\135\000\134\000\133\000\132\000\131\000\130\000\129\000\128\000\127\000\127\000~\000~\000~\000}\000}\000|\000|\000|\000{\000{\000{\000z\000y\000y\000y\000x\000w\000w\000v\000v\000v\000v\000v\000v\000v\000u\000u\000u\000u\000u\000u\000u\000t\000t\000t\000t\000t\000t\000t\000s\000s\000s\000s\000s\000s\000s\000r\000r\000r\000r\000r\000r\000r\000q\000q\000q\000q\000q\000q\000q\000p\000p\000o\000o\000n\000n\000m\000m\000l\000l\000k\000k\000j\000j\000i\000i\000i\000i\000i\000i\000i\000i\000i\000i\000i\000i\000i\000i\000i\000i\000i\000i\000i\000i\000i\000h\000h\000g\000g\000f\000f\000e\000e\000d\000d\000c\000c\000b\000b\000a\000a\000a\000a\000a\000`\000`\000_\000_\000_\000_\000^\000]\000\\\000\\\000\\\000[\000[\000[\000Z\000Z\000Z\000Z\000Z\000Z\000Y\000Y\000Y\000Y\000Y\000Y\000Y\000Y\000X\000X\000X\000X\000X\000X\000X\000X\000W\000W\000W\000W\000W\000W\000W\000W\000V\000V\000V\000V\000V\000V\000V\000V\000U\000U\000T\000T\000S\000S\000S\000S\000S\000S\000S\000S\000S\000S\000S\000S\000S\000S\000R\000R\000R\000R\000R\000R\000R\000R\000R\000R\000R\000R\000R\000R\000Q\000Q\000Q\000Q\000Q\000Q\000Q\000Q\000Q\000Q\000Q\000Q\000Q\000Q\000P\000P\000P\000P\000P\000P\000P\000P\000P\000P\000P\000P\000P\000P\000O\000O\000O\000O\000O\000N\000M\000M\000M\000M\000M\000M\000M\000M\000M\000M\000M\000M\000M\000M\000M\000M\000M\000M\000M\000M\000M\000M\000M\000L\000L\000L\000K\000J\000I\000H\000H\000G\000G\000F\000E\000E\000D\000D\000D\000C\000C\000B\000B\000A\000@\000@\000@\000@\000@\000@\000@\000?\000?\000?\000?\000?\000?\000?\000>\000>\000>\000>\000>\000=\000=\000<\000<\000<\000<\000<\000;\000;\000:\000:\0009\0009\0008\0008\0007\0007\0006\0006\0005\0005\0004\0004\0003\0003\0002\0002\0001\0001\0000\0000\000/\000/\000.\000.\000-\000-\000,\000,\000+\000+\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000)\000)\000)\000(\000(\000(\000(\000'\000'\000&\000%\000%\000%\000$\000$\000$\000$\000$\000$\000$\000$\000#\000#\000\"\000\"\000!\000 \000\031\000\031\000\031\000\031\000\030\000\030\000\030\000\029\000\029\000\028\000\028\000\028\000\027\000\027\000\027\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\025\000\025\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\023\000\023\000\023\000\022\000\022\000\022\000\022\000\022\000\022\000\022\000\021\000\021\000\021\000\021\000\021\000\021\000\021\000\020\000\020\000\020\000\020\000\020\000\020\000\020\000\019\000\019\000\019\000\019\000\019\000\019\000\019\000\018\000\018\000\018\000\018\000\018\000\018\000\018\000\017\000\017\000\017\000\017\000\017\000\016\000\016\000\015\000\014\000\014\000\014\000\014\000\014\000\r")
+    (16, "\000\012\000\011\000\n\000\t\000\b\000\007\000\006\000\005\000\004\000\003\000\002\000\001\000\000\0013\0013\0013\0012\0012\0012\0012\0011\0011\0011\0011\0011\0011\0011\0011\0011\0011\0011\0011\0011\0011\0011\0010\0010\0010\0010\0010\0010\0010\0010\0010\0010\0010\0010\0010\0010\0010\001/\001/\001/\001/\001/\001/\001/\001/\001/\001/\001/\001/\001/\001/\001/\001.\001.\001.\001.\001.\001.\001.\001.\001.\001.\001.\001.\001.\001.\001.\001-\001-\001-\001-\001-\001-\001-\001-\001-\001-\001-\001-\001-\001-\001,\001,\001,\001,\001+\001*\001*\001*\001)\001)\001)\001(\001(\001(\001'\001'\001'\001&\001%\001$\001#\001#\001\"\001\"\001!\001!\001 \001 \001\031\001\031\001\030\001\029\001\028\001\027\001\026\001\025\001\024\001\023\001\022\001\021\001\020\001\019\001\018\001\017\001\016\001\015\001\015\001\014\001\014\001\r\001\r\001\012\001\012\001\011\001\011\001\011\001\011\001\n\001\n\001\n\001\n\001\t\001\t\001\t\001\t\001\b\001\b\001\b\001\b\001\007\001\007\001\007\001\007\001\006\001\006\001\006\001\006\001\005\001\005\001\005\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\004\001\003\001\002\001\001\001\001\001\001\001\001\001\001\001\000\001\000\000\255\000\254\000\253\000\253\000\253\000\253\000\252\000\252\000\252\000\252\000\251\000\251\000\251\000\251\000\251\000\251\000\251\000\251\000\251\000\251\000\251\000\251\000\251\000\251\000\251\000\251\000\251\000\251\000\251\000\251\000\251\000\251\000\250\000\249\000\249\000\248\000\248\000\248\000\248\000\248\000\248\000\248\000\248\000\247\000\247\000\246\000\246\000\246\000\245\000\244\000\243\000\243\000\242\000\242\000\241\000\240\000\239\000\239\000\238\000\238\000\237\000\237\000\236\000\236\000\235\000\234\000\233\000\233\000\232\000\232\000\231\000\231\000\230\000\230\000\229\000\229\000\228\000\227\000\227\000\226\000\226\000\226\000\226\000\226\000\226\000\225\000\225\000\225\000\224\000\223\000\222\000\222\000\222\000\222\000\221\000\221\000\220\000\219\000\219\000\219\000\218\000\218\000\218\000\218\000\218\000\217\000\217\000\217\000\217\000\216\000\216\000\216\000\216\000\215\000\215\000\215\000\215\000\214\000\213\000\213\000\212\000\212\000\212\000\211\000\210\000\210\000\210\000\209\000\208\000\208\000\207\000\207\000\207\000\206\000\206\000\206\000\205\000\205\000\205\000\205\000\204\000\204\000\203\000\203\000\203\000\203\000\203\000\203\000\202\000\202\000\202\000\201\000\201\000\201\000\201\000\201\000\201\000\201\000\200\000\199\000\198\000\198\000\197\000\197\000\196\000\196\000\195\000\195\000\194\000\194\000\193\000\193\000\192\000\192\000\192\000\192\000\192\000\192\000\192\000\192\000\191\000\190\000\189\000\189\000\188\000\188\000\187\000\187\000\186\000\186\000\185\000\185\000\184\000\184\000\183\000\183\000\182\000\182\000\181\000\181\000\180\000\180\000\179\000\179\000\178\000\178\000\177\000\177\000\176\000\176\000\175\000\175\000\174\000\174\000\173\000\173\000\172\000\172\000\171\000\171\000\170\000\170\000\169\000\169\000\168\000\168\000\167\000\167\000\166\000\166\000\165\000\165\000\164\000\164\000\163\000\163\000\162\000\162\000\161\000\161\000\160\000\160\000\159\000\159\000\158\000\158\000\157\000\157\000\157\000\156\000\156\000\155\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\154\000\153\000\153\000\153\000\153\000\152\000\151\000\150\000\149\000\148\000\147\000\146\000\145\000\144\000\143\000\142\000\141\000\140\000\140\000\140\000\139\000\139\000\139\000\138\000\138\000\138\000\138\000\137\000\136\000\135\000\134\000\133\000\132\000\131\000\130\000\129\000\128\000\128\000\127\000\127\000\127\000~\000~\000}\000}\000}\000|\000|\000|\000{\000{\000z\000y\000y\000y\000x\000w\000w\000v\000v\000v\000v\000v\000v\000v\000u\000u\000u\000u\000u\000u\000u\000t\000t\000t\000t\000t\000t\000t\000s\000s\000s\000s\000s\000s\000s\000r\000r\000r\000r\000r\000r\000r\000q\000q\000q\000q\000q\000q\000q\000p\000p\000o\000o\000n\000n\000m\000m\000l\000l\000k\000k\000j\000j\000i\000i\000i\000i\000i\000i\000i\000i\000i\000i\000i\000i\000i\000i\000i\000i\000i\000i\000i\000i\000i\000h\000h\000g\000g\000f\000f\000e\000e\000d\000d\000c\000c\000b\000b\000a\000a\000a\000a\000a\000`\000`\000_\000_\000_\000_\000^\000]\000\\\000\\\000\\\000[\000[\000[\000Z\000Z\000Z\000Z\000Z\000Z\000Y\000Y\000Y\000Y\000Y\000Y\000Y\000Y\000X\000X\000X\000X\000X\000X\000X\000X\000W\000W\000W\000W\000W\000W\000W\000W\000V\000V\000V\000V\000V\000V\000V\000V\000U\000U\000T\000T\000S\000S\000S\000S\000S\000S\000S\000S\000S\000S\000S\000S\000S\000S\000R\000R\000R\000R\000R\000R\000R\000R\000R\000R\000R\000R\000R\000R\000Q\000Q\000Q\000Q\000Q\000Q\000Q\000Q\000Q\000Q\000Q\000Q\000Q\000Q\000P\000P\000P\000P\000P\000P\000P\000P\000P\000P\000P\000P\000P\000P\000O\000O\000O\000O\000O\000N\000M\000M\000M\000M\000M\000M\000M\000M\000M\000M\000M\000M\000M\000M\000M\000M\000M\000M\000M\000M\000M\000M\000M\000L\000L\000L\000K\000J\000I\000H\000H\000G\000G\000F\000E\000E\000D\000D\000D\000C\000C\000B\000B\000A\000@\000@\000@\000@\000@\000@\000@\000?\000?\000?\000?\000?\000?\000?\000>\000>\000>\000>\000>\000=\000=\000<\000<\000<\000<\000<\000;\000;\000:\000:\0009\0009\0008\0008\0007\0007\0006\0006\0005\0005\0004\0004\0003\0003\0002\0002\0001\0001\0000\0000\000/\000/\000.\000.\000-\000-\000,\000,\000+\000+\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000*\000)\000)\000)\000(\000(\000(\000(\000'\000'\000&\000%\000%\000%\000$\000$\000$\000$\000$\000$\000$\000$\000#\000#\000\"\000\"\000!\000 \000\031\000\031\000\031\000\031\000\030\000\030\000\030\000\029\000\029\000\028\000\028\000\028\000\027\000\027\000\027\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\025\000\025\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\023\000\023\000\023\000\022\000\022\000\022\000\022\000\022\000\022\000\022\000\021\000\021\000\021\000\021\000\021\000\021\000\021\000\020\000\020\000\020\000\020\000\020\000\020\000\020\000\019\000\019\000\019\000\019\000\019\000\019\000\019\000\018\000\018\000\018\000\018\000\018\000\018\000\018\000\017\000\017\000\017\000\017\000\017\000\016\000\016\000\015\000\014\000\014\000\014\000\014\000\014\000\r")
   
   let goto =
-    ((16, "\001G\000\186\000\000\000\000\000\000\000%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001g\000\000\001u\001\n\000\000\001e\000\215\000\000\000\000\000\000\000m\000!\000\000\000\000\000,\000\166\001\002\000\000\000\000\001L\000\000\000\000\001\\\000\000\001\212\000\000\000\000\000\000\002Z\000\000\002h\000\000\000\000\000\000\002x\000\000\002\234\000\000\000\000\002\254\003b\000\000\000\000\003x\003\166\003\196\000\000\000\000\003\218\000\000\000\000\003\226\000\000\004\000\000\000\000\000\000\000\004\n\000\000\004.\000\000\004\150\004\226\000\000\000\000\005\018\000\000\005\136\005\146\005\162\000\000\000\000\006\018\000\000\006\024\000\000\000\000\0066\000\000\006:\000\000\000Z\000\000\002\164\003\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\197\003\128\000\000\000s\000\000\000\000\004\242\000\000\000\000\000\152\000\000\000\000\000\000\001f\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\168\000\000\000\000\000\246\t\022\000\000\000\000\026\224\000\000\000\000\000\000\000\000\007<\000\000\007F\t\148\000\000\007`\000\000\000\000\007j\000\000\000\000\007\164\000\000\007\192\000\000\000\000\000\000\007\236\000\000\000\214\b\006\0028\000\000\000\150\000\000\000\000\000\000\003\242\000\000\002\228\000\000\000\000\000\000\012\236\000\000\000\000\b\144\000\2530\244\000\000\000\000\003\154\005\202\000\000\026\136\000\000\b\162!\016\t\174,\016&\240,h\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\r\218\011\192\000\000\000\000\019t\024\022\028\188\000\000\030d\000\142\000\000\000\000-\154\031\204\000\000\000\000\000\000\004l\000\000\015\024,h:B\000\000\000\000\0128\000\000\003$\000\000\0056\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\198\000\000\000\000\b\192\000\000\016\222\000\000\017^\000\000\026\200\000\000\027@\000\000\"\018\000\000$X\000\000%\156\000\000)\152\000\00000\000\0008 \000\000\000\007\000\000\000\000\000\000\000\000\022\002\000\000\000\000\000\000\000\0002h\000\0007\000\000\000FF\000\000I8\000\000K\024\000\000KH\000\000K\148\000\000K\220\000\000K\234\000\000K\250\000\000LB\000\000L\164\000\000L\242\000\000M\006\000\000M\132\000\000M\162\000\000\005\172\000\000\000\000\b\006\000\000\000\000\000\000\000\000\011\022\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\160C\000\000\000\002j\000\000\000\000\002\166\002\184\000\000\002l\b \000\000\000\000\bJ\b\200\000\000\000\000\t6\t@\tH\000\000\000\000\tr\000\000\000\000\t\154\000\000\t\172\000\000\000\000\000\000\t\182\000\000\t\202\000\000\t\244\000\000\t\252\000\000\000\000\n\024\n0\000\000\000\000\n2\nF\nJ\000\000\000\000\nR\000\000\000\000\nT\000\000\nj\000\000\000\000\000\000\nl\000\000\nr\000\000\nt\nv\000\000\000\000\n\134\000\000\n\138\n\144\n\148\000\000\000\000\n\152\000\000\n\156\000\000\000\000\n\168\000\000\n\202\000\000\004\146\011\166\000\000\n\208\000\000\n\212\014\020\000\000\n\216\000\000\000\000\n\218\000\000\n\220\000\000\n\224\000\000\000\000\000\000\n\228\000\000\n\236\002\238\000\000\000\000\000\000\n\238\000\000\011\138\000\000\000\000\016&\r\156\000\000\0048\000\000\b\182\000\000\000\000\020@\005\198\000\000\000\000\000\000\000\000\000\023\0068\000\000\007x\000\000\000\000\000\000\016>\000\000\018\022\000\000\026\002\000\000\000\000\000\000\000\000\000\000\000\000\027J\000\000\000\000\000\161\000\000\001\178\000\000\000\000\000\000\017`\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002l\b\022\003d\000\000\n\244\000\000\n\248\005t\000\000\n\250\000\000\000\000\000\000\t\004\000\000\000\000\000\000\000\000\003\028\000\000\000\000\025n\000\000\000\000\000\000\000\t74\000\000 \1702\138\000\000\000\000\000\000\000\0007\1969\220\000\000\000\0002\220\000\000\000\000\000\000\007\1347\206C<\000\000C\162\000\000\000\000\000\0008^\021\176\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \254\000\000\000\000\000\000\000\000\016*8\178\023\170\000\000\"\240\000\000\000\000#D\000\000\004\244\000\000\000\000\r\182\000\000\000\000\000\000\024\208\000\000,\150\007T\000\000\000\000\000\000\000\000\000\000\000\000\000\000'\136\000\000\000\000\000\000\018\1943j+B\000\000\000\0000\"\000\000\005\204\000\000\019\220\000\000\000\000\000\000\025<\000\000-.\000\000\029\242\000\000%x\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000M\190\000\000:\148\000\000\028f\000\000M\204\000\000M\236\000\000N\144\000\000N\148\000\000N\176\000\000N\248\000\000O`\000\000Ox\000\000O\170\000\000O\198\000\000PN\000\000Pj\000\000P\132\000\000\000\0003\158\000\000C\198\000\000\000\000\000\000\025P\000\000\000\000\000\000\000\000\000\000\000\0004t\000\000\000\000\000\000\000\000D\150\000\000\000\000\000\000\025\156\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0002\000\000 \220\000\000\000\181\000\000\000\000\000\000P\152\000\000P\234\000\000QB\000\000QR\000\000Q\168\000\000Q\170\000\000Q\246\000\000R\\\000\000R\190\000\000R\220\000\000R\234\000\000R\250\000\000S\020\000\000S\148\000\000\000\000\000\000\000\000\000\000#\"\000\000\000\000\022\194>\216\000\000\000\000D\022\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0030\000\000\000\000\000\000\000\000\000\145\000\000\000\000E\148\000\000\000\000\000\000\tZ\001h\000\000\000\000\000\000\000\000\000\000Vv\000\0005,\000\000\000\000\000\000\000\000\000\0005L\000\000\000\000\000\0005\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\002\000\000\011\004\007\200\000\000\011&\000\000\000\000\003\200\015\212\000\000\004\172\000\000\000\000\000\000\000\000\0048\000\000\0112\000\000\000\000\001g\003\158\000\000\t\132\000\000\000\000\000\000\001\006\000\000\017\014\000\160\011J\000\000\000\000\011R\011X\000\000\000\000\011Z\011\\\011x\000\000\000\000\011\130\000\000\000\000\011\138\000\000\011\154\000\000\000\000\000\000\011\160\000\000\011\178\000\000\011\182\000\000\011\188\000\000\000\000\011\194\011\206\000\000\000\000\011\210\011\216\012\004\000\000\000\000\012\n\000\000\000\000\012\014\000\000\012\018\000\000\000\000\000\000\012\"\000\000\012$\000\000\012&\012(\000\000\000\000\012*\000\000\0120\0122\0128\000\000\000\000\012<\000\000\012D\000\000\000\000\012H\000\000\012L\000\000\006\152\019T\000\000\012P\000\000\012X\022R\000\000\012x\000\000\000\000\012|\000\000\012\140\000\000\012\156\000\000\000\000\000\000\012\162\000\000\001\140\000\000\000\000\000\000\005\146\001\138\000\000\000\000\006\202\000\000\000\000\012\168\015\134\000\000\012\170\000\000\000\000\000\000\005.\000\000\000\000\000\000\004F\000\000\000\000\000\000\000\000\000\000\012z\015\224\000\000\012\174\000\000\012\192\018\028\000\000\012\210\000\000\000\000\014\016\012\228\000\000\000\000\012\238\012\246\000\000\000\000\012\250\r\000\r\n\000\000\000\000\r\016\000\000\000\000\r\018\000\000\r2\000\000\000\000\000\000\r4\000\000\r8\000\000\rV\000\000\rX\000\000\000\000\r^\rd\000\000\000\000\rl\rt\r\134\000\000\000\000\r\138\000\000\000\000\r\140\000\000\r\144\000\000\000\000\000\000\r\146\000\000\r\148\000\000\r\150\r\164\000\000\000\000\r\172\000\000\r\180\r\188\r\196\000\000\000\000\r\200\000\000\r\212\000\000\000\000\r\214\000\000\r\216\000\000\006\198\024x\000\000\r\226\000\000\r\232\025\216\000\000\r\244\000\000\000\000\r\246\000\000\r\252\000\000\014\000\000\000\000\000\000\000\014\026\000\000\014*\019`\000\000\0142\000\000\000\000\017V\020\254\000\000\0144\000\000\0146\0232\000\000\014:\000\000\000\000\000\000\000\000\000\000\000\000\000\000E\168\000\000-\250\000\000\000\000\000\000E\208\000\000\000\000\n\128\000\000\000\000\000\000\000\024\t\016\000\000\000\000:*\000\000\000\000\016\n\000\000\000\000\000\000\000\000\t\154\000\000\011\004\000\000\000\000\0314\000\000\000\000\000\000:\190\000\000\000\000\000\000\000\000\000\000%\246\000\000\000\000\000\000\000\253\000\000:\230\000\000\000\000\000\000\000\000\004\168\012\132\000\000;\016\000\000\000\000\000\000\000\000\0142\000\000;\244\000\000\000\000\000\000\000\000\001\"\000\000\b\250\000\000\000\0001<5\230\000\000\000\000\000\000Fb\000\000\000\000\000\000\001\140\000\000Fd\000\000\000\000\000\000F\184\000\000\000\000\004\"\000\000\031\216\000\0276:\000\000\000\000\000\000\006>\015f\000\000\000\000\000\000\000\000\000\000\000\0003\218\000\000\000\0004\162\000\000\000\000=\200\000\000\b6\000\000\020\006\000\000\000\000\000\000\026V\000\000-\200\000\000\000\000Gr\000\000\000\000\000\000\027\156\000\000\000\000\000\000\000\000\000\000\000\000(0\000\000(\228\000\000\000\000\000\000\007\138\000\000\000\000\000\000\000\000\000\000\000\000S\188\000\000;\200\000\000K(\000\000S\242\000\000T\006\000\000T<\000\000TX\000\000T\162\000\000T\214\000\000T\216\000\000T\250\000\000UV\000\000U\144\000\000U\236\000\000V\016\000\000V4\000\0009\138\000\000\000\000\000\000\004\134\000\000\006&\000\000\017\214\002D\n\140\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000G\166\000\000.\194\002\248\027\252\000\000\000\000\000\000< \000\000<\226\000\000=\002\000\000/\002/\198\r\196\b\238\000\000\b\002\012\222\000\000\000\000\000\000\012\232\000\000\000\000\018\168\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000H4\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000/\218\000\0000\206\000\000\000\000\000\000\018\162\000\000\000\000\007\198\000\000\000\000\000\000 \140\000\142\000\000!@\000\000\000\000\000\000\000\000\004\026\000\000\000\000\019j\000\000\"\030\000\000\000\0000\140\000\000\000\000\000\000=L\000\000\000\000\012D\000\000\000\000\012 \000\000\000\000+\002\000\000\000\000\000\000=\158\000\000\000\000\000\000+\200\000\000\000\000\000\000\000\000>Z\000\000\000\000\000\000\000\000\004\184\015\228\000\000>\172\000\000\000\000\000\000\000\000\000\000\000\000\020 \000\000\000\000\005\142\000\000\021\026\000\000\012D\000\000\000\000\007\178\005\n\000\000\007\188\000\000\000\000\000\000\000\000\007\138\000\0001\180\000\000\"\210\000%#\134\000\000\000\246\000\000\021\178\000\000\022~\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000$d\006\146%\024\000\000\000\000\000\000\007\148\000\000\023\134\000\000\b~\000\000\000\000\r\224\000M%\204\000\000\003J\000\000\024R&\170\000\000\000\000\024\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\220\011\012\000\000\t \000\000\000\000\000\000\000\000\005\236\000\000\025Z\000\000\000\000\000\000\011\240Hv\000\000\000\000\000\000\t\222\000\000\000\000\000\000\000\000\000\000\000\148\015T\000\000\000\000?h\000\000\000\000\014\196\000\000\018\222\000\000\000\000,\240\000\000\000\000\000\000?\130\000\000\000\000\000\000\000\000?\224\000\000\000\000\006\184\022f\000\000\000\000@>\000\000\000\000\t\200+N\000\000\023l\000\000\000\000@\148\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0001\216\000\000\000\000\000\000@\182\000\000\000\000\004<\000\000\000\000\024$\000\000\000\000-\254\000\000\000\000\000\000A2\000\000\000\000\000\000\000\000A\212\000\000\000\000\bL\024.\000\000\000\000BH\000\000\000\000\t\232\000\000\000\000\000\000\000\000\004<\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\158\000\000\026b\000\000\000\000\000\000H\202\000\000\012\158\000\000\000\000\000\000\003n\000\000\020\132\000\000\000\000\005\144\026\248\000\000\028\000\000\000\000\000\000\000\005\192\000\000H\238\006\192I<\000\000I\138\000\000\000\000\000\000\007\020\000\000J \007D\000\000\000\000)z6\012\000\000\b\144*.\000\000\000\000*\226\000\000\000\000\000\000\b\216\000\000JP\b\232\000\000\000\000\020\234\t&\029^\000\000$\016\000\000\000\000\000\000\t\\\000\000J\218\t\128\000\000\000\000\000\000\001\021\000\000\001\020\000\000\000\000\000\000\000\000\000\029\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\146\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0007\000\000\000\000\n\238\000\000\015\020\000\000\000\000\000\000\015\028\000\000\000\000\000\000\000\000\000\000\011\026\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015 \000\000\000\000\015\014\000\000\012\128\000\000\000\000\014\146\000\000\001`\014\170\004\238\000\000\000\000\005\178\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005h\002\236\000\000\000\000\tR\000\000\000\000\000\000\014\254\000\000\000\000\019\244\023j\000\000\000\000\000\000\000\000\023\240\024\152\000\015\000\000\000\000\000\000\024\166\000\000\000\000\000\000\000\000\000\000\000\000\001\178\000\000\000\000\t\030\000\000\000\000\014n\000\000\027F\000\000\000\000\000\000\000b\000\000\000\000\017\250\000\000\000o\000\000\000\000\000\000\000\000\n\236\027\164\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003x\028\158\000\000\000\000\000\000\000\000\028\236\028\246\002\226\000\000\030\"\000\000\000\000\000\000\000\000\000\000\000\000\005~\000\000\015V\000\000\000\000\000\000\018~\000\000\003l\000\000\000\000\000\000\012\188\000\000\000\000\030\214\031\190\006\\\000\000 \"\000\000\000\000\000\000\000\000\000\000\000\000\000\210\014\134\000\000\014\140\000\000 r\007 \000\000!^\000\000\000\000\000\000\000\000\014\150\000\000\015\030\000\000\000\000\000\000\006\196\000\000\000f\014\226\005D\000\000\000\000\000\000\000\r\005\142\000\000\000\000\000\000\000\000\000\000\007\206\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003b\000\000\000\000\002\194\000\000\t\136\015\130\005(\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\234\000\000\000\000\018T\"h\000\000\000\000\000\000\000\000\"\232\000\000\000\000\007:\000\000\007\146\012\162\000\000\000\000\000\000\021N\000\000\000\000\000\000\000\000\000\000\000\220\022.\000\000\000\000\023&\000\000\000\000\000\000\000\000\005\154\000\000\000\000\001*\000\000\000\000\000\000\006\184\000\000\000\000\000W\000\000\000\000\000\000\000\000\000\000\000\000\000\000B\154\000\000\000\000\000\000\001\224\000\000\000\000\000\000\000\000\000\000\000\026\0004\011\172\012\192\000\000\006\146\007\174\tr\t\140\000\000\000\000\000\000\000\000\000\000\000\000\br\028\222\000\000'^\007b\000\000\000\000\n\132\000\000\029\146\000\0009\188\000\000\000\000\b\214\030F\000\000(\018\000\000\b\220(\198\000\000\000\000\000\000\011&\017&\000\000\000\000\000\000\000\000\006\014\000\000\007p\000B\000\000\000\000\000\204\018\236\000\000\019\152\000\000\000\000\016>\000\000\018\022\000\000\000\000\022\184\000\000\000\000\000\000\000\000\000\000\000\000\000\000\r\030\000\000\000\000\000\000\011\018\000\000\030\250\000\000\r\224\015@\000\000\000\000\000\000\000\000\000\000\005J\000\000\000\000\000\000\000\000\000\000B\174\000\000\000y\000\000\000\000\000\000\000\000\000\000\000\178\000\000\014J\001\186\015\000\000\000\002\196\016B\000\000\006l\000\000\004V\000\000\004\214\000\000\006h\000\000\r\224\000\000\000\000\000\000\000\000\000\000\006\232\000\000\t\130\000\000\bz\000\000\r\224\015\182\000\000\000U\000\000\015\160\bj\000\000\014T\000\000\014X\000\000\000\000\000\000\000\000\000\000\000\000\014\\\000\000\014`\000\000\014d\000\000\000\000\000\000\000\000\000\000\014n\000\000\000\000\000\000\000\000\000\000\015\214\014\146\000\000\000\000\014\202\000\000\000\000\014\158\t\146\016$\000\000\0164\000\000\000\000\002b\004H\000\000\014\236\000\000\000\000\015$\000\000\000\000\000\000\000\000\000\000\000\000\016\026\014\204\000\000\000\000\000\000\015\004\014\212\n\028\007\166\015\004\015@\000\000\000\000\014\226\nN\b\156\015\018\015L\000\000\000\000\011\018\016<\000\000\016D\000\000\016j\000\000\000\000\016J\000\000\000\000\016P\000\000\000\000\000\000\000\000\016^\000\000\016\130\000\000\000\000\000\000\016\148\000\000\000\000\000\000\016\150\000\000\000\000\000\000"), (16, "\002;\003B\000\018\005\184\004\179\006\131\004\198\007d\000\025\000\129\000\129\007\021\007\022\002X\000\231\006\192\002Y\003D\000\r\000\235\006\170\b\132\000\174\005\153\000\174\000\017\002;\004M\005\151\005\127\004\179\b\"\004\198\006\167\b#\000\007\b\133\000p\002;\007\233\000\016\000\017\002<\007\023\006\168\007\234\002=\000\174\000\174\006\171\006\186\006\187\006\193\007\235\007\024\005M\004{\006\168\000\129\003$\000\005\000\174\006\171\006\186\006\187\005N\007\199\004\181\000\174\006\241\006\186\006\187\007f\004\182\000\130\000\130\000r\002Z\000p\000\024\000\225\004N\004{\002[\000\129\007m\000\233\005\194\0056\000h\001\186\005N\002\182\004\181\003\n\001\227\007\181\007\182\007\007\004\182\005J\b'\002;\002\174\003\183\001\223\004\179\002>\004\198\000\174\000\174\0030\005K\002?\0056\003\193\001\206\000q\007\186\002e\000\239\b(\007\b\000\130\000\174\007\011\006\186\006\187\006\188\007\235\b)\005M\000\030\005\198\007\150\004\203\000h\000\174\001H\0058\007\249\006\188\000\174\005\226\000\183\003\193\000\004\b\005\006\188\000\130\007\237\007n\001\186\001\186\000i\002\181\007W\006\242\004{\007\189\007s\006\194\007o\007p\005\153\0058\003\011\005N\000\174\004\181\000\029\000\005\001\224\007\238\005:\004\182\007\189\002\176\b\141\b<\007X\007[\006\186\006\187\007t\004\195\007w\006\186\006\187\005?\0056\000\004\000\129\000\240\005O\005\161\004\196\005\200\005\165\007l\005:\000i\000\240\000\240\006\188\002f\000\241\002\178\000&\b\001\005\147\004\195\004\249\004\250\001M\005?\000\005\0036\001\224\000\240\005O\007\239\004\196\002\171\007q\002\213\001H\007\172\000l\007\160\007\240\000\240\000\174\000\174\002\172\005A\b\014\005\128\000\242\005\159\000\129\0058\005W\007\210\000\231\001\207\005\182\b=\001\208\000\232\001\230\000\149\000\174\001O\005w\004\207\001S\000\130\001H\006\189\006\188\005A\b+\005R\b\016\006\188\007\163\001\017\005W\000#\002\181\004Y\b\018\004\208\006\251\000l\005:\000\220\004\209\004s\005w\004\207\004\210\002\243\006\214\007\201\000\244\004\195\004\211\007\252\001\018\005?\007\253\001S\001\019\000\240\005O\b>\004\196\004\208\001S\000\246\000w\002;\004\209\000\130\007\240\004\179\004\210\004\198\000\225\003E\b@\002\183\004\211\000\"\000\233\b:\000y\000\174\001\179\001\180\0039\001\184\007\025\000\174\007r\003D\002\184\006F\004M\005\151\005\127\005\232\0038\006\215\005\156\005A\007\174\005R\bB\005\249\001\237\003\167\005W\001\238\003\r\003\204\bD\000\141\000\239\000h\000%\000\183\003\171\003\169\005w\004\207\007\252\004{\000(\007\253\001\186\006>\b\004\000y\001P\002;\005N\001S\004\181\004\179\000\b\004\198\001S\004\208\004\182\003\204\007\191\001\250\004\209\007\192\007\132\000\174\004\210\000\131\007\166\000\144\001\186\000\174\004\211\0056\003=\002;\007\235\b.\005\127\004\179\000h\004\198\001S\007\196\001\225\007v\000\132\000\174\001\179\001\180\003'\001\184\000\174\001\179\001\180\001\181\001\184\000\129\000i\006\135\003\011\000\231\000*\000\129\005\139\004{\000\237\002X\006\222\007t\002_\007w\006\186\006\187\005N\000\240\004\181\006H\000\241\005\166\004\203\000\183\004\182\001H\0058\001M\000\183\006\241\006\186\006\187\001\186\b9\006\223\006\186\006\187\001\186\000\145\0056\003\172\003\172\002\174\007\189\004\181\000h\005\184\000i\001S\001S\004\182\bv\000\242\000\174\001\179\001\180\001\240\001\184\000\129\001\255\006\252\005:\000\222\003!\000\130\0056\001N\007s\001S\000\225\000\130\000.\004\195\002Z\000l\000\233\005?\007\007\0000\002[\000\240\005O\000\174\004\196\006\255\005\168\0004\000\183\007\021\007\022\0058\007t\006\188\007w\006\186\006\187\001\186\005\147\002\001\001\224\000\248\007\b\000h\001\187\007\011\006\186\006\187\005\145\006\188\000\239\000i\000\249\004\203\006\188\003*\002e\0058\007$\001\255\000j\0075\000l\005A\000\130\005\128\005:\005\159\001\190\000\225\005W\005\187\007\024\b}\005\182\000\226\001\237\004\195\000h\005Q\000h\005?\005w\004\207\0006\000\240\005O\b4\004\196\000\134\000\146\005K\005:\002;\000;\003\186\007\240\004\179\002\000\004\198\000\137\004\208\005@\004\195\000h\000y\004\209\005?\000i\000\239\004\210\000\240\0068\006\188\004\196\000\174\004\211\003\188\004\249\004\250\007\235\b.\005\127\000\129\006\188\000l\bu\005A\005\147\005\128\001\187\b6\001R\000\240\005W\001\187\000\241\0033\b8\000\240\001S\003\189\002f\000i\000:\000i\005w\004\207\006I\004{\001\186\000\005\000m\005A\001\190\000C\001\238\002;\005N\001\190\004\181\004\179\001\237\004\198\001\238\004\208\004\182\001\237\000\242\000i\004\209\000h\000\129\004\207\004\210\b3\0035\006\226\000@\000\174\004\211\0056\000l\002;\007\235\b.\005\127\004\179\000\130\004\198\004t\004\208\000\240\000?\001\187\000\241\004\209\000\243\005x\001\186\004\210\001\255\002l\001\255\000B\000\129\004\211\001\186\000E\000\231\006\207\003\186\005\141\004{\000\237\000o\000\244\000l\001\190\000l\002m\001<\005N\000G\004\181\003\000\001\237\000\242\000K\002o\004\182\000\246\0058\003\190\007\130\002p\000i\000\130\000\004\b5\002\001\007\150\002\001\000l\007\031\0056\000M\003?\002\174\007d\004\181\0033\003\193\006\207\006H\001S\004\182\003\189\000\174\001\179\001\180\001\245\001\184\000\005\000\129\005\133\001\186\005:\000\231\004\252\000\130\0056\001\249\000\237\000\133\000\225\0070\005K\004\195\000\129\000\129\000\233\005?\000\222\003\029\005l\000\240\005O\b4\004\196\0034\007e\000\183\007W\b\026\b\027\0058\007\240\000Q\000\174\0071\001\186\006=\005@\0074\006\186\006\187\000\184\006\210\004l\000l\006\208\005\209\000h\007f\000\239\001\161\007X\007[\006\186\006\187\007\158\0058\001\235\005K\006#\004\249\004\250\005A\000\130\005\128\005:\b6\000\228\000\225\005W\000P\000\129\0069\b8\000\233\004\179\004\195\004\180\000\130\000\130\005?\005w\004\207\000\225\000\240\005O\b4\004\196\006\208\000\226\000\174\005:\002;\006;\000S\007\240\004\179\b\031\004\198\002:\004\208\005@\004\195\003\173\001\203\004\209\005?\007\168\000\239\004\210\000\240\001\231\000i\004\196\000\174\004\211\000\129\006\188\000\134\007\235\b.\005\127\b+\000\239\000h\001\206\005A\005@\005\128\000\137\b6\006\188\000\240\005W\000y\000\241\000\130\b8\004\181\000\129\007\204\005\171\003\175\006\208\004\182\005w\004\207\006R\004{\006\241\006\186\006\187\005A\000]\001\238\007\189\002;\005N\000X\004\181\004\179\001\203\004\198\006T\004\208\004\182\000W\000\242\001\226\004\209\006\211\006U\004\207\004\210\b7\007g\007Z\b1\000\174\004\211\0056\000\130\001\206\007\235\b.\005\127\000l\006T\005\250\000i\004\208\000\240\001\187\003\191\000\241\004\209\000\243\001\186\007z\004\210\007X\007[\006\186\006\187\000\130\004\211\000\240\002W\007\150\000\241\000\129\004\251\004{\007^\002X\000\244\001\190\002_\003\204\003\193\000\245\005N\000Z\004\181\001\237\000\\\000\242\000\136\006\188\004\182\000\246\0058\000\174\007\216\007s\000\129\0076\007>\b?\002<\000_\000\242\000a\002=\0056\005K\000\174\006\241\006\186\006\187\000\174\007j\007\242\007\169\001\207\000\243\004\195\001\208\007t\003\173\007w\006\186\006\187\000l\000\240\001S\005:\004\196\004\249\004\250\005\171\007d\007\176\007\177\000\244\000\130\b\r\004\195\002Z\001;\006\188\005?\007\204\006;\002[\000\240\005O\b4\004\196\000\246\000\174\001\179\001\180\003,\001\184\0058\007\240\000h\003\174\000\129\000\130\006\\\005@\000\231\002>\006\165\006\166\000h\000\237\003\149\002?\001\207\005\173\007i\001\208\002\161\007\208\006^\007\249\001\243\002e\001\203\001S\000\129\000\183\b\006\006\188\005A\001\205\005\128\005:\b6\004\026\001\186\005W\007M\007f\000\134\b8\006\188\007\153\004\195\001\206\006_\004\247\005?\005w\004\207\000\137\000\240\005O\b4\004\196\000y\004\249\004\250\001\238\002;\001M\006^\007\240\004\179\000i\004\198\000\130\004\208\005@\006b\000h\000\225\004\209\000\148\000i\005\142\004\210\000\233\000\154\000\129\005\142\000\174\004\211\000\222\003\023\006^\007\235\b.\005\127\000h\000\130\000\153\006)\005A\000\129\005\128\000\156\b6\000\231\004\206\005W\001\186\b\137\000\232\b8\000\240\004\249\004\250\002f\004\249\004\250\000\239\005w\004\207\005\144\004{\b_\000h\005\179\005\143\006\194\005E\002\171\002;\005N\000\159\004\181\004\179\000h\004\198\000\240\004\208\004\182\002\172\000h\000i\004\209\000h\005\029\000\161\004\210\bC\b\007\005\176\000\130\000\174\004\211\0056\000l\000\225\004M\005\151\005\127\003\204\000i\000\226\002j\005\181\002k\000\130\007\207\000\165\007\156\000\174\000\225\007g\001S\b\b\002l\007\252\000\233\000\129\007\253\001\207\003<\002X\001\208\004O\002_\004{\001S\005\179\000i\b}\001S\006\254\002m\001U\005N\000\239\004\181\002n\001\187\000i\000\240\002o\004\182\000\241\0058\000i\000h\002p\000i\000h\000\239\002\145\006\225\007\212\001Z\000l\007\204\0056\002\237\000\129\000\174\007}\001\190\000\231\004\178\b+\005\180\005%\000\235\007\204\001\237\b\144\005!\005\203\000l\000\242\006\223\006\186\006\187\005:\006m\000\174\000\130\000\129\001\249\002Z\000\140\004\179\002\254\004\198\004\195\002[\004O\007~\005?\007\127\006o\005$\000\240\005O\b4\004\196\005\029\007\226\000\243\000\174\007\231\005\203\0058\007\240\005\225\000i\005\205\000l\000i\005@\006p\001Y\000\240\000l\bA\000\241\000l\000\244\000\130\006s\007\128\002e\001>\000\225\bb\001\015\006o\000\240\006\000\000\233\000\241\007\129\000\246\006\003\005A\006^\005\128\005:\b6\000\184\005\204\005W\006\t\000\145\004\181\b8\b}\000\242\004\195\006\188\004\182\006{\005?\005w\004\207\003%\000\240\005O\000\184\004\196\006A\005\165\000\242\000\239\002;\006\n\001b\006}\004\179\006\012\004\198\001_\004\208\005@\001\193\001^\007\219\004\209\006~\000l\000\174\004\210\000l\006/\005\030\004M\000\174\004\211\005K\bs\000\134\004M\005\151\005\127\006}\006\129\001a\000\184\005A\006/\005\128\000\137\005\159\000\184\000\240\005W\000y\002f\0062\005_\000\248\006^\004\203\001\251\004{\001H\001d\005w\004\207\004P\004{\000\251\0061\001\186\000h\001f\007\206\006\252\002;\005N\001j\004\181\004\179\000h\004\198\001S\004\208\004\182\0060\007\205\001l\004\209\003\012\004W\006\182\004\210\000\240\b\015\004g\000\241\000\174\004\211\0056\000\134\000\151\004M\005\151\005\127\b\136\005K\006\183\001n\004\195\000\174\000\137\001p\006\185\002l\007\199\000y\000\240\006\r\004l\004\196\002\011\007\020\006\186\006\187\003A\001u\b\173\000\242\006\183\b\143\004{\002m\001S\005\147\004m\000i\003\014\001t\001}\005N\002o\004\181\b\174\004N\000i\003\017\002p\004\182\001z\0058\001y\000h\001\186\001S\001|\001\127\001\017\b~\004q\000\174\001\179\001\185\0056\001\184\000\129\006\014\001\129\001\133\000\231\0064\001\135\001\139\001\138\000\235\004\130\000\244\000\174\006(\004\207\001\025\001\141\007\199\001\151\001\019\005:\001\146\000\174\001\145\000\129\001\148\000\246\001\150\004\179\000\183\004\198\004\195\004\208\001\153\005O\005?\006\188\004\209\001\186\000\240\005O\004\210\004\196\005\163\005\165\000l\000\174\004\211\000h\0058\001\155\005\225\000i\001\160\000l\001\166\005@\001\165\001\168\001\170\000\129\001\172\b~\001\176\000\231\000\130\000h\001\254\001\183\000\235\000\225\001\242\001\015\001\248\001\247\0065\000\233\006J\003)\003/\006\003\005A\005W\005\128\005:\005\159\005_\b~\005W\006\t\000\145\004\181\005_\000h\005w\004\195\003.\004\182\000h\005?\005w\004\207\003;\000\240\005O\003\198\004\196\005\202\005\165\004O\000\239\002;\006\n\000i\003I\004\179\006\012\004\198\003N\004\208\005@\003M\003V\003S\004\209\000\130\000l\007\200\004\210\006\200\000\225\000i\001\015\000\174\004\211\000\184\000\233\003R\004M\005\151\005\127\004O\003U\000h\001C\005A\003X\005\128\000h\005\159\000\174\004\\\005W\006\201\003Z\007\199\005_\003^\000i\006\204\006\186\006\187\007\007\000i\005w\004\207\003`\004{\003b\007\236\000\239\003d\000\174\000\181\003i\002;\005N\004s\004\181\004\179\003h\004\198\003q\004\208\004\182\003n\007\b\000l\004\209\007\011\006\186\006\187\004\210\000\240\007\209\001\187\000\241\000\174\004\211\0056\000\134\001\158\004M\005\151\005\127\000l\000\183\003m\000i\004\195\003p\000\137\003s\000i\003u\001\186\000y\000\240\006\r\001\190\004\196\002\011\003y\003{\003\127\003~\003\129\001\237\000\242\003\139\003\134\004{\000l\003\133\005@\003\136\007\201\000l\006\188\003\138\005N\003\141\004\181\003\143\001S\003\148\002\251\005\028\004\182\003\154\0058\000\129\005 \000\240\001S\002<\000\241\001\017\000h\002=\000\174\001\179\001\189\0056\001\184\003\153\006\014\003\156\006\188\000\129\006\022\005l\000h\000\222\002\253\003\158\000\244\000\184\006(\004\207\001\025\001?\005\029\003\160\001\019\005:\003\164\005\029\000\242\003\181\003\180\000\246\003\197\005c\000\183\004l\004\195\004\208\000h\007\204\005?\003\203\004\209\001\186\000\240\005O\004\210\004\196\006E\005\165\003\202\005q\004\211\000h\0058\004O\000\130\001\017\0040\003\206\002>\005@\001\249\000i\003\211\002;\002?\000\184\003\210\004\179\003\219\004\198\007\200\003\216\000\130\005u\000\244\000i\003\215\000\225\001\025\003\218\003\221\004u\001\019\000\226\005A\000\174\005\128\005:\005\159\000\246\007\235\005W\005M\006\216\004O\005_\003\223\003\227\004\195\003\229\005&\000i\005?\005w\004\207\004y\000\240\005O\005\030\004\196\b\011\005\165\007\201\005\030\003\231\003\233\000i\000\239\003\238\004{\001S\003\237\004\208\005@\000h\003\246\0079\004\209\005N\003\243\004\181\004\210\006\203\001\255\001\190\005\029\004\182\004\211\003\242\000\145\003\245\003\248\001\237\003\250\003\254\004\000\004\004\b;\005A\000l\005\128\0056\005\159\004\003\002;\005W\006\201\004\006\004\179\005_\004\198\004\016\006\204\006\186\006\187\004\011\000\129\005w\004\207\004\n\002X\004\r\002\001\002_\002\171\000l\000\174\004\015\004\018\004\020\007s\007\235\000\240\005M\004\025\002\172\004\208\004\031\000\174\000i\000l\004\209\006\222\004\030\004!\004\210\000h\004#\001\187\004%\000\240\004\211\0058\000\241\007t\000\129\007w\006\186\006\187\004\179\004{\004\198\004)\007\208\005'\005l\006\223\006\186\006\187\005N\004/\004\181\001\190\005\030\004.\0044\004:\004\182\0049\006\175\001\237\000\130\005(\006\179\002Z\000\242\006\220\005:\b,\004l\002[\006\188\0056\000\174\001\179\001\180\003\178\001\184\004\195\000\134\001\163\006\199\005?\006\213\007\001\005q\000\240\005O\b-\004\196\000\137\000i\007/\000l\002\173\000y\007H\007\240\000h\007J\000\130\002d\004\181\b0\007T\007V\002e\000\183\004\182\005u\000\184\007`\000\174\0032\007|\006\188\001\186\000h\000\174\001\179\001\180\003\195\001\184\0058\b\024\006\188\004|\bF\005A\bJ\005R\b2\b^\000\129\b\\\005W\bV\000\231\bX\b8\bZ\004O\000\235\000h\b`\002;\000\183\005w\004\207\004\179\004\128\004\198\000\183\000\174\001\179\001\186\bf\001\188\005:\004g\004U\001\186\bg\000i\bl\000l\004\208\000\174\bm\004\195\004\203\004\209\007\235\005?\005M\004\210\br\000\240\005O\b-\004\196\004\211\000i\004l\bq\by\b{\000\183\007\240\000\240\b\129\b\130\002f\b\134\b0\b\135\001\186\b\138\000\130\005\244\b\139\004{\b\142\000\225\b\145\001\015\b\146\b\163\000i\000\233\005N\b\152\004\181\b\161\b\157\002g\002\244\b\160\004\182\005A\004\195\005R\b2\000\129\b\169\b\167\005W\000\231\000\240\b/\b8\004\196\000\232\0056\b\171\b\176\007\135\000l\005w\004\207\002j\000\000\002k\000\239\000\000\004\205\000\000\002;\006\229\000\000\001S\004\179\002l\004\198\000\000\000\184\000l\004\208\000\000\000h\000\000\000\000\004\209\000\000\000\000\000\000\004\210\000\000\000\000\000\174\002m\005\227\004\211\001\187\004M\002n\005M\000\000\000\000\002o\000\000\000\000\000l\000h\0058\002p\007\204\000\129\000\130\002\145\004\207\000\231\000\000\000\225\000\000\0045\000\232\001\190\000\000\000\233\000\000\000\000\004O\004{\000\000\001\237\000\000\000\000\004\208\000\000\000\174\000\000\005N\004\209\004\181\000\000\000\000\004\210\001\187\005:\004\182\002\229\000\000\004\211\000i\000\000\000\240\000\184\000\000\000\241\004\195\000\000\000\000\000\239\005?\0056\001\190\000\000\000\240\005O\b-\004\196\001\190\005y\001\237\000\000\000\184\002;\000i\007\240\001\237\004\179\000\130\004\198\002\231\b0\006M\000\225\000\000\000\000\005\197\000\242\004V\000\233\000\000\000\000\000\000\005}\000\000\000\174\000\000\000\000\001\222\000\000\004M\000\000\005M\001\190\001\253\000h\005A\001\203\005R\b2\000\000\001\237\0058\005W\001\229\000\000\001\017\b8\000\000\000\000\000\000\000\000\000\000\000\239\000l\005w\004\207\007\n\001\206\004{\000\174\001\179\001\180\003\200\001\184\000\244\000\000\000\000\005N\001\025\004\181\000\000\000\240\001\019\004\208\000\241\004\182\005:\000l\004\209\000\246\007\b\000\000\004\210\007\011\006\186\006\187\000\000\004\195\004\211\000\000\0056\005?\000\000\000\183\000\000\000\240\005O\000\000\004\196\000i\000\000\007\007\001\186\000\000\002;\000\000\000\242\000h\004\179\000\000\004\198\005\195\005\186\000\000\000\000\005\197\000\000\007\208\005F\004g\000\129\0073\000\000\000\000\002X\007\b\000\174\002_\007\011\006\186\006\187\004M\005H\005M\000h\000\240\000\000\005A\000\241\005R\005\188\0058\000\174\004l\005W\0071\000\000\000\000\005_\0074\006\186\006\187\000\000\000\000\000\248\000\000\005w\004\207\000\000\004m\004{\000\000\006\188\000\174\000\000\000\253\000\000\001\249\000\000\005N\000\242\004\181\000i\000l\000\000\004\208\005:\004\182\000\000\000\000\004\209\000\000\000\000\004q\004\210\000\130\001\207\004\195\002Z\001\208\004\211\005?\0056\000h\002[\000\240\005O\001S\004\196\000i\000\000\000\000\000\000\000\000\002;\000\000\000\000\006\188\004\179\000\129\004\198\005#\005\186\000\222\002\250\000\000\000\000\000\000\000\248\005T\000\000\000\174\001\179\001\180\004,\001\184\000\174\000\000\006\188\000\255\002e\004M\005U\005\127\000\000\007\249\000\000\005A\000\000\005R\005\188\000\000\b\000\0058\005W\000\000\005\029\000\000\005_\000\174\000\000\000\000\000\000\000\000\000\000\000\183\005w\004\207\000i\001\187\004{\000\129\000\000\001\217\001\186\002X\000\000\000\000\002Y\005N\000\000\004\181\000\000\000l\000\130\004\208\000\000\004\182\005:\000\225\004\209\000\000\000\129\001\190\004\210\000\226\004\179\000\000\004\180\004\195\004\211\001\237\0056\005?\000\000\002;\000\145\000\240\005O\004\179\004\196\004\198\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\130\000\000\006\222\000\240\005\132\000\000\002f\000\174\000\000\000\239\000\000\007\249\004M\005U\005\127\000\000\000\130\007\141\007\251\002Z\000\000\000\000\000l\000\174\005\030\002[\006\223\006\186\006\187\005A\000\000\005R\005\134\0058\000\000\000\000\005W\000\130\000\000\004\181\005\136\004{\000\000\000\000\000\000\004\182\000\000\000\000\005w\004\207\005N\000\000\004\181\000\184\002j\000\000\002k\000\174\004\182\000\000\000\000\002e\004M\002\157\001S\000\000\002l\004\208\005:\005\235\000\000\000\000\004\209\0056\007\252\000\000\004\210\007\253\000\000\004\195\000\000\000\000\004\211\005?\002m\001S\000\000\000\240\005O\002n\004\196\004{\000\240\002o\001\203\000\241\000\134\003\146\000\000\002p\001\186\001\213\000\000\002\158\005@\006\188\000\000\000\137\000\174\000\000\002;\001\187\000y\004M\004\179\001\206\004\198\000\000\000\174\001\179\001\180\0042\001\184\000\000\0058\005\135\000\000\000\242\000\000\005A\000\000\005\128\000\174\005\129\000\000\001\190\005W\004M\005U\005\127\005_\000\000\004{\001\237\000\240\000\000\000\000\002f\005w\004\207\000\000\001\186\000\183\000\000\000\000\000\000\000\000\004\195\000\000\005:\007\252\001\186\000\000\007\253\000\000\000\240\004{\004\208\004\196\000\000\004\195\001S\004\209\007s\005?\005N\004\210\004\181\000\240\005O\000\000\004\196\004\211\004\182\000\000\002;\002;\000\000\000\000\002<\004\179\000\000\004\198\002=\000\000\005@\000\000\007t\0056\007w\006\186\006\187\000\000\000\000\000\000\006K\000\000\000\000\000\174\000\000\000\000\000\000\000\000\004M\005\151\005\127\001\214\000\000\000\000\000\000\005A\000\000\005\128\000\000\005\129\002\155\000\129\005W\006\235\005O\000\231\005_\000\000\000\000\000\000\000\235\000\000\000\000\000\000\005w\004\207\001\232\004{\000\000\001\207\004\197\000\000\001\208\000\000\0058\002\174\005N\000\000\004\181\002>\001S\000\000\000\000\004\208\004\182\002?\000\000\000\000\004\209\000\000\000\000\000h\004\210\000\000\000\000\000\000\000\000\006J\004\211\0056\000\000\000h\005W\006\188\000\000\005O\005_\000\000\000\000\005:\007s\000\000\002\232\002;\005w\000\000\000\130\004\179\000\000\004\198\004\195\000\225\000\000\000\000\005?\000\000\000\000\000\233\000\240\005O\000\000\004\196\000\000\000\000\007t\000\174\007w\006\186\006\187\000\000\004M\005\151\005\127\001\187\000\000\005@\000\000\002;\006v\002\176\0058\002<\000\000\005W\000\000\002=\000i\005_\000\000\000\000\000\000\000\239\000\000\000\000\000\174\005w\000i\001\190\000\000\004{\005A\000\000\005\128\000\000\005\129\001\237\000\000\005W\005N\002\178\004\181\005_\000\000\000\000\000\000\005:\004\182\000\000\000\000\005w\004\207\000\000\000\000\000\000\000\145\002\171\004\195\002\216\000\000\000\000\005?\0056\000\000\000\240\000\240\005O\002\172\004\196\004\208\005\158\000\000\000\000\002\174\004\209\000\000\006\188\002>\004\210\000\000\000\000\000\000\005@\002?\004\211\007\154\000\174\001\179\001\180\0047\001\184\000l\000\000\000h\002\219\007s\000\000\007\249\000\000\000\000\000\000\000l\000\000\002\181\b\003\000\240\002;\005A\000\241\005\128\004\179\005\159\004\198\0058\005W\000\000\000\000\000\000\005_\007t\000\183\007w\006\186\006\187\000h\000\000\005w\004\207\000\174\001\186\000\000\006\222\000\000\004M\005\151\005\127\000\000\000\000\001\022\000\000\000\242\000\000\000\000\000\000\000\000\004\208\002\183\002\176\005:\000\000\004\209\000\000\000\000\000\000\004\210\006\223\006\186\006\187\000i\004\195\004\211\002\184\004{\005?\000\000\000\134\003\151\000\240\005O\001\017\004\196\005N\005\160\004\181\000\000\000\000\000\137\002\178\000\129\004\182\000\000\000y\000\222\002\249\005@\000h\000\000\000\000\000\244\000i\000h\000\184\001\023\002\171\0056\002\223\001\019\007\161\006\222\000\000\006\188\000\240\000\000\000\246\002\172\000\000\000\000\005\251\002;\005A\000\000\005\128\004\179\005\159\004\198\000\000\005W\000\000\000\000\000\000\005_\000\000\006\223\006\186\006\187\000\000\000\000\000h\005w\004\207\000\174\000\000\000l\000\000\006\188\004M\005\189\005\127\002;\000\000\002\181\000\000\004\179\000\130\004\198\0058\007\252\004\208\000\225\007\253\000i\000\000\004\209\000\000\000\226\000i\004\210\001S\002\226\000\000\000\174\000\000\004\211\000l\004{\004M\005\189\005\127\000\000\000\000\000\000\000h\000\000\005N\000\000\004\181\000\000\000\000\000\000\000\000\005:\004\182\006\222\002\183\000\000\000\000\001\187\000\000\000\239\006\222\000\000\004\195\000i\000\000\004{\005?\0056\000\000\002\184\000\240\005O\006\188\004\196\005N\005\178\004\181\006\223\006\186\006\187\000\000\001\190\004\182\000\000\006\223\006\186\006\187\005@\000\000\001\237\005\191\000\000\007\164\000\184\000\000\000l\000h\0056\000\000\000\000\000l\000\145\000\000\000\000\000\000\000\000\000h\000i\000\000\006\004\000\000\002;\005A\000\000\005\128\004\179\005\159\004\198\0058\005W\005\193\000\129\000\000\005_\0023\000\231\005\211\000\000\006\233\000\000\000\235\005w\004\207\000\174\000\000\000\000\000\000\000l\004M\005U\005\127\000\000\000\240\000\174\000h\000\241\000\000\000\000\0058\000\000\004\208\000\000\000\000\005:\000\000\004\209\006\188\000\000\000\000\004\210\000\000\000i\000\000\006\188\004\195\004\211\000\000\004{\005?\000\000\000\000\000i\000\240\005O\000h\004\196\005N\000\242\004\181\000\000\000\000\000l\000\000\005:\004\182\000\184\000\130\000\000\000\000\005@\000\184\000\225\000\000\001\015\004\195\006\248\000\000\000\233\005?\0056\000\000\006\026\000\240\005O\000\000\004\196\006*\000\000\000\000\000i\000\000\000\134\004\023\000\000\005A\000\000\005\128\000\174\005\192\005@\000\000\005W\000\137\000\000\000\000\005_\000\000\000y\000\000\000\000\000\000\000\239\000\000\005w\004\207\000l\000\000\000h\000\000\000i\000\000\000\000\000\000\002;\005A\000l\005\128\004\179\005\192\004\198\0058\005W\004\208\000\000\000\000\005_\000\000\004\209\000\000\000\000\000\000\004\210\000\129\005w\004\207\000\174\002X\004\211\000\000\002_\004M\002A\005M\000\000\000\000\000\000\000\000\000\145\000\000\006\246\000\000\000\000\004\208\000l\000\000\005:\006\244\004\209\001\203\000\000\000\000\004\210\000\000\000\000\000\129\001\213\004\195\004\211\000\231\004{\005?\000\000\000i\000\232\000\240\005O\000h\004\196\005N\001\206\004\181\000\000\000\000\000l\000\240\000\000\004\182\000\241\002;\000\000\000\000\005@\004\179\000\000\004\198\002]\000\000\000\130\000\000\000\000\002Z\0056\000\000\002\254\000\000\002\153\002[\000\000\000\000\000\000\000\174\000\000\002\003\000\000\000\000\004M\005A\005M\005\128\000\242\005\129\000\000\006?\005W\000\129\000\000\005\197\005_\000\231\000\130\000\000\000\000\000\000\000\232\000\225\005w\004\207\002\005\000\000\003\001\000\233\000i\002e\002\169\004{\001S\000l\000\000\001\017\000\000\000\000\000\174\0058\005N\004\208\004\181\000\000\000\134\004\028\004\209\000\000\004\182\000\000\004\210\000\000\000\000\006\222\000\244\000\137\004\211\000h\001\025\000\000\000y\000\239\001\019\0056\000\000\000\000\000\143\001\214\000\000\000\246\000\000\000\000\000\000\000\000\005:\000\000\000\130\006\223\006\186\006\187\000\000\000\225\000\000\000\000\006O\004\195\000\000\000\233\005\197\005?\000\000\000\000\001\215\000\240\005O\001\207\004\196\000\000\001\208\000\000\006\222\000\000\000l\000\000\000\000\000h\001S\002;\000\000\001\203\005\186\004\179\000\240\004\198\0058\002f\001\213\000\000\000\000\000\000\000\000\000\239\000i\004\184\006\223\006\186\006\187\000\000\003\024\000\174\001\206\000\000\000\000\000\000\004M\005A\005M\005R\005\188\000\000\000\000\000\000\005W\000\000\000\240\000\000\005_\000\241\000\000\005:\003\004\000\000\000\000\000\000\005w\004\207\006\188\000\000\000\129\000\000\004\195\000\000\000\231\004{\005?\000\000\000\000\000\235\000\240\005O\000i\004\196\005N\004\208\004\181\002l\000\134\000\000\004\209\000\242\004\182\000\000\004\210\000\000\000\000\005\186\000\000\000\137\004\211\000\000\000\000\000\000\000y\002m\000\000\0056\000l\000\000\003\014\000\000\000\000\000\129\002o\006\188\000\240\000\222\002\248\000\241\002p\000\000\005A\000\000\005R\005\188\000\000\000\000\006Q\005W\002;\000\000\005\197\005_\004\179\000\130\004\198\006\222\000\000\000\248\000\225\005w\004\207\001\214\000\000\000\000\000\233\000\000\000\000\000\000\001\001\000\242\000\174\000\000\000\000\000\000\000l\004M\0058\005M\004\208\006\223\006\186\006\187\000\000\004\209\000\000\000\000\001\220\004\210\000\000\001\207\000\000\000\000\001\208\004\211\006\222\000\000\000\130\000\000\000\239\006\222\001S\000\225\000\000\000\000\004{\000\000\000\000\000\226\000\000\007\003\000\000\005:\000\000\005N\000\000\004\181\004\193\000\248\006\223\006\186\006\187\004\182\004\195\006\223\006\186\006\187\005?\000\000\001\003\000\000\000\240\005O\000\000\004\196\000\174\000\000\0056\000\000\002;\004M\000\000\000\239\004\179\000\000\004\198\000\000\000\000\005\186\000\000\000\000\000\000\000\000\000\000\007\221\000\000\000\000\007\018\007\213\006\188\000\000\000\174\005\197\000\000\000\000\005\012\004M\005U\005\127\004{\000\000\000\000\000\000\005A\000\000\005R\005\188\000\000\001\186\000\000\005W\000\000\000\240\000\000\005_\000\241\000\000\000\129\0058\000\000\000\000\000\231\005w\004\207\000\000\004{\000\237\000\000\006\188\000\000\000\000\000\000\000\000\006\188\005N\000\000\004\181\000\000\000\000\000\000\000\000\004\208\004\182\000\000\000\000\002v\004\209\000\242\000\000\000\000\004\210\000\000\000\000\005:\000\000\000\240\004\211\0056\000\241\002;\000\000\000\000\000\000\004\179\004\195\004\198\000\000\000\000\005?\000\000\000\000\000\000\000\240\005O\000\129\004\196\001\017\000\000\000\222\002\247\006\222\000\174\000\130\000\000\000\000\000\000\004M\000\225\005M\005\186\000\242\000\000\000\000\000\233\000\000\000\244\000\000\000\000\000\000\001\023\000\000\000\000\000\000\001\019\006\223\006\186\006\187\000\000\0058\000\000\000\246\000\000\007\029\000\000\005A\004{\005R\005\188\000\000\000\000\000\000\005W\000\000\000\000\005N\005_\004\181\000\239\000\000\000\000\000\000\000\000\004\182\005w\004\207\000\000\000\000\005O\000\000\000\130\000\000\000\000\000\000\005:\000\225\000\000\000\000\0056\000\000\002;\000\226\007*\004\208\004\179\004\195\004\198\007(\004\209\005?\000\000\000\000\004\210\000\240\005O\b\017\004\196\000\000\004\211\007\227\000\000\006\222\000\174\005\197\000\000\000\000\000\000\004M\005U\005\127\005@\006x\000\000\000\000\006\188\000\239\005W\000\000\000\000\000\000\005_\000\000\000\000\000\000\000\000\006\223\006\186\006\187\005w\0058\000\000\000\174\000\000\000\000\000\000\005A\004{\005\128\000\000\005\129\000\000\000\240\005W\000\000\000\241\005N\005_\004\181\000\000\000\000\000\000\000\000\000\000\004\182\005w\004\207\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005:\000\000\000\000\000\000\0056\000\000\000\000\000\000\000\000\004\208\000\000\004\195\000\242\000\000\004\209\005?\000\000\000\000\004\210\000\240\005O\000\129\004\196\000\000\004\211\000\222\000\224\002;\000\000\000\000\005\206\004\179\000\000\004\198\000\240\000\000\005\186\000\241\001\203\000\000\006\188\000\243\000\000\000\000\000\000\001\213\000\000\000\000\000\000\000\174\000\000\000\000\000\000\006\222\004M\0058\005\127\000\000\000\000\001\206\000\244\005A\000\000\005R\005\188\002a\000\000\000\000\005W\000\242\000\000\000\000\005_\007&\000\000\000\246\000\000\006\223\006\186\006\187\005w\004\207\000\000\004{\000\000\000\000\000\130\000\000\000\000\000\000\005:\000\225\005N\000\000\004\181\000\000\000\000\000\226\000\000\004\208\004\182\004\195\000\000\006\222\004\209\005?\000\000\000\000\004\210\000\240\005O\000\000\004\196\000\000\004\211\0056\000\000\002;\000\000\000\000\000\000\004\179\000\000\004\198\000\000\000\000\005@\006\223\006\186\006\187\000\000\000\239\000\129\000\000\000\000\005\131\000\222\002\240\000\000\000\174\000\000\000\000\000\000\006\222\004M\000\000\005M\000\000\000\000\000\000\000\000\005A\000\000\005\128\000\000\005\129\006\188\002;\005W\000\000\001\214\002<\005_\007D\000\000\002=\0058\006\223\006\186\006\187\005w\004\207\000\000\004{\000\129\000\000\000\000\000\000\000\222\002,\000\000\000\000\005N\000\129\004\181\004_\000\000\000\231\001\207\004\208\004\182\001\208\000\235\000\000\004\209\000\000\000\000\000\130\004\210\001S\000\000\005:\000\225\000\000\004\211\0056\006\188\002;\000\226\000\000\000\000\004\179\004\195\004\198\000\240\000\000\005?\000\241\000\000\000\000\000\240\005O\002\174\004\196\000\000\005L\002>\000\000\000\000\000\174\000\000\000\000\002?\000\000\004M\000\000\005M\005\208\000\000\000\130\000\000\000\000\000\239\000\000\000\225\000\000\006\188\000\000\000\130\000\242\000\226\000\000\000\000\000\225\000\000\001\015\0058\000\000\000\000\000\233\000\000\006\222\005A\004{\005\128\000\000\005\210\000\000\000\000\005W\000\000\000\000\005N\005_\004\181\000\000\000\000\000\000\000\000\007B\004\182\005w\004\207\000\000\000\239\006\223\006\186\006\187\000\000\000\000\000\000\005:\000\000\000\239\000\000\0056\002\176\000\000\000\000\000\000\004\208\000\000\004\195\000\000\000\000\004\209\005?\000\000\000\000\004\210\000\240\005O\000\129\004\196\000\000\004\211\000\231\000\000\002;\003\015\000\000\000\232\004\179\000\000\004\198\000\240\002\178\005P\000\241\007@\000\000\000\000\000\000\000\000\000\000\000\000\005V\000\000\000\000\000\000\000\174\000\000\002\171\000\000\002\180\004M\0058\005M\000\000\000\000\000\240\000\000\005A\002\172\005R\005S\000\000\000\000\000\000\005W\000\242\000\000\000\000\005_\006\188\000\000\000\000\000\240\000\000\007Q\000\241\005w\004\207\000\000\004{\000\000\000\240\000\130\000\000\000\241\000\000\005:\000\225\005N\000\000\004\181\000\000\000\000\000\233\002\181\004\208\004\182\004\195\000\000\006\222\004\209\005?\000\000\000\000\004\210\000\240\005O\000\242\004\196\001J\004\211\0056\000\000\002;\000\000\000\000\000\242\004\179\000\000\004\198\000\000\000\000\005P\006\223\006\186\006\187\000\000\000\239\000\129\000\000\000\000\000\000\000\222\0025\000\000\000\174\000\000\002\183\000\000\000\000\004M\000\000\005M\000\000\000\000\001\017\000\000\005A\000\000\005R\005S\000\000\002\184\002;\005W\000\000\000\000\002<\005_\000\000\000\000\002=\0058\006\222\000\244\000\000\005w\004\207\001\025\004{\000\129\000\000\001\019\000\000\000\222\0028\000\000\000\000\005N\000\246\004\181\000\000\000\000\000\000\000\000\004\208\004\182\006\223\006\186\006\187\004\209\000\000\007O\000\130\004\210\000\000\000\000\005:\000\225\000\000\004\211\0056\006\188\002;\000\226\000\000\000\000\004\179\004\195\004\198\000\240\000\000\005?\000\241\000\000\000\000\000\240\005O\002\174\004\196\000\000\000\000\002>\000\000\000\000\000\174\000\000\000\000\002?\000\000\004M\000\000\005M\005P\000\000\000\130\000\000\000\000\000\239\000\000\000\225\000\000\000\000\000\000\000\000\000\242\000\226\000\000\000\000\000\000\000\000\000\000\0058\000\000\000\000\002\218\000\000\000\000\005A\004{\005R\005S\000\000\000\000\000\000\005W\006\188\000\000\005N\005_\004\181\000\000\000\000\000\000\000\000\000\000\004\182\005w\004\207\000\000\000\239\000\000\000\000\000\000\000\000\000\000\000\000\005:\000\000\000\000\000\000\0056\002\176\000\248\000\174\000\000\004\208\000\000\004\195\004M\000\000\004\209\005?\000\000\001\005\004\210\000\240\005O\000\129\004\196\000\000\004\211\000\231\000\000\002;\005\162\000\000\000\232\004\179\000\000\004\198\000\240\002\178\005\155\000\241\007\139\000\000\000\000\004{\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\174\001\186\002\171\000\000\002\216\004M\0058\005M\000\000\000\000\000\240\000\000\005A\002\172\005R\005\157\000\000\000\000\000\000\005W\000\242\000\000\000\000\005_\000\000\000\000\000\000\000\240\000\000\000\000\000\241\005w\004\207\000\000\004{\000\000\000\000\000\130\000\000\000\000\002\219\005:\000\225\005N\000\000\004\181\000\000\000\000\000\233\002\181\004\208\004\182\004\195\007\144\000\000\004\209\005?\000\000\000\000\004\210\000\240\005O\000\242\004\196\000\000\004\211\0056\000\000\002;\005\154\000\000\000\000\004\179\000\000\004\198\000\000\000\000\005\155\000\000\000\000\000\000\000\000\000\239\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\174\000\000\002\183\000\000\000\000\004M\000\000\005M\000\000\000\000\000\000\000\000\005A\000\000\005R\005\157\000\000\002\184\000\000\005W\000\000\000\000\000\000\005_\000\000\000\000\000\129\0058\000\000\000\000\000\231\005w\004\207\000\000\004{\000\237\000\000\000\000\000\000\000\000\005O\000\000\000\000\005N\000\129\004\181\000\000\000\000\000\231\000\000\004\208\004\182\000\000\000\232\000\000\004\209\000\000\000\000\000\000\004\210\000\000\000\000\005:\000\000\000\000\004\211\0056\000\000\002;\000\000\000\000\000\000\004\179\004\195\004\198\000\240\000\000\005?\000\241\000\000\000\000\000\240\005O\006z\004\196\000\000\000\000\000\000\005W\005\174\000\174\000\130\005_\000\000\000\000\004M\000\225\005M\005\175\000\000\005w\000\000\000\233\000\000\000\000\000\000\000\000\000\000\000\000\000\130\000\242\000\174\000\000\000\000\000\225\000\000\000\000\0058\000\000\000\000\000\233\000\000\000\000\005A\004{\005R\005\177\000\000\000\000\000\000\005W\000\000\000\000\005N\005_\004\181\000\239\000\000\000\000\000\000\000\000\004\182\005w\004\207\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005:\000\000\000\239\000\000\0056\000\000\000\248\000\000\000\000\004\208\000\000\004\195\000\000\000\000\004\209\005?\000\000\001\007\004\210\000\240\005O\000\000\004\196\000\000\004\211\000\000\000\000\002;\005\172\005\185\001\203\004\179\000\000\004\198\000\000\000\000\005\155\001\213\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\174\000\000\001\206\000\000\000\000\004M\0058\005M\000\000\000\000\000\000\000\000\005A\000\129\005R\005\157\000\000\002X\000\240\005W\002_\000\241\000\000\005_\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005w\004\207\000\000\004{\000\000\000\240\000\000\000\000\000\241\000\000\005:\000\000\005N\000\000\004\181\000\000\000\000\000\000\000\000\004\208\004\182\004\195\000\242\000\000\004\209\005?\000\000\000\000\004\210\000\240\005O\000\000\004\196\000\000\004\211\0056\000\000\002;\000\000\000\000\000\242\004\179\000\000\004\198\000\000\000\000\005\186\000\130\000\000\000\000\002Z\000\243\000\000\002\254\007\217\000\000\002[\000\000\000\129\000\174\005\190\000\000\000\222\002L\004M\000\000\005M\000\000\000\000\000\000\000\244\005A\001\214\005R\005\188\002c\000\000\000\000\005W\000\000\000\000\000\000\005_\000\000\000\000\000\246\0058\000\000\000\248\003\001\005w\004\207\002e\004{\000\000\000\000\000\000\004i\000\000\001\t\001\207\000\000\005N\001\208\004\181\000\000\000\000\000\000\000\000\004\208\004\182\001S\000\000\000\000\004\209\000\000\000\000\000\000\004\210\000\000\000\000\005:\000\000\000\130\004\211\0056\000\000\002;\000\225\000\000\000\000\004\179\004\195\004\198\000\226\000\000\005?\000\000\000\000\000\000\000\240\005O\000\129\004\196\007\229\000\000\000\231\000\000\000\000\000\174\000\000\000\237\000\000\000\000\004M\000\000\005M\005\186\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\239\000\000\000\000\000\000\000\000\000\000\000\000\000\240\0058\000\000\002f\000\000\000\000\000\000\005A\004{\005R\005\188\000\000\000\000\000\000\005W\000\000\003\002\005N\005_\004\181\000\000\000\000\000\000\000\000\000\000\004\182\005w\004\207\000\000\000\000\000\000\000\000\000\130\000\000\000\000\000\000\005:\000\225\003\004\000\000\0056\000\000\002;\000\233\000\000\004\208\004\179\004\195\004\198\000\000\004\209\005?\000\000\000\000\004\210\000\240\005O\000\129\004\196\007\232\004\211\000\231\000\000\002l\000\174\000\000\000\237\000\000\000\000\004M\000\000\005M\007\218\000\000\000\000\000\000\000\240\000\239\000\000\000\241\000\000\002m\000\000\000\000\000\000\000\000\003\014\000\000\000\000\000\000\002o\0058\000\000\000\000\000\000\000\000\002p\005A\004{\005R\007\220\000\000\000\000\000\000\005W\000\000\000\000\005N\005_\004\181\000\000\000\242\000\000\000\000\000\000\004\182\005w\004\207\000\000\000\000\000\000\000\000\000\130\000\000\000\000\000\000\005:\000\225\000\000\000\000\0056\000\000\002;\000\233\000\000\004\208\004\179\004\195\004\198\000\000\004\209\005?\000\000\000\000\004\210\000\240\005O\000\129\004\196\000\000\004\211\000\231\000\000\000\000\000\174\000\000\000\232\000\000\000\000\004M\000\240\006f\007\218\000\241\000\000\000\000\000\000\000\239\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0058\000\000\000\000\000\000\000\000\000\000\005A\004{\005R\007\220\000\000\000\000\000\000\005W\000\242\000\000\005N\005_\004\181\000\000\000\000\000\000\000\000\000\000\004\182\005w\004\207\000\000\000\000\000\000\000\000\000\130\000\000\000\000\000\000\005:\000\225\000\000\000\000\0056\000\000\002;\000\233\000\243\004\208\004\179\004\195\004\198\000\000\004\209\005?\000\000\000\000\004\210\000\240\005O\000\000\004\196\000\000\004\211\000\000\000\000\000\244\000\174\000\000\000\000\000\000\004\200\004M\000\240\006f\007\218\000\241\000\000\000\000\000\000\000\239\000\246\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0058\000\000\000\000\000\000\000\000\000\000\005A\004{\005R\007\220\000\000\000\000\000\000\005W\000\242\000\000\005N\005_\004\181\000\000\000\000\000\000\000\000\000\000\004\182\005w\004\207\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005:\006g\000\000\000\000\0056\000\000\002;\000\000\000\243\004\208\004\179\004\195\004\198\000\000\004\209\005?\000\000\000\000\004\210\000\240\005O\000\000\004\196\000\000\004\211\000\000\000\000\000\244\000\174\000\000\000\000\000\000\004\202\004M\000\240\006f\005@\000\241\000\000\000\000\000\000\000\000\000\246\000\000\000\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\129\0058\000\000\000\000\000\222\002R\000\129\005A\004{\006j\004\179\000\000\004\198\000\000\005W\000\242\000\000\005N\005_\004\181\000\000\000\000\000\000\000\000\000\000\004\182\005w\004\207\000\174\000\000\000\000\000\000\000\000\005\225\000\000\000\000\005:\006i\000\000\000\000\0056\000\000\000\000\000\000\000\000\004\208\000\000\004\195\000\000\000\000\004\209\005?\000\000\000\000\004\210\000\240\005O\006\002\004\196\000\000\004\211\001\203\006\003\000\248\000\000\000\130\000\000\000\000\001\213\000\000\000\225\006\t\005@\004\181\001\011\000\000\000\226\000\000\000\000\004\182\000\000\000\000\001\206\000\000\000\000\000\000\000\000\000\000\000\000\000\174\000\000\0058\000\000\000\000\006\n\000\000\000\000\005A\006\012\006j\000\000\000\000\000\000\000\129\005W\000\000\000\000\000\231\005_\000\000\000\239\000\000\000\235\000\000\000\000\000\000\005w\004\207\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\174\005:\006l\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\208\000\000\004\195\000\000\000\000\004\209\005?\000\000\000\000\004\210\000\240\005O\000\129\004\196\000\000\004\211\000\231\000\000\000\000\000\000\000\000\000\235\000\000\000\000\000\000\001\203\000\000\005@\000\000\000\000\000\000\000\000\001\213\000\130\000\174\000\129\000\000\000\000\000\225\002X\001\015\000\000\002_\000\000\000\233\000\000\001\206\000\000\001\214\000\000\000\000\000\000\005A\000\000\006j\000\000\004\195\000\174\000\240\005W\000\000\000\241\000\000\005_\000\240\006\r\000\000\004\196\000\000\000\000\000\000\005w\004\207\005f\000\000\000\000\001\207\000\130\000\239\001\208\000\000\005@\000\225\000\000\001\015\000\000\000\000\001S\000\233\000\000\004\208\000\000\000\000\000\242\000\000\004\209\000\000\000\000\000\000\004\210\000\130\000\000\000\174\002Z\003\015\004\211\001H\000\000\000\000\002[\000\000\000\129\000\000\006\014\000\000\002X\000\000\006\022\002_\000\000\000\000\000\000\000\239\000\000\000\000\006(\004\207\000\000\000\000\000\000\000\000\000\000\000\000\000\174\000\000\000\000\000\000\000\000\000\000\000\000\002d\000\000\000\000\000\000\004\208\002e\000\000\001\214\001F\004\209\001H\000\000\000\000\004\210\000\000\000\000\000\000\000\000\000\000\004\211\000\000\000\240\000\000\000\000\000\241\000\129\000\000\000\000\000\000\000\231\000\000\000\000\005n\001\203\000\232\001\207\000\130\000\000\001\208\002Z\001\213\000\000\000\000\000\000\000\000\002[\001S\000\000\000\129\001J\000\000\000\000\002X\000\000\001\206\002_\000\242\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\240\000\000\000\000\000\241\000\000\000\174\000\000\000\000\002;\001P\000\000\002d\004\179\000\000\004\198\000\000\002e\001S\000\000\000\000\001\017\000\000\000\000\000\240\000\000\000\130\002f\000\000\001J\000\000\000\225\000\000\000\174\000\000\000\000\000\242\000\233\005/\006L\000\244\000\000\000\000\000\000\001\025\000\000\000\000\000\000\001\019\000\130\002g\002\162\002Z\000\000\001P\000\246\000\000\000\000\002[\000\000\000\000\000\000\001S\000\000\000\000\001\017\000\000\000\000\000\000\000\000\000\000\000\239\000\000\000\000\002\174\002j\004\181\002k\000\000\000\000\000\000\000\000\004\182\000\000\000\244\001S\000\000\002l\001\025\002d\000\000\001\214\001\019\000\000\002e\000\000\000\000\0056\000\000\000\246\000\240\000\000\000\000\002f\001\203\002m\000\000\000\000\000\000\002;\002n\001\213\000\000\004\179\002o\004\198\005\238\000\000\000\000\001\207\002p\000\000\001\208\000\000\002\145\001\206\002g\002h\000\000\000\000\001S\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005/\005\148\000\000\002;\000\000\000\000\000\000\004\179\000\000\004\198\0058\000\000\000\000\002j\000\000\002k\000\240\000\000\000\000\000\241\000\000\000\000\000\000\001S\000\000\002l\000\000\000\000\000\000\000\000\000\000\000\000\005/\005\138\000\000\000\000\002\174\000\000\004\181\000\240\000\000\000\000\002f\002m\004\182\005:\000\000\000\000\002n\000\000\000\000\000\242\002o\000\000\000\000\000\000\004\195\000\000\002p\0056\005?\000\000\002\145\000\000\000\240\002g\004\186\004\196\002\174\000\000\004\181\000\000\000\000\000\000\000\000\000\000\004\182\000\000\000\000\000\000\000\000\005@\000\000\000\000\000\000\000\000\000\000\000\000\001\214\000\000\002j\0056\002k\000\000\000\000\000\000\000\000\000\000\000\000\002\246\001S\002;\002l\000\000\000\000\004\179\005A\004\198\000\000\000\000\0058\000\129\000\000\006\029\000\000\002X\001\207\000\000\002_\001\208\002m\000\000\000\000\000\000\000\000\002n\004\207\001S\000\000\002o\005/\0050\000\000\000\174\000\000\002p\000\000\000\000\000\000\002\145\000\000\000\000\0058\000\000\004\208\005:\000\000\000\129\000\000\004\209\000\000\000\222\002U\004\210\000\129\000\000\004\195\000\000\000\231\004\211\005?\000\000\000\000\000\232\000\240\000\000\002\174\004\196\004\181\000\000\000\000\000\000\000\000\000\000\004\182\000\000\000\130\005:\000\000\002Z\000\000\005@\000\000\000\000\000\000\002[\000\000\000\000\004\195\0056\000\000\000\000\005?\000\000\000\000\000\000\000\240\000\000\000\000\004\196\000\129\000\000\000\000\000\000\002X\000\000\005A\002_\000\000\000\000\000\000\000\000\000\130\005@\000\000\000\000\002d\000\225\000\000\000\130\000\000\002e\000\174\000\226\000\225\000\000\004\207\000\000\000\000\000\000\000\233\000\000\000\000\002;\000\000\000\000\000\000\004\179\005A\004\198\0058\000\000\000\000\000\000\004\208\000\000\000\000\000\000\000\000\004\209\000\000\000\000\000\129\004\210\000\000\000\000\000\231\000\239\004\207\004\211\000\000\000\235\005/\005>\000\239\000\130\000\000\000\000\002Z\000\000\000\000\000\000\000\000\000\000\002[\005:\004\208\000\000\000\000\000\000\000\000\004\209\000\000\000\000\000\000\004\210\004\195\000\000\000\129\000\000\005?\004\211\000\222\004\139\000\240\000\000\000\000\004\196\002\174\000\000\004\181\000\000\000\000\000\000\000\240\002d\004\182\002f\000\000\000\000\002e\005@\000\000\000\000\000\000\000\000\000\000\000\130\000\000\000\000\000\000\0056\000\225\000\000\001\015\000\000\000\000\000\000\000\233\000\000\002g\005<\000\000\000\000\000\000\000\000\005A\000\000\000\000\000\000\000\240\003\"\000\000\000\241\000\000\000\000\000\000\000\240\002;\000\000\000\241\000\000\004\179\000\130\004\198\002j\004\207\002k\000\225\000\000\000\000\000\000\000\239\000\000\000\226\001S\000\129\002l\000\000\000\000\002X\000\000\0058\002_\004\208\000\242\000\000\005/\005\150\004\209\000\000\000\000\000\242\004\210\000\000\002m\000\000\000\000\000\174\004\211\002n\000\000\000\000\000\240\002o\000\000\002f\000\000\000\239\000\000\002p\000\000\000\000\000\000\002\145\000\000\000\000\005:\000\000\000\000\000\000\000\000\000\000\002\174\000\000\004\181\000\000\000\000\004\195\002g\005Y\004\182\005?\000\000\000\000\000\000\000\240\000\000\000\000\004\196\000\248\000\130\000\000\000\000\002Z\000\000\0056\000\000\000\129\000\000\002[\001\r\000\231\005@\002j\000\240\002k\000\232\000\241\000\000\000\000\000\000\000\000\000\000\001S\000\129\002l\000\000\000\000\000\231\000\000\000\000\000\000\000\000\000\235\000\000\000\000\000\000\005A\000\000\000\000\002d\000\000\001\024\002m\000\000\002e\000\174\000\000\002n\000\242\000\240\000\000\002o\000\241\000\000\000\000\0058\004\207\002p\000\000\000\000\000\000\002\145\000\000\000\000\000\129\000\000\000\000\000\000\000\231\000\000\000\000\000\130\000\000\000\235\004\208\000\000\000\225\001\017\000\000\004\209\000\000\000\000\000\233\004\210\000\242\000\000\000\174\000\000\000\130\004\211\005:\000\000\000\000\000\225\000\000\001\015\000\244\000\000\000\000\000\233\001\025\004\195\000\000\000\000\001\019\005?\000\000\000\000\000\000\000\240\000\000\000\246\004\196\000\000\000\000\000\000\000\239\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005@\000\240\000\000\000\130\002f\000\000\000\000\000\239\000\225\000\129\001\015\000\000\000\000\002X\000\233\000\000\002_\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005A\000\000\002g\006\016\000\000\000\000\000\174\000\000\000\000\000\000\000\129\000\000\000\000\000\000\002X\000\000\000\000\002_\000\000\000\000\004\207\000\000\000\000\000\239\000\000\000\000\000\000\002j\000\000\002k\000\000\000\000\000\174\000\000\000\000\000\000\000\000\001S\004\208\002l\000\129\000\000\000\000\004\209\000\222\004\170\000\000\004\210\000\240\000\130\000\000\000\241\002Z\004\211\000\000\000\000\000\000\002m\002[\000\000\000\000\000\000\002n\000\000\000\000\000\240\002o\000\000\000\241\000\000\000\000\000\000\002p\000\000\000\000\000\130\002\145\000\000\002Z\000\000\000\000\000\000\000\000\000\242\002[\000\000\000\000\000\000\000\000\002\156\000\000\000\000\000\000\002\011\002e\000\000\000\000\000\000\000\000\000\000\000\242\000\000\000\000\000\000\000\000\000\130\000\240\000\000\000\000\000\241\000\225\000\000\000\000\000\000\000\000\002\147\000\226\000\129\002\r\000\000\002e\002X\000\000\000\000\002_\000\000\001S\000\000\000\000\001\017\000\000\000\248\000\000\000\000\002\020\000\000\000\000\000\000\000\000\000\174\000\129\000\242\001\027\000\000\000\222\004\173\000\000\000\000\000\244\000\000\000\239\000\000\001\025\000\000\000\000\000\000\001\019\000\000\000\000\002\022\000\000\000\000\000\000\000\246\000\000\000\000\000\000\001S\000\000\000\000\001\017\000\000\000\000\000\000\000\000\000\000\000\000\000\240\000\000\000\000\002f\000\000\000\130\000\000\000\000\002Z\000\000\000\000\000\000\000\244\000\000\002[\000\000\001\025\000\000\000\000\000\000\001\019\000\000\000\000\000\000\000\000\000\000\000\240\000\246\000\130\002f\000\000\000\000\000\129\000\225\000\000\000\000\000\231\000\000\000\000\000\226\000\000\000\235\000\000\000\000\000\000\002\160\000\000\000\000\000\129\000\000\002e\002j\000\231\002k\000\174\000\000\000\240\000\235\000\000\000\241\000\000\001S\000\000\002l\000\000\000\000\000\000\000\000\000\000\000\000\000\174\000\000\000\000\000\239\000\000\000\000\000\000\002j\000\000\002k\000\000\002m\000\000\000\000\000\000\000\000\002n\001S\000\000\002l\002o\000\242\000\000\000\000\000\000\000\000\002p\000\130\000\000\000\000\002\145\000\000\000\225\000\000\001\015\000\129\000\000\002m\000\233\000\231\000\000\000\000\002n\000\130\000\235\000\000\002o\000\000\000\225\000\000\001\015\000\000\002p\000\000\000\233\000\129\002\145\000\174\000\000\000\231\000\000\000\000\000\000\000\240\000\235\000\000\002f\000\000\000\000\000\000\000\000\000\000\000\239\000\000\000\129\000\000\000\000\000\174\004\179\000\000\004\198\000\000\000\000\000\000\000\000\000\000\000\240\000\000\000\239\000\241\000\000\000\000\000\000\000\000\000\000\000\000\000\174\000\129\000\000\000\000\000\130\000\231\000\000\000\000\000\000\000\225\000\235\001\015\000\000\000\000\000\000\000\233\000\000\000\000\002j\000\000\002k\000\000\000\000\000\174\000\130\000\242\000\000\000\000\001S\000\225\002l\001\015\000\000\000\000\000\000\000\233\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\130\000\000\004\181\000\000\000\000\002m\000\239\000\000\004\182\000\000\002n\000\000\000\000\000\000\002o\000\000\000\240\000\000\000\000\000\241\002p\000\000\000\000\000\130\002\145\000\000\000\239\000\000\000\225\000\000\001\015\000\000\000\240\000\000\000\233\000\241\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\011\000\000\000\000\000\000\000\000\000\000\000\000\000\242\000\000\000\000\000\000\000\000\000\000\000\129\000\000\000\000\002\011\000\231\000\000\000\000\000\000\000\000\000\232\000\242\000\239\003\021\004\203\000\000\000\000\001H\000\000\000\000\000\000\001S\000\000\000\000\001\017\000\000\000\000\002;\000\000\003\027\000\000\002<\000\000\000\240\000\000\002=\000\241\001S\000\000\000\000\001\017\000\000\000\000\000\244\000\000\000\000\000\000\001\025\000\000\000\000\000\000\001\019\000\000\000\240\000\000\000\000\000\241\000\000\000\246\000\244\000\000\002\011\000\000\001\025\004\195\000\000\000\130\001\019\000\242\000\000\000\000\000\225\000\240\000\000\000\246\004\196\000\000\000\233\000\000\000\000\000\000\002\011\000\000\000\000\000\000\000\000\003\031\000\000\000\242\004\205\000\000\000\000\002\174\000\000\001S\000\240\002>\001\017\000\241\002;\000\000\000\000\002?\002<\002;\000\000\004\137\002=\002<\000\000\000\000\000\239\002=\000\000\001S\000\000\000\244\001\017\000\000\000\000\001\025\000\000\000\000\004\158\001\019\001P\000\000\000\000\000\000\002\175\000\242\000\246\000\000\001S\004\207\000\000\000\244\000\000\000\000\000\000\001\025\000\000\000\000\000\000\001\019\000\129\000\000\000\000\004\160\000\231\000\000\000\246\004\208\000\000\000\235\000\000\001S\004\209\000\000\001\017\000\000\004\210\000\000\000\000\002\174\000\000\002\176\004\211\002>\002\174\000\000\000\000\000\000\002>\002?\000\000\002;\000\000\000\244\002?\002<\000\000\001\025\000\000\002=\000\000\001\019\000\000\000\000\000\000\000\000\000\000\000\000\000\246\000\240\000\000\002\178\000\241\000\000\000\000\000\000\002\175\000\000\000\000\000\000\000\000\002\175\000\000\000\000\000\000\000\130\000\000\002\171\002\241\002\216\000\225\000\000\001\015\002;\000\000\000\240\000\233\002<\002\172\000\000\000\000\002=\000\000\000\000\000\242\000\000\000\000\000\000\000\000\001\020\000\000\000\000\000\000\002\176\000\000\000\000\002\174\000\000\002\176\002\227\002>\000\000\000\000\000\000\000\000\002\219\002?\000\000\000\000\000\000\000\239\000\000\000\000\000\000\002\181\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\178\000\000\000\000\000\000\000\000\002\178\000\000\000\000\000\000\000\248\002\175\000\000\000\000\000\000\000\000\002\174\002\171\002\238\002\216\002>\001\029\002\171\002\235\002\216\000\240\002?\000\000\002\172\000\000\000\240\000\000\000\000\002\172\000\000\002\183\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\176\002\227\002\184\000\000\000\000\002\175\002\227\002\219\000\000\000\000\000\000\002;\002\219\000\000\000\000\002<\002\181\000\000\000\000\002=\000\000\002\181\000\000\000\240\000\000\000\000\000\241\000\000\000\000\000\000\002\178\000\000\000\000\000\000\000\000\000\000\002;\000\000\000\000\000\000\002<\000\000\002\176\000\000\002=\000\000\002\171\002\233\002\216\000\000\000\000\001\024\000\129\000\000\000\240\000\000\000\231\002\172\000\242\002\183\000\000\000\235\000\000\000\000\002\183\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\178\000\000\002\184\000\000\002\174\000\000\002\227\002\184\002>\000\000\000\000\000\000\002\219\000\000\002?\001\017\002\171\002\214\002\216\000\129\000\000\002\181\000\000\000\231\000\240\000\000\000\000\002\172\000\235\002\174\000\000\000\129\000\000\002>\000\244\000\231\000\000\000\000\001\025\002?\000\232\002\175\001\019\000\000\000\000\000\130\000\000\000\000\002\227\000\246\000\225\000\000\001\015\000\000\002\219\000\000\000\233\000\000\000\000\000\000\000\000\000\000\000\000\002\181\002\183\000\000\002\175\000\000\000\000\000\000\000\000\000\000\000\129\000\000\000\000\000\000\000\231\000\000\002\176\002\184\000\000\000\235\000\000\000\000\000\130\000\000\000\000\000\000\000\000\000\225\000\239\001\015\000\000\000\129\000\000\000\233\000\130\000\231\000\000\000\000\000\000\000\225\000\235\002\176\000\000\000\000\002\183\000\233\002\178\000\000\000\000\000\000\000\000\000\129\000\000\000\000\002\017\000\231\000\000\000\000\000\000\002\184\000\235\000\000\002\171\004\245\002\216\000\000\000\000\000\239\000\000\000\000\000\240\002\178\000\129\002\172\000\000\000\130\000\231\000\000\000\000\000\239\000\225\000\235\001\015\000\000\000\000\000\000\000\233\002\171\007\223\002\216\000\000\000\000\000\000\000\000\002\227\000\240\000\130\000\000\002\172\002t\002\219\000\225\000\000\001\015\000\000\000\000\000\000\000\233\000\000\002\181\000\000\000\240\000\000\000\000\000\241\000\000\000\130\000\000\000\000\002\227\000\239\000\225\000\000\001\015\000\000\002\219\000\000\000\233\000\000\000\000\000\000\000\000\000\000\000\000\002\181\000\000\000\000\000\130\000\000\001J\000\000\000\239\000\225\000\000\001\015\004R\000\242\000\000\000\233\000\000\000\240\000\000\002\183\000\241\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\239\000\240\000\000\000\129\000\241\000\000\002\184\000\231\000\000\000\000\000\000\000\000\000\235\000\000\001\017\000\000\002\183\002\231\000\000\000\000\000\000\000\239\000\000\000\000\000\242\000\129\000\000\000\000\000\000\000\231\000\000\002\184\000\000\000\244\000\235\000\000\000\242\001\025\000\000\000\000\000\000\001\019\000\240\000\000\000\000\000\241\000\000\000\129\000\246\000\000\000\000\000\231\000\000\001\017\000\000\000\000\000\235\000\000\004c\000\000\000\000\000\000\000\000\000\240\000\000\000\000\000\241\000\000\000\130\000\000\001\024\000\000\000\244\000\225\000\000\001\015\001\025\000\242\004o\000\233\001\019\000\000\000\000\000\240\001E\000\000\000\241\000\246\000\000\000\000\000\130\002\231\004\215\000\000\000\000\000\225\000\000\001\015\000\242\004w\000\000\000\233\000\000\000\000\000\240\000\000\001\017\000\241\000\000\000\000\000\000\002\231\000\130\000\239\000\000\000\000\000\000\000\225\000\242\001\015\000\000\000\000\000\000\000\233\000\000\000\244\000\000\001\017\000\000\001\025\000\000\000\000\002\231\001\019\000\000\000\239\005\016\000\000\000\000\000\242\000\246\000\000\000\000\000\000\000\129\000\000\000\244\001\017\000\231\000\000\001\025\000\000\000\000\000\235\001\019\000\000\000\000\000\239\000\000\000\000\000\129\000\246\000\000\000\000\000\231\000\000\000\244\000\000\001\017\000\235\001\025\000\000\000\000\000\000\001\019\000\000\000\000\000\000\000\000\000\000\000\000\000\246\000\000\000\000\000\000\000\000\000\000\000\244\000\000\000\000\000\000\001\025\000\000\000\000\000\000\001\019\000\240\000\129\000\000\000\241\000\000\000\231\000\246\000\000\000\000\000\000\000\235\000\000\000\000\000\130\000\000\000\000\000\000\004~\000\225\000\000\001\015\000\000\000\240\000\000\000\233\000\241\000\000\000\000\001\024\000\130\000\000\000\000\000\000\000\000\000\225\000\242\001\015\005\018\000\000\000\000\000\233\000\000\000\129\000\000\000\240\000\000\000\231\000\241\000\000\000\000\002\231\000\235\000\000\005\020\000\000\000\000\000\000\000\242\000\239\000\000\000\000\000\000\000\000\000\129\001\017\000\000\000\130\000\222\004\176\000\000\000\000\000\225\001\024\001\015\000\239\000\000\000\000\000\233\000\000\000\242\000\000\000\000\000\000\000\244\000\000\000\000\001\017\001\025\000\000\000\000\000\000\001\019\000\000\000\000\000\000\000\000\000\000\000\000\000\246\000\000\000\000\000\000\000\000\000\000\000\000\000\244\000\000\000\130\001\017\001\025\000\000\000\239\000\225\001\019\001\015\000\000\000\000\000\000\000\233\000\000\000\246\000\000\000\000\000\000\000\000\000\000\000\000\000\244\000\130\000\000\000\000\001\025\000\000\000\225\000\000\001\019\000\129\000\000\000\000\000\226\000\231\000\240\000\246\000\000\000\241\000\235\000\000\000\000\000\000\000\000\000\000\000\000\000\239\000\000\000\000\000\000\000\000\000\240\000\000\000\000\000\241\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\024\000\000\000\000\000\000\000\239\000\000\000\000\000\242\000\129\000\000\000\000\000\000\000\231\000\000\000\000\000\000\001\024\000\235\000\000\000\000\005]\000\000\000\000\000\242\000\000\000\240\000\000\000\000\000\241\000\000\002;\000\000\000\130\000\000\002<\000\000\001\017\000\225\002=\001\015\000\000\000\000\000\000\000\233\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\017\002\231\000\000\000\244\000\000\000\000\000\000\001\025\000\242\005j\000\000\001\019\000\000\000\000\000\240\000\000\000\000\000\241\000\246\000\244\000\000\000\130\000\000\001\025\000\000\000\239\000\225\001\019\001\015\000\000\000\000\000\000\000\233\000\000\000\246\000\240\000\000\001\017\000\241\000\000\000\000\000\000\002\231\002\174\000\000\000\000\000\000\002>\000\000\000\242\000\129\000\000\000\000\002?\000\231\000\000\000\244\000\000\000\000\000\235\001\025\000\000\000\000\000\129\001\019\000\000\000\239\000\231\000\000\000\000\000\242\000\246\000\235\000\000\000\000\000\000\000\000\000\000\001\017\000\000\002\222\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\244\000\000\000\000\000\000\001\025\000\000\005s\000\000\001\019\000\000\000\000\000\240\000\000\000\129\000\241\000\246\000\000\000\231\000\130\000\000\002\176\000\000\000\235\000\225\000\000\001\015\000\000\000\000\000\000\000\233\000\000\000\130\000\000\000\000\000\000\000\000\000\225\000\000\001\015\002\231\000\000\000\000\000\233\000\000\000\000\000\000\000\242\005{\000\000\000\000\002\178\000\000\000\240\000\000\000\000\000\241\000\000\000\000\000\000\000\000\000\129\000\000\000\000\000\239\000\231\000\000\002\171\000\000\002\216\000\235\000\000\000\000\000\000\000\000\000\240\001\017\000\239\002\172\000\130\000\000\002\231\000\000\000\000\000\225\000\000\001\015\000\000\000\242\000\000\000\233\000\000\000\000\000\000\000\000\000\244\000\000\000\000\000\000\001\025\000\000\000\000\000\000\001\019\000\129\002\219\000\000\000\000\000\231\000\000\000\246\000\000\000\000\000\235\002\181\000\000\000\000\001\017\000\000\000\000\000\000\000\129\000\000\000\000\000\239\000\231\000\130\000\000\000\000\000\000\000\235\000\225\000\000\001\015\000\000\000\000\000\244\000\233\000\000\000\000\001\025\000\000\005\230\000\000\001\019\000\000\000\000\000\240\000\000\000\000\000\241\000\246\000\000\000\000\000\000\005\242\000\000\002\183\000\000\000\000\000\240\000\000\000\000\000\241\000\000\000\000\000\000\000\000\000\000\000\130\000\000\000\239\002\184\000\000\000\225\002\231\001\015\000\000\000\000\000\000\000\233\000\000\000\242\000\129\000\000\000\000\000\130\000\231\002\231\000\000\000\000\000\225\000\235\001\015\000\000\000\242\000\000\000\233\000\000\000\000\000\000\000\000\005\247\000\000\000\000\000\000\000\000\000\240\000\000\000\000\000\241\001\017\000\000\000\000\000\239\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\017\000\000\000\000\000\000\000\000\000\000\000\244\000\239\000\000\000\000\001\025\002\231\000\000\000\000\001\019\000\000\000\000\000\000\000\242\000\244\000\000\000\246\000\000\001\025\000\130\005\254\000\000\001\019\000\000\000\225\000\240\001\015\000\000\000\241\000\246\000\233\000\000\000\000\000\000\000\000\000\129\000\000\000\000\000\000\000\231\000\000\000\000\001\017\000\000\000\235\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\231\000\000\000\000\000\000\000\000\000\000\000\000\000\242\000\244\000\000\006\007\000\239\001\025\000\000\000\000\000\240\001\019\000\000\000\241\000\000\000\000\000\000\000\000\000\246\000\000\000\000\000\000\006\020\000\000\000\000\000\000\000\000\000\240\000\000\000\000\000\241\001\017\000\000\000\000\000\000\000\129\000\000\000\000\002\231\000\231\000\000\000\000\000\130\000\000\000\235\000\242\000\000\000\225\000\000\001\015\000\244\000\000\000\000\000\233\001\025\002\231\000\000\000\000\001\019\000\000\000\000\000\000\000\242\000\000\000\000\000\246\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\017\000\000\000\129\000\000\000\000\000\000\000\231\000\000\000\000\000\000\006!\000\235\000\129\000\239\000\000\000\240\000\231\001\017\000\241\000\244\000\000\000\235\007\187\001\025\000\000\000\000\000\130\001\019\000\000\000\000\000\000\000\225\b \001\015\000\246\000\000\000\244\000\233\000\000\000\000\001\025\000\000\000\000\002\231\001\019\000\000\000\000\000\000\000\000\000\000\000\242\000\246\000\000\000\129\000\000\000\000\000\000\000\231\000\000\000\000\000\000\000\000\000\235\000\000\000\000\000\000\000\000\000\130\000\000\000\000\000\000\000\239\000\225\000\000\001\015\000\000\000\000\000\130\000\233\001\017\000\000\000\000\000\225\000\129\001\015\000\000\000\000\000\231\000\233\000\000\000\000\006&\000\235\000\000\000\000\000\000\000\240\000\000\000\244\000\241\000\000\000\000\001\025\000\000\000\000\000\000\001\019\000\000\000\000\000\000\000\000\000\000\000\239\000\246\000\000\000\000\000\000\000\000\000\130\000\000\000\000\000\000\000\239\000\225\002\231\001\015\000\000\000\000\000\000\000\233\000\000\000\242\000\000\000\000\000\129\000\000\000\000\000\000\000\231\000\000\000\000\000\000\000\000\000\235\000\000\000\000\000\000\000\000\000\130\006-\000\000\000\000\000\129\000\225\000\240\001\015\000\231\000\241\000\000\000\233\001\017\000\235\000\000\000\239\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\244\000\000\000\000\002\231\001\025\000\000\000\000\000\000\001\019\000\000\000\242\000\000\000\000\002;\000\239\000\246\000\240\002<\000\000\000\241\000\130\002=\000\000\000\000\000\000\000\225\000\240\001\015\000\000\000\241\000\000\000\233\000\000\000\000\000\000\000\000\000\000\000\000\000\130\001\017\000\000\000\000\000\000\000\225\007\188\001\015\000\000\000\000\000\000\000\233\000\000\000\242\000\000\000\000\007\188\000\000\000\000\000\000\000\244\000\000\000\000\000\242\001\025\000\000\000\000\000\239\001\019\000\240\000\000\000\000\000\241\000\000\000\000\000\246\000\000\000\000\000\000\000\129\002\174\000\000\001\017\000\231\002>\000\239\000\000\000\000\000\235\000\000\002?\000\000\001\017\000\000\000\000\000\000\000\000\001L\000\000\000\240\000\000\000\244\000\241\000\000\000\242\001\025\000\000\000\000\000\000\001\019\000\000\000\244\000\000\000\000\000\000\001\025\000\246\002\225\000\000\001\019\000\000\000\000\000\000\000\000\000\000\000\000\000\246\002\026\000\000\000\000\000\000\000\000\000\000\001\017\000\242\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\130\000\000\000\000\000\000\000\000\000\225\000\240\001\015\000\244\000\241\002\176\000\233\001\025\000\000\000\000\000\000\001\019\000\000\000\000\001\017\000\000\000\000\000\000\000\246\000\240\000\000\000\000\000\241\000\000\000\000\000\000\000\000\000\000\000\000\002\028\000\000\000\000\000\000\000\244\000\000\002\178\000\242\001\025\000\000\000\000\000\239\001\019\000\000\000\000\000\000\000\000\000\000\002\149\000\246\000\000\000\000\002\171\000\000\002\216\000\242\000\000\000\000\000\129\000\000\000\240\000\000\000\231\002\172\000\000\000\000\001\017\000\235\000\129\000\000\000\000\000\000\000\231\000\000\000\000\000\000\000\000\000\235\000\000\000\000\000\000\000\000\000\000\000\000\001\017\000\244\000\000\000\000\000\129\001\025\002\219\000\000\000\231\001\019\000\000\000\000\000\000\000\235\000\000\002\181\000\246\000\000\000\000\000\244\000\000\000\000\000\000\001\025\000\000\000\000\000\000\001\019\000\000\000\000\000\000\000\000\000\000\000\000\000\246\000\000\000\000\000\000\000\000\000\130\000\240\000\000\000\000\000\241\000\225\000\000\001\015\000\000\000\000\000\130\000\233\000\000\000\000\000\000\000\225\000\000\001\015\000\000\002\183\000\000\000\233\000\000\000\000\000\129\000\000\000\000\000\000\000\231\002\165\000\130\000\000\000\000\000\232\002\184\000\225\000\242\001\015\000\129\000\129\000\000\000\233\000\231\000\231\000\000\000\239\000\000\000\235\000\235\000\000\000\000\000\000\000\000\000\000\000\000\000\239\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\239\000\000\000\000\000\000\000\000\000\000\000\129\000\000\000\000\000\244\000\231\000\000\000\000\001\025\000\130\000\235\000\000\001\019\000\000\000\225\000\000\000\000\000\000\000\000\000\246\000\233\000\000\000\000\000\130\000\130\000\000\000\000\000\000\000\225\000\225\001\015\001\015\000\000\000\000\000\233\000\233\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\240\000\000\000\000\000\241\000\000\000\000\000\239\000\000\000\000\000\000\000\240\000\000\000\000\000\241\000\000\000\000\000\000\000\000\000\130\000\000\000\239\000\239\000\000\000\225\000\000\001\015\000\000\000\000\003\b\000\233\000\240\000\000\000\000\000\241\000\000\000\242\000\000\000\000\004A\000\000\000\000\000\000\000\000\000\000\000\000\000\242\000\129\000\000\000\000\000\000\000\231\000\000\000\000\000\000\000\000\000\235\000\000\000\000\004G\000\000\000\000\000\000\000\000\000\239\001\017\000\242\000\000\000\000\000\000\000\000\000\000\000\000\000\129\000\000\001\017\000\000\000\231\000\000\000\000\000\000\000\000\000\235\000\000\000\244\000\000\000\000\000\000\001\025\000\000\000\240\000\000\001\019\000\241\000\244\001\017\000\000\000\000\001\025\000\246\000\000\000\000\001\019\000\000\000\240\000\240\000\000\000\241\000\241\000\246\000\000\000\000\000\130\000\000\000\244\000\000\000\000\000\225\001\025\001\015\000\000\000\000\001\019\000\233\000\000\000\242\000\000\000\000\000\000\000\246\000\000\000\000\004\142\004\147\000\000\000\000\000\000\000\000\000\130\000\242\000\242\000\000\000\000\000\225\000\129\001\015\000\000\000\240\000\231\000\233\000\241\000\000\000\000\000\235\000\000\000\000\000\000\000\239\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\017\001\017\000\000\000\000\000\000\000\248\000\000\004\151\000\000\000\129\000\000\000\000\000\000\000\231\000\242\000\239\001\031\000\000\000\235\000\244\000\244\000\000\000\000\001\025\001\025\000\000\000\000\001\019\001\019\000\000\000\000\000\000\000\000\000\000\000\246\000\246\000\000\000\000\000\000\000\000\000\000\000\130\000\000\001\017\000\000\000\000\000\225\000\000\001\015\000\000\000\000\000\129\000\233\000\000\000\000\000\231\000\000\000\000\000\000\000\000\000\235\000\000\000\244\000\000\000\000\000\000\001\025\000\000\000\000\000\129\001\019\000\000\000\240\000\231\000\130\000\241\000\000\000\246\000\235\000\225\000\000\001\015\000\000\000\000\000\000\000\233\000\239\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\240\000\000\004\189\000\241\000\000\000\000\000\000\000\000\000\129\000\242\000\129\000\000\000\231\000\000\000\231\000\000\000\000\000\232\000\130\000\235\000\000\000\239\000\000\000\225\000\000\001\015\000\000\000\000\005\b\000\233\000\000\000\000\000\000\000\000\000\000\000\242\000\130\000\000\001\017\000\000\000\000\000\225\000\000\001\015\000\000\000\000\000\000\000\233\000\000\000\129\000\000\000\000\000\000\000\231\000\000\000\000\000\000\000\244\000\235\000\000\000\000\001\025\000\000\000\239\001\017\001\019\000\000\000\000\000\000\000\000\000\000\000\240\000\246\000\130\000\241\000\130\000\000\000\000\000\225\000\000\000\225\000\239\001\015\000\244\000\233\000\000\000\233\001\025\000\000\000\000\000\000\001\019\000\000\000\000\000\000\000\000\000\000\000\000\000\246\0053\000\000\000\000\000\000\000\000\000\240\000\000\000\242\000\241\000\000\000\000\000\000\000\000\000\000\000\000\000\130\000\000\000\000\000\000\000\239\000\225\000\239\001\015\000\000\000\000\000\129\000\233\000\000\000\000\000\231\000\000\000\000\000\000\005\217\000\235\000\000\001\017\000\000\000\000\000\000\000\242\000\000\000\000\000\000\000\000\000\000\000\000\000\240\000\000\000\129\000\241\000\000\000\000\000\231\000\000\000\244\000\000\000\000\000\235\001\025\000\239\000\000\000\000\001\019\000\000\000\240\000\000\000\000\000\241\001\017\000\246\000\000\000\000\000\000\000\000\006C\000\000\000\000\000\000\000\000\000\000\000\000\000\242\000\000\000\000\000\000\000\000\000\000\000\244\000\000\000\130\000\000\001\025\006W\000\000\000\225\001\019\001\015\000\000\000\000\000\242\000\233\000\240\000\246\000\240\000\241\000\000\000\241\000\000\000\000\000\000\001\017\000\000\000\000\000\130\000\000\000\000\000\000\000\129\000\225\000\000\001\015\000\231\000\000\000\000\000\233\000\000\000\235\000\000\001\017\000\244\000\000\006Y\000\000\001\025\000\239\000\000\000\242\001\019\000\242\000\000\000\000\000\000\000\240\000\000\000\246\000\241\000\000\000\244\000\129\000\000\000\000\001\025\000\231\000\000\000\000\001\019\000\129\000\232\000\239\000\000\000\231\000\000\000\246\000\000\000\000\000\235\000\000\001\017\000\000\000\000\006[\000\000\000\129\000\000\000\000\000\000\000\231\000\242\000\000\000\000\000\000\000\232\000\130\000\000\000\248\000\000\000\244\000\225\000\000\001\015\001\025\000\000\000\000\000\233\001\019\001!\000\000\000\000\000\000\000\000\000\000\000\246\000\000\000\000\000\000\000\000\001\017\000\000\000\000\000\000\000\129\000\000\000\000\000\130\000\231\000\000\000\000\000\240\000\225\000\232\000\241\000\130\000\000\000\000\000\233\000\244\000\225\000\239\000\000\001\025\000\000\000\000\000\233\001\019\000\000\000\000\000\000\000\130\000\000\000\000\000\246\000\240\000\225\000\000\000\241\006a\000\129\000\000\000\233\000\000\000\231\000\000\000\242\000\129\000\000\000\232\000\000\000\231\000\239\000\000\000\000\000\129\000\232\000\000\000\000\000\231\000\239\000\000\000\000\006r\000\232\000\000\000\000\000\000\000\000\000\130\000\242\000\000\000\000\000\000\000\225\001\017\000\239\000\000\000\000\000\000\000\233\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\129\000\000\000\000\000\244\000\231\000\000\000\000\001\025\001\017\000\232\000\000\001\019\000\000\000\240\000\130\000\000\000\241\000\000\000\246\000\225\000\000\000\130\000\000\000\239\000\000\000\233\000\225\000\244\000\000\000\130\000\000\001\025\000\233\000\000\000\225\001\019\000\000\000\000\000\000\000\000\000\233\006\128\000\246\000\000\000\240\000\000\000\000\000\241\000\242\000\129\000\000\000\000\000\240\000\231\000\000\000\241\000\000\000\000\000\232\000\239\000\000\000\000\000\000\000\000\000\000\000\130\000\239\000\000\000\240\000\000\000\225\000\241\000\000\000\000\000\239\000\000\000\233\001\017\000\000\000\242\000\000\000\000\000\000\000\000\000\000\004\217\000\000\000\242\000\129\000\000\000\000\000\000\000\231\000\000\000\000\000\000\000\244\000\232\000\129\000\000\001\025\000\000\000\231\000\242\001\019\000\000\000\240\000\232\000\000\000\241\000\239\000\246\000\000\000\000\000\130\000\000\001\017\000\000\000\000\000\225\000\000\000\000\000\000\000\000\000\000\000\233\000\000\000\248\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\244\000\000\000\000\001#\001\023\000\000\000\242\000\240\001\019\000\000\000\241\000\000\000\000\000\000\000\240\000\246\000\248\000\241\000\130\000\000\000\000\000\000\000\240\000\225\000\239\000\241\000\129\001%\000\130\000\233\000\231\000\000\000\000\000\225\000\000\000\232\000\000\000\000\000\000\000\233\000\000\000\129\000\242\000\000\000\000\000\231\000\000\000\000\000\000\000\242\000\232\000\000\000\000\000\000\000\248\000\129\000\000\000\242\000\240\000\231\000\000\000\241\000\129\000\239\000\232\001'\000\231\000\000\000\000\000\000\000\000\000\232\000\000\000\239\000\000\000\000\000\000\000\000\000\129\000\000\000\000\000\000\000\231\000\000\000\000\000\000\000\000\000\232\000\000\000\000\000\248\000\130\000\000\000\242\000\000\000\000\000\225\000\248\000\000\000\000\000\000\001)\000\233\000\000\000\000\000\248\000\130\000\240\001+\000\000\000\241\000\225\000\000\000\000\000\000\000\000\001-\000\233\000\000\000\000\000\130\000\000\000\000\000\000\000\000\000\225\000\000\000\130\000\000\000\000\000\000\000\233\000\225\000\000\000\000\000\000\000\239\000\000\000\233\000\000\000\000\000\248\000\242\000\130\000\000\000\000\000\240\000\000\000\225\000\241\000\000\000\239\001/\000\000\000\233\000\000\000\240\000\000\000\000\000\241\000\129\000\000\000\129\000\000\000\231\000\239\000\231\000\000\000\000\000\232\000\000\000\232\000\239\000\000\000\000\000\000\000\129\000\000\000\000\000\000\000\231\000\242\000\000\000\000\000\000\000\232\000\000\000\000\000\239\000\000\000\248\000\242\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0011\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\129\000\000\000\000\000\000\000\231\000\000\000\000\000\240\000\000\000\232\000\241\000\000\000\000\000\130\000\000\000\130\000\000\000\248\000\225\000\000\000\225\000\000\000\240\000\000\000\233\000\241\000\233\000\248\0013\000\130\000\000\000\000\000\000\000\000\000\225\000\000\000\240\000\000\0015\000\241\000\233\000\000\000\242\000\240\000\000\000\000\000\241\000\000\000\000\000\000\000\000\000\000\000\129\000\000\000\000\000\000\000\231\000\242\000\239\000\240\000\239\000\232\000\241\000\000\000\129\000\130\000\000\000\000\000\231\000\000\000\225\000\242\000\000\000\232\000\239\000\000\000\233\000\000\000\242\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\129\000\248\000\000\000\000\000\231\000\242\000\000\000\000\000\000\000\232\000\000\000\000\0017\000\000\000\129\000\000\000\248\000\000\000\231\000\000\000\000\000\239\000\000\000\232\000\000\000\000\000\000\0019\000\130\000\000\000\248\000\000\000\000\000\225\000\000\000\000\000\000\000\248\000\000\000\233\000\130\002r\000\000\000\000\000\000\000\225\000\000\000\000\002x\000\000\000\000\000\233\000\240\000\248\000\240\000\241\000\000\000\241\000\000\000\000\000\000\000\000\000\000\000\000\002z\000\130\000\000\000\000\000\240\000\000\000\225\000\241\000\000\000\239\000\000\000\000\000\233\000\000\000\000\000\130\000\000\000\000\000\129\000\000\000\225\000\239\000\231\000\242\000\000\000\242\000\233\000\232\000\000\000\000\000\000\000\000\000\129\000\000\000\000\000\000\000\231\000\000\000\000\000\242\000\240\000\232\000\000\000\241\000\000\000\129\000\239\000\000\000\000\000\231\000\000\000\000\000\000\000\000\000\232\000\129\000\000\000\000\000\000\000\231\000\239\000\000\000\000\000\000\000\232\000\000\000\000\000\000\000\000\000\000\000\000\000\248\000\000\000\248\000\000\000\242\000\000\000\000\000\000\000\000\000\000\000\000\002|\000\130\002~\000\000\000\000\000\248\000\225\000\000\000\000\000\000\000\240\000\000\000\233\000\241\000\129\000\130\002\128\000\000\000\231\000\000\000\225\000\000\000\240\000\232\000\000\000\241\000\233\000\000\000\130\000\000\000\000\000\000\000\000\000\225\000\000\000\000\000\000\000\000\000\130\000\233\000\000\000\248\000\000\000\225\000\000\000\242\000\239\000\240\000\000\000\233\000\241\000\000\002\130\000\000\000\000\000\000\000\000\000\242\000\129\000\000\000\239\000\240\000\231\000\000\000\241\000\000\000\129\000\232\000\000\000\000\000\231\000\000\000\000\000\239\000\000\000\232\000\000\000\000\000\000\000\130\000\000\000\000\000\242\000\239\000\225\000\000\000\000\000\000\000\000\000\000\000\233\000\000\000\000\000\248\000\000\000\000\000\242\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\132\000\248\000\000\000\000\000\000\000\129\000\129\000\000\000\000\000\231\000\231\000\000\002\134\000\000\000\232\000\232\000\000\000\000\000\000\000\130\000\239\000\000\000\000\000\000\000\225\000\240\000\248\000\130\000\241\000\000\000\233\000\000\000\225\000\000\000\000\000\000\000\000\002\136\000\233\000\240\000\248\000\000\000\241\000\000\000\129\000\000\000\000\000\000\000\231\000\000\000\000\002\138\000\240\000\232\000\000\000\241\000\000\000\000\000\000\000\000\000\242\000\000\000\240\000\000\000\239\000\241\000\000\000\000\000\000\000\000\000\130\000\130\000\239\000\000\000\242\000\225\000\225\000\000\000\000\000\000\000\000\000\233\000\233\000\000\000\000\000\000\000\000\000\242\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\129\000\000\000\242\000\000\000\231\000\000\000\000\000\000\000\240\000\232\000\000\000\241\000\000\000\248\000\130\000\000\000\000\000\000\000\000\000\225\000\239\000\239\000\000\000\000\002\140\000\233\000\000\000\248\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\142\000\000\000\248\000\000\000\000\000\242\000\000\000\000\000\000\000\000\000\000\000\129\000\248\002\144\000\240\000\231\000\000\000\241\000\000\000\000\000\232\000\239\000\240\002\186\000\000\000\241\000\129\000\130\000\000\000\000\000\231\000\000\000\225\000\129\000\000\000\232\000\000\000\231\000\233\000\000\000\000\000\129\000\232\000\000\000\000\000\231\000\000\000\000\000\000\000\242\000\232\000\000\000\000\000\248\000\129\000\000\000\000\000\242\000\231\000\000\000\000\000\000\000\000\000\232\002\188\000\240\000\240\000\000\000\241\000\241\000\000\000\000\000\239\000\000\000\000\000\000\000\130\000\000\000\000\000\000\000\000\000\225\000\000\000\000\000\000\000\000\000\000\000\233\000\000\000\000\000\000\000\130\000\000\000\000\000\000\000\000\000\225\000\248\000\130\000\000\000\242\000\242\000\233\000\225\000\240\000\248\000\130\000\241\002\190\000\233\000\000\000\225\000\000\000\000\000\000\000\000\002\192\000\233\000\129\000\130\000\000\000\239\000\231\000\000\000\225\000\000\000\000\000\232\000\000\000\000\000\233\000\000\000\000\000\000\000\000\000\000\000\239\000\000\000\129\000\242\000\000\000\000\000\231\000\239\000\000\000\000\000\000\000\232\000\248\000\248\000\000\000\239\000\000\000\000\000\000\000\240\000\000\000\000\000\241\002\194\002\196\000\000\000\000\000\000\000\239\000\129\000\000\000\000\000\000\000\231\000\000\000\000\000\000\000\000\000\232\000\129\000\000\000\000\000\000\000\231\000\000\000\000\000\000\000\130\000\232\000\000\000\000\000\248\000\225\000\000\000\242\000\000\000\000\000\000\000\233\000\000\000\000\000\000\002\198\000\000\000\000\000\000\000\129\000\130\000\240\000\000\000\231\000\241\000\225\000\000\000\000\000\232\000\000\000\000\000\233\000\000\000\129\000\000\000\000\000\240\000\231\000\000\000\241\000\000\000\000\000\232\000\240\000\000\000\239\000\241\000\130\000\000\000\000\000\000\000\240\000\225\000\000\000\241\000\248\000\242\000\130\000\233\000\000\000\000\000\000\000\225\000\000\000\240\000\239\002\200\000\241\000\233\000\000\000\129\000\242\000\000\000\000\000\231\000\000\000\000\000\000\000\242\000\232\000\000\000\000\000\000\000\000\000\130\000\000\000\242\000\000\000\000\000\225\000\000\000\000\000\239\000\000\000\000\000\233\000\129\000\129\000\130\000\242\000\231\000\231\000\239\000\225\000\248\000\232\000\232\000\000\000\000\000\233\000\000\000\000\000\000\000\000\000\129\002\202\000\000\000\000\000\231\000\248\000\000\000\000\000\000\000\232\000\000\000\000\000\248\000\000\000\240\000\239\002\204\000\241\000\000\000\000\000\248\000\130\000\000\002\206\000\000\000\000\000\225\000\000\000\000\000\239\000\000\002\208\000\233\000\248\000\240\000\000\000\000\000\241\000\000\000\000\000\000\000\000\000\000\000\000\002\210\000\000\000\129\000\130\000\130\000\242\000\231\000\000\000\225\000\225\000\000\000\232\000\000\000\000\000\233\000\233\000\000\000\240\000\000\000\000\000\241\000\130\000\239\000\000\000\000\000\242\000\225\000\240\000\000\000\000\000\241\000\129\000\233\000\000\000\000\000\231\000\000\000\000\000\000\000\000\000\232\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\239\000\239\000\000\000\000\000\242\000\248\000\240\000\000\000\000\000\241\000\000\000\000\000\000\000\000\000\242\000\000\002\212\000\000\000\239\000\130\000\240\000\000\000\000\000\241\000\225\000\248\000\000\000\000\000\000\000\129\000\233\000\000\000\000\000\231\000\000\000\000\004\213\000\000\000\232\000\000\000\000\000\242\000\000\000\000\000\000\000\000\000\000\000\129\000\130\000\000\000\000\000\231\000\248\000\225\000\000\000\242\000\232\000\240\000\000\000\233\000\241\000\000\000\248\004\219\000\239\000\129\000\000\000\000\000\000\000\231\000\000\000\000\000\000\004\221\000\232\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\240\000\240\000\000\000\241\000\241\000\000\000\248\000\000\000\000\000\242\000\239\000\130\000\000\000\000\000\000\000\129\000\225\004\223\000\240\000\231\000\248\000\241\000\233\000\000\000\232\000\000\000\000\000\000\000\000\000\130\000\000\004\225\000\000\000\000\000\225\000\242\000\242\000\000\000\000\000\000\000\233\000\000\000\000\000\000\000\000\000\000\000\000\000\130\000\000\000\000\000\000\000\000\000\225\000\242\000\000\000\000\000\239\000\248\000\233\000\000\000\000\000\000\000\000\000\000\000\240\000\000\000\000\000\241\004\227\000\000\000\000\000\000\000\000\000\000\000\239\000\000\000\000\000\000\000\000\000\000\000\130\000\000\000\000\000\248\000\248\000\225\000\000\000\000\000\000\000\000\000\000\000\233\000\239\000\240\004\229\004\231\000\241\000\000\000\000\000\242\000\000\000\248\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\233\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\239\000\000\000\000\000\242\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\240\000\000\000\000\000\241\000\000\000\000\000\000\000\000\000\248\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\240\004\235\000\000\000\241\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\242\000\240\000\248\000\000\000\241\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\237\000\000\000\000\000\000\000\000\000\242\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\240\000\000\000\242\000\241\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\248\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\239\000\000\000\000\000\000\000\000\000\000\000\000\000\248\000\000\000\000\000\242\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\241\000\000\000\000\000\000\000\000\000\000\000\000\000\248\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\243\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\019"))
+    ((16, "\000\243\000\025\000\000\000\000\000\000\000B\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\181\000\000\001S\002\000\000\000\001\031\001\005\000\000\000\000\000\000\000\139\000\133\000\000\000\000\000-\000\198\000\224\000\000\000\000\000\232\000\000\000\000\001n\000\000\001\162\000\000\000\000\000\000\002\128\000\000\002\252\000\000\000\000\000\000\003\148\000\000\003\184\000\000\000\000\003\242\003\248\000\000\000\000\0042\004h\004x\000\000\000\000\004z\000\000\000\000\004\142\000\000\004\204\000\000\000\000\000\000\005\020\000\000\005\030\000\000\005\232\005\238\000\000\000\000\005\250\000\000\006\"\006d\006\146\000\000\000\000\006\186\000\000\006\204\000\000\000\000\007\020\000\000\0070\000\000\000\005\000\000\003J\005\168\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\007\218\000\000\002|\000\000\000\000\003\\\000\000\000\000\002z\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\154\000\000\000\000\000\248\r,\000\000\000\000\0196\000\000\000\000\000\000\000\000\007<\000\000\007\140\007`\000\000\007\214\000\000\000\000\007\220\000\000\000\000\007\250\000\000\b\006\000\000\000\000\000\000\b:\000\000\000\154\bL\000'\000\000\002\222\000\000\000\000\000\000\000\182\000\000\002\184\000\000\000\000\000\000\000\190\000\000\000\000\005\004\001\t\011\130\000\000\000\000\0038\004\b\000\000\r\016\000\000\007\188\000\200\007Z\000\200\017\252\026\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\136\tn\000\000\000\000\012\224\015\216\018\030\000\000\020\016\003,\000\000\000\000\006,\020t\000\000\000\000\000\000\012~\000\000-\234.B(\228\000\000\000\000B0\000\000\n\b\000\000\017j\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\218\000\000\000\000\007&\000\000\t:\000\000\012\200\000\000\023\150\000\000\029\030\000\000!Z\000\000#4\000\000$\144\000\000&\188\000\000&\218\000\000#\150\000\000\016\012\000\000\000\000\000\000\000\000\012\030\000\000\000\000\000\000\000\0000\156\000\000:\230\000\000I\192\000\000I\212\000\000J\012\000\000J*\000\000Jr\000\000J\162\000\000K0\000\000KZ\000\000K\134\000\000K\184\000\000K\218\000\000LN\000\000Lh\000\000Lv\000\000\020(\000\000\000\000\023d\000\000\000\000\000\000\000\000\014x\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003NBX\000\000\003\132\000\000\000\000\000\017\005P\000\000\0007\b^\000\000\000\000\bt\b\138\000\000\000\000\b\142\b\186\b\192\000\000\000\000\b\198\000\000\000\000\b\232\000\000\t\012\000\000\000\000\000\000\tB\000\000\t`\000\000\tj\000\000\tz\000\000\000\000\t\132\t\136\000\000\000\000\t\142\t\170\t\178\000\000\000\000\t\188\000\000\000\000\t\224\000\000\t\226\000\000\000\000\000\000\t\242\000\000\nf\000\000\nz\n|\000\000\000\000\n\130\000\000\n\138\n\144\n\180\000\000\000\000\n\186\000\000\n\204\000\000\000\000\n\206\000\000\n\208\000\000\004z\b\b\000\000\n\210\000\000\n\220\016\140\000\000\n\226\000\000\000\000\n\228\000\000\011\002\000\000\011$\000\000\000\000\000\000\011,\000\000\011<\018H\000\000\000\000\000\000\011B\000\000\015\148\000\000\000\000\000\003\030\190\000\000\000\017\000\000\bR\000\000\000\000\005\162\000\180\000\000\000\000\000\000\000\000\n\168\001\140\000\000\nZ\000\000\000\000\000\000\017\002\000\000\017\232\000\000\r\140\000\000\000\000\000\000\000\000\000\000\000\000\021\216\000\000\000\000\000\183\000\000\0001\000\000\000\000\000\000\n\136\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0007\t\028\020\248\000\000\011F\000\000\011L\022\238\000\000\011X\000\000\000\000\000\000\b\194\000\000\000\000\000\000\000\000\003\210\000\000\000\000\015\170\000\000\000\000\000\000\004~\003\182\000\000\030r\018Z\000\000\000\000\000\000\000\000\025\020\028n\000\000\000\000\000\000\000\000\000\000\000\000\031\220\000\000\000\0002\014\000\000\000\0009\206\000\000\004|\000\000\005\228\000\000\000\000\000\000\022D\000\000.\1283\232\000\000\000\000\019L4:\000\000/\134\000\000;\240\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000L\154\000\000%\224\000\000+\204\000\000L\158\000\000L\202\000\000M(\000\000M8\000\000MX\000\000M\214\000\000N\n\000\000N>\000\000N^\000\000Nl\000\000N\156\000\000O\006\000\000O$\000\000\000\0004\146\000\000\000\000\000\0005\028\000\000\000\000\000\000\000\000\000\000\000\000C \000\000\000\000\000\000\022\186\000\000\000\000\000\000\000\000\000(\000\000\000\000\000\000\000\000\000t\000\000\000\000C4\000\000\000\000\000\000\014|\001*\000\000\000\000(*\000\000\000\0005t\000\000\000\000\000\000\003\026,..\160\000\000\000\000C\230\000\000D\014\000\000\000\000\000\00056\004\208\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000B\202\000\000\000\000\000\000\000\0009p6V\022\242\000\000TD\000\000\000\000TX\000\000\005\152\000\000\000\000\015b\000\000\000\000\000\000\023L\000\000.\212\000\000\000\000D0\000\000\000\000\000\000\023\146\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\006\000\000+x\000\000\001W\000\000\000\000\000\000O&\000\000O>\000\000O\162\000\000O\216\000\000O\236\000\000P\012\000\000P\026\000\000Pj\000\000P\210\000\000QD\000\000Qt\000\000Q\130\000\000Q\166\000\000Q\224\000\000\000\000\000\000\000\000\000\000\026\252\000\000\000\000\031|)\014\000\000\000\0009\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0007\128\000\0007\020\000\000\000\000\000\000\000\000\000\0007R\000\000\000\000\000\0007\176\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011b\000\000\011h\024$\000\000\011v\000\000\000\000\004(\001f\000\000\004|\000\000\000\000\000\000\000\000\000\017\000\000\011z\000\000\000\000\001&\005\176\000\000\007\196\000\000\000\000\000\000\002\022\000\000\017\190\007\004\011|\000\000\000\000\011\130\011\134\000\000\000\000\011\136\011\138\011\152\000\000\000\000\011\154\000\000\000\000\011\156\000\000\011\162\000\000\000\000\000\000\011\186\000\000\011\190\000\000\011\198\000\000\011\216\000\000\000\000\011\218\011\228\000\000\000\000\011\230\011\232\011\250\000\000\000\000\012\b\000\000\000\000\012\012\000\000\012\014\000\000\000\000\000\000\012\018\000\000\012\020\000\000\012\024\012\026\000\000\000\000\012\"\000\000\012&\012@\012h\000\000\000\000\012z\000\000\012|\000\000\000\000\012\142\000\000\012\144\000\000\006\130\017\018\000\000\012\150\000\000\012\152\029x\000\000\012\160\000\000\000\000\012\164\000\000\012\168\000\000\012\184\000\000\000\000\000\000\012\188\000\000\0062\000\000\000\000\000\000\005\152\b\020\000\000\000\000\005\204\000\000\000\000\012\192\025\004\000\000\012\194\000\000\000\000\000\000\001\014\000\000\000\000\000\000\002\148\000\000\000\000\000\000\000\000\000\000\r\176\026\012\000\000\012\196\000\000\012\200\029\170\000\000\012\202\000\000\000\000\014\002\012\212\000\000\000\000\012\218\012\222\000\000\000\000\012\226\012\228\012\230\000\000\000\000\012\242\000\000\000\000\012\250\000\000\r\000\000\000\000\000\000\000\r\018\000\000\r<\000\000\r@\000\000\rD\000\000\000\000\rH\rP\000\000\000\000\r^\r`\rd\000\000\000\000\rv\000\000\000\000\rx\000\000\rz\000\000\000\000\000\000\r\128\000\000\r\136\000\000\r\142\r\144\000\000\000\000\r\152\000\000\r\160\r\176\r\190\000\000\000\000\r\196\000\000\r\206\000\000\000\000\r\208\000\000\r\210\000\000\007$ L\000\000\r\216\000\000\r\222!D\000\000\r\226\000\000\000\000\r\242\000\000\r\252\000\000\014\000\000\000\000\000\000\000\014\004\000\000\014\b \130\000\000\014\n\000\000\000\000\016F!\240\000\000\014\012\000\000\014\016\"\156\000\000\014\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000D\242\000\000/6\000\000\000\000\000\000E\020\000\000\000\000\001\026\000\000\000\000\000\000\002\172\004\152\000\000\000\000:$\000\000\000\000\005\132\000\000\000\000\000\000\000\000\000\186\000\000\012\250\000\000\000\000\026>\000\000\000\000\000\000:p\000\000\000\000\000\000\000\000\000\000\027\210\000\000\000\000\000\000\001\t\000\000;*\000\000\000\000\000\000\000\000\000\230\0152\000\000;L\000\000\000\000\000\000\000\000\028\244\000\000;\192\000\000\000\000\000\000\000\000\000\229\000\000\nn\000\000\000\000T\1848\"\000\000\000\000\000\000E<\000\000\000\000\000\000\000\210\000\000Ed\000\000\000\000\000\000E\166\000\000\000\000\003L\000\000!\252\000\0278B\000\000\000\000\000\000\003p\000\154\000\000\000\000\000\000\000\000\000\000\000\000U(\000\000\000\000UX\000\000\000\000U|\000\000\b\238\000\000\014,\000\000\000\000\000\000\023\164\000\000/\206\000\000\000\000F<\000\000\000\000\000\000\023\238\000\000\000\000\000\000\000\000\000\000\000\000?\222\000\000@\252\000\000\000\000\000\000\0068\000\000\000\000\000\000\000\000\000\000\000\000Q\254\000\000<&\000\0006:\000\000Rh\000\000Rj\000\000R\136\000\000R\160\000\000R\184\000\000R\208\000\000Sx\000\000S\160\000\000S\196\000\000S\240\000\000T\020\000\000Th\000\000T\134\000\0009\026\000\000\000\000\000\000\b\012\000\000\b\202\000\000\018\224\002.\n\238\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000F\252\000\0000\224\003\194\024D\000\000\000\000\000\000<z\000\000<\224\000\000=6\000\0001$1\156\002\206\b\208\000\000\004\026\nP\000\000\000\000\000\000\017F\000\000\000\000\018\186\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000G\022\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0001>\000\0001\238\000\000\000\000\000\000\019\230\000\000\000\000\tx\000\000\000\000\000\000\"\176\002X\000\000#f\000\000\000\000\000\000\000\000\003\016\000\000\000\000\020\174\000\000$0\000\000\000\0002`\000\000\000\000\000\000<R\000\000\000\000\014t\000\000\000\000\017\012\000\000\000\000\028\158\000\000\000\000\000\000=\156\000\000\000\000\000\000\"\148\000\000\000\000\000\000\000\000>:\000\000\000\000\000\000\000\000\005\224\030@\000\000>^\000\000\000\000\000\000\000\000\000\000\000\000\021\180\000\000\000\000\003\204\000\000\022\194\000\000\014t\000\000\000\000\006\194\006\250\000\000\006\202\000\000\000\000\000\000\000\000\0068\000\0003T\000\000$\250\001\218%\176\000\000\002\162\000\000\023\200\000\000\024\210\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007@&z\003\030'D\000\000\000\000\000\000\003\172\000\000\025\194\000\000\007v\000\000\000\000\022\150\000p'\250\000\000\002\128\000\000\026Z(\196\000\000\000\000\027,\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\138\012\130\000\000\007\232\000\000\000\000\000\000\000\000\004\238\000\000\028(\000\000\000\000\000\000\t\192GR\000\000\000\000\000\000\021\250\000\000\000\000\000\000\000\000\000\000\004\240\019$\000\000\000\000>x\000\000\000\000\011\180\000\000\019\136\000\000\000\000$\222\000\000\000\000\000\000>\182\000\000\000\000\000\000\000\000>\244\000\000\000\000\006\184\019\140\000\000\000\000?\136\000\000\000\000\bb\011\212\000\000\020\196\000\000\000\000@\028\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0003\164\000\000\000\000\000\000@D\000\000\000\000\b\246\000\000\000\000\0218\000\000\000\000%\162\000\000\000\000\000\000@\226\000\000\000\000\000\000\000\000A \000\000\000\000\011 \022\180\000\000\000\000A:\000\000\000\000\b\210\000\000\000\000\000\000\000\000\b\246\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000[\000\000\028\222\000\000\000\000\000\000Gt\000\000\r\002\000\000\000\000\000\000\001\156\000\000\005D\000\000\000\000\007\176\029\146\000\000\030H\000\000\000\000\000\000\b\144\000\000G\202\b\184H4\000\000I\012\000\000\000\000\000\000\t\016\000\000IJ\t@\000\000\000\000+\174\000\154\000\000\t\130,b\000\000\000\000-\024\000\000\000\000\000\000\t\204\000\000Ib\n\n\000\000\000\000\0226\n\n\025\168\000\000\031\130\000\000\000\000\000\000\nN\000\000Iv\n^\000\000\000\000\000\000\002\242\000\000\005\b\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\178\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\152\000\000\000\000\011r\000\000\014\252\000\000\000\000\000\000\015\000\000\000\000\000\000\000\000\000\000\000\011|\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\022\000\000\000\000\014\234\000\000\011F\000\000\000\000\rN\000\000\001X\014\132\000/\000\000\000\000\006Z\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000D\006(\000\000\000\000\003\162\000\000\000\000\000\000\007T\000\000\000\000\011\162\r\\\000\000\000\000\000\000\000\000\015\234\021\202\t\172\000\000\000\000\000\000\025f\000\000\000\000\000\000\000\000\000\000\000\000\002b\000\000\000\000\005\234\000\000\000\000\014H\000\000\025\166\000\000\000\000\000\000\005\000\000\000\000\000\000\166\000\000\000)\000\000\000\000\000\000\000\000\000\151\026\212\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t,\029\160\000\000\000\000\000\000\000\000\030V\031\192\r\012\000\000\031\208\000\000\000\000\000\000\000\000\000\000\000\000\003\024\000\000\015$\000\000\000\000\000\000\b<\000\000\002v\000\000\000\000\000\000\012\168\000\000\000\000!*!8\0174\000\000\"\168\000\000\000\000\000\000\000\000\000\000\000\000\n\176\014P\000\000\014\\\000\000#:\025\134\000\000#\208\000\000\000\000\000\000\000\000\014n\000\000\014\250\000\000\000\000\000\000\005\"\000\000\002`\014\180\005v\000\000\000\000\000\000\003\006\t.\000\000\000\000\000\000\000\000\000\000\000\r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007~\000\000\000\000\007\154\000\000\003>\015R\b>\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\020\000\000\000\000\021\030%\132\000\000\000\000\000\000\000\000&\026\000\000\000\000\000d\000\000\002\178\012\188\000\000\000\000\000\000\016`\000\000\000\000\000\000\000\000\000\000\000\029\021\248\000\000\000\000\024N\000\000\000\000\000\000\000\000\007\024\000\000\000\000\002\232\000\000\000\000\000\000\001\005\000\000\000\000\tl\000\000\000\000\000\000\000\000\000\000\000\000\000\000AT\000\000\000\000\000\000\004\248\000\000\000\000\000\000\000\000\000\000\000\026\000\212\007f\015\210\000\000\001\022\002\194\003Z\0048\000\000\000\000\000\000\000\000\000\000\000\000\n\128\030\252\000\000)\142\007\212\000\000\000\000\bv\000\000\031\178\000\0009^\000\000\000\000\n\204 f\000\000*D\000\000\011z*\248\000\000\000\000\000\000\0005\017\222\000\000\000\000\000\000\000\000\005t\000\000\020\236\005$\000\000\000\000\tl\r&\000\000\017\218\000\000\000\000\017\002\000\000\017\232\000\000\000\000\018b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\150\000\000\000\000\000\000\t\164\000\000!\028\000\000\023\228\015\002\000\000\000\000\000\000\000\000\000\000\005 \000\000\000\000\000\000\000\000\000\000B\022\000\000\002\176\000\000\000\000\000\000\000\000\000\000\001\250\000\000\015\022\004.\015J\000\000\0042\017*\000\000\0066\000\000\004\178\000\000\006F\000\000\006\198\000\000\023\228\000\000\000\000\000\000\000\000\000\000\bZ\000\000\006\220\000\000\b\218\000\000\023\228\015v\000\000\0000\000\000\015d\002\216\000\000\014\018\000\000\014\020\000\000\000\000\000\000\000\000\000\000\000\000\014\024\000\000\014\026\000\000\014 \000\000\000\000\000\000\000\000\000\000\014(\000\000\000\000\000\000\000\000\000\000\015\128\014:\000\000\000\000\014x\000\000\000\000\014R\004|\015\204\000\000\015\206\000\000\000\000\000\018\006\150\000\000\014\136\000\000\000\000\014\194\000\000\000\000\000\000\000\000\000\000\000\000\015\188\014t\000\000\000\000\000\000\014\174\014~\tt\006\\\014\172\014\228\000\000\000\000\014\132\t\138\t\214\014\180\014\244\000\000\000\000\011\134\015\246\000\000\015\248\000\000\016 \000\000\000\000\016\000\000\000\000\000\016\004\000\000\000\000\000\000\000\000\016$\000\000\016N\000\000\000\000\000\000\016R\000\000\000\000\000\000\016X\000\000\000\000\000\000"), (16, "\002\175\007\027\006\193\006\194\004\186\000h\004\205\007k\001\238\000\174\007\157\000\129\002\204\006D\007\206\000\129\000\174\001\179\001\180\003@\001\184\003\200\000\174\006\138\007\183\007\184\002\175\004T\005\158\005\134\004\186\006\214\004\205\000\129\000\174\001\179\007z\002!\001\188\007\240\002-\000\004\001\250\004U\000\025\007\241\007\028\007\029\000\174\007p\000\183\001\186\001\186\007\242\003+\005T\004\130\000\024\007\157\001\186\007{\000\r\007~\006\193\006\194\005U\000\005\004\188\000\183\003\200\000i\006M\007m\004\189\007\157\002\203\000\130\001\186\007\030\006\174\000\130\006\195\004\130\000\016\000\017\003\200\000\007\b\139\005=\007\031\000\129\005U\000\018\004\188\004\186\001\223\004\205\005\191\000\130\004\189\007z\002#\b\140\006\175\000h\007\167\000h\002$\006\178\006\193\006\194\000\005\000\174\000\129\005=\000\017\0031\000\231\000\030\005\000\005\001\000\029\000\235\006\177\007{\000\174\007~\006\193\006\194\001\255\000\174\000\181\007\017\006\215\005\205\000\174\004\210\000h\007\165\001H\005?\000\174\006\195\007\170\0023\000l\007\206\006\175\000p\004V\001\238\007\244\006\178\006\193\006\194\000\130\007\015\004\188\003\193\007\018\006\193\006\194\001\225\004\189\000\183\000&\005?\001\224\002\001\000i\006\201\000i\b}\001\186\007\245\005A\000\174\006O\000\130\007\211\003\197\004T\005\201\000\225\004{\001\015\004\202\000r\006\195\000\233\005F\007\175\007\207\001\186\000\240\005V\001\203\004\203\005\207\005\172\007n\005A\000i\001\231\003\196\000\149\006\195\007\160\001\224\000\131\004\130\005\154\004\202\001\186\000\174\0039\005F\001\187\001\206\001\186\000\240\005V\007\246\004\203\000\239\002|\004\210\000\240\000\132\001H\0024\007\247\006\195\000\174\007\243\000\184\005H\b\021\005\135\006\195\005\166\001\190\004z\005^\000l\b\148\000l\005\189\000\183\001\237\003\022\001\235\001H\b\132\003\211\005~\004\214\001\186\006\218\001\190\001\253\006B\005H\007\173\005Y\b\023\002\175\001\237\000\b\005^\004\186\006E\004\205\b\025\004\215\001\224\004\202\000l\005\160\004\216\006\221\005~\004\214\004\217\000\240\b/\000#\004\203\000\174\004\218\0027\000\174\002\175\007\242\b0\005T\004\186\002}\004\205\000\"\004\215\004\212\003\211\000%\001\203\004\216\006\196\000\240\0028\004\217\000\241\001\226\004n\002r\000\174\004\218\002\127\002:\003\211\004T\005\158\005\134\004\130\002;\007\217\004\137\001\206\007\163\003I\005Q\000h\005U\006\222\004\188\001\249\001J\004s\001P\007t\004\189\000\174\005R\000\242\bC\003K\001S\004\214\001\207\004\130\005V\001\208\000\141\004t\003\193\005=\001\190\007\215\005U\001S\004\188\001P\005\191\007\002\001\237\004\215\004\189\007\208\000y\001S\004\216\000(\001\017\000h\004\217\001S\003\195\004x\000\174\005\160\004\218\005=\007\028\007\029\000\174\001\179\001\180\003.\001\184\002}\000\144\000\244\006P\006Q\007\211\001\025\000i\000*\005^\001\019\003\196\007k\005f\000\174\0037\007u\000\246\005?\003\198\001\186\005~\000\129\004U\bD\007<\002\176\007v\007w\000\183\002\177\000\129\001\186\005X\006\172\006\173\007\031\000\129\001\186\005\173\004\210\000\222\003(\001H\005?\005R\000h\b)\000\183\000i\b*\001\190\005\178\005A\bf\000h\0077\001\186\005\194\001\237\003L\007\132\007\179\005\168\004\202\000\129\000p\001\207\005F\004\186\001\208\004\187\000\240\005V\bE\004\203\003K\007m\001S\005A\0078\007\211\000l\007\247\007;\006\193\006\194\000\130\005-\bG\004\202\002\178\006?\007\133\005F\007\134\000\130\002\179\000\240\005V\002\175\004\203\000\130\005\175\002\176\000q\002\175\000\225\002\177\006O\004\186\000i\004\205\000\226\005H\005\154\005Y\bI\b.\000.\000i\005^\003=\005\178\005$\bK\007\135\005\140\003D\006\232\000\130\001H\004\188\005~\004\214\005\146\001S\007\136\004\189\005R\005H\000\129\005\135\006\199\005\166\000\222\003$\005^\000\239\000\145\000h\005\189\004\215\006\230\006\193\006\194\000w\004\216\000\133\005~\004\214\004\217\002\175\005\163\006\195\002\195\004\186\004\218\004\205\002\178\001M\002\195\000y\004\188\007\181\002\179\007\196\007\003\004\215\004\189\006\200\0000\007\214\004\216\000\174\001S\000l\004\217\b2\007\242\b5\005\134\007\211\004\218\005=\000l\001\187\001M\000\129\000\129\000\129\007\006\002\196\005.\002!\007s\000\130\002\"\002\192\001O\002\197\000\225\005%\000h\004`\000i\000\240\000\226\004\130\002\193\001\190\005/\004z\bi\005\180\000\220\002\175\005U\001\237\004\188\004\186\000\240\004\205\006\195\000\241\004\189\001N\005\152\001\255\003?\002\198\002\175\004\210\bA\b@\002\176\005?\001\237\000\174\002\177\005=\004\202\000\239\007\242\b5\005\134\004V\0004\007\213\000\240\000\134\000\146\004\203\000\130\000\130\000\130\000\242\000h\002#\000\134\002\200\000\137\005\216\003:\002$\0006\000y\002\000\000i\000\174\000\137\005A\004\130\007=\005R\000y\002\192\003\007\002\238\006\201\005$\005U\004\202\004\188\000\240\005\183\005F\002\193\003\003\004\189\000\240\007\014\005?\004\203\000;\000\174\002\195\000:\b:\000\004\002\178\0023\003<\005\233\005=\003:\002\179\005\154\002\249\006@\007a\000\174\001\186\000h\002\241\007\015\004T\000\174\007\018\006\193\006\194\000h\000i\002\203\000\005\000\240\000C\005A\000\241\004\254\006B\000\129\005H\002\254\007_\007b\006\193\006\194\004\202\000h\bz\002\197\005F\000l\003;\004\130\000\240\005V\b;\004\203\b!\b\"\004\214\000@\001\186\006\214\005?\007\247\000\174\007\212\000\242\000?\000B\005G\004\\\000\174\002\205\b\000\005(\000\129\004\215\002\198\000E\002!\b\012\004\216\002\"\007\198\000i\004\217\007\199\002\206\001\161\002 \000\240\004\218\000i\0024\005H\001\238\005\135\005A\b=\005+\000\174\005^\000\130\000l\006\195\b?\007\203\002\200\004\202\000G\000i\000\129\005F\005~\004\214\000\231\000\240\005V\b;\004\203\000\232\006\195\007\005\002\192\002\175\002\238\b&\007\247\004\186\005\127\004\205\000\240\004\215\005G\002\193\001\203\000\174\004\216\001\186\000\184\000\130\004\217\001\213\002#\b2\000K\000\174\004\218\006\229\002$\000M\007\242\b5\005\134\000\129\004W\003\180\001\206\005H\000l\005\135\002\241\b=\006\215\007\196\005^\006R\000l\b\133\b?\002\203\003\t\006\230\006\193\006\194\006\217\000\130\005~\004\214\004^\004\130\000\225\003\180\000j\007\196\000l\0023\000\233\002\175\005U\005V\004\188\004\186\000\184\004\205\003\182\004\215\004\189\000\129\b8\005\239\004\216\000\231\001\238\b|\004\217\b<\000\232\006\000\003,\000\174\004\218\005=\002\205\002\175\007\242\b5\005\134\004\186\000\130\004\205\003\181\000\239\b\003\007 \007\249\b\004\b2\002\206\000\005\003\190\002\174\006\142\006Q\001S\000\129\000\129\006\001\005^\001M\000\231\003\200\005f\005\148\004\130\000\232\001\186\003\174\001R\b\020\005~\000Q\006\195\005U\000P\004\188\001S\000\184\001\214\003\176\000S\004\189\000\129\000\130\005?\000h\000\231\007^\000\225\000\240\b>\000\235\0024\004]\000\233\000m\005=\006\215\004\213\002\195\000]\004\188\bH\001\232\000\174\b\144\001\207\004\189\007e\001\208\000\174\007_\007b\006\193\006\194\007\206\003F\001S\006\229\005A\000\130\000\130\005=\005\149\001S\000\240\000\225\005\149\000\241\000\239\004\202\000\129\000\233\000X\005F\000\222\003\030\007z\000\240\005V\b;\004\203\006\230\006\193\006\194\007\003\000h\000\130\005?\007\247\000i\007}\000\225\001S\001\015\005G\000W\000\174\000\233\007\223\000\242\007{\005\151\007~\006\193\006\194\005\150\000\239\003\156\000h\002o\005R\005\000\005\001\005?\007{\000Z\007~\006\193\006\194\005H\003\179\005\135\005A\b=\000\\\b\132\005^\000\145\001S\005\186\b?\006\195\000\239\004\202\006\233\000\130\000\174\005F\005~\004\214\000\225\000\240\005V\b;\004\203\000h\000\226\003\012\005A\002\175\000i\000\240\007\247\004\186\000\241\004\205\005\186\004\215\005G\004\202\000_\006\195\004\216\005F\000l\005\210\004\217\000\240\005\188\007:\004\203\000\174\004\218\000i\000a\000\004\007\242\b5\005\134\007\226\000\148\000\239\006\195\005H\005G\005\135\000\242\b=\004!\000\240\005^\005R\000\241\0078\b?\005\187\006\195\007;\006\193\006\194\000\005\000h\005~\004\214\005\212\004\130\005\000\005\001\000h\005H\000i\000\145\005\210\002\175\005U\000\240\004\188\004\186\000\241\004\205\000\154\004\215\004\189\000\129\000\242\000l\004\216\000h\006Y\004\214\004\217\bF\007\216\003\211\000\248\000\174\004\218\005=\000\134\000\151\007\242\b5\005\134\002\011\006[\000\249\000h\004\215\000l\000\137\000\242\005\211\004\216\007\176\000y\007k\004\217\000\153\001\243\003\178\000\156\000\129\004\218\005\003\000\240\000\231\000i\000\241\003\024\004\130\000\232\0066\000\248\000i\007\208\000\159\001S\006\195\005U\001\017\004\188\000\161\001S\000\251\006\236\000l\004\189\000\129\000\130\005?\007\014\000\231\000i\005\000\005\001\bJ\000\235\007l\000\244\000\242\000\129\005=\001\025\007\137\000\222\003\019\001\019\000\165\000\174\000\174\0068\000i\005,\000\246\007\015\000o\003C\007\018\006\193\006\194\007m\003H\000\134\001\158\005A\001U\000\130\0066\000\129\001S\b\022\000\225\004\186\000\137\004\205\004\202\001Z\000\233\000y\005F\006\\\000l\005R\000\240\005V\b;\004\203\001Y\005$\001b\000\174\001\255\000\130\005?\007\247\005\232\006[\000\225\005\002\001\015\005G\003\179\006c\000\233\000\129\000\130\0067\000l\000\231\001S\000\225\001_\000\239\000\237\001^\000\184\000\226\001a\006e\006<\b\b\006\248\006\193\006\194\006\n\005H\000l\005\135\005A\b=\002\001\001\193\005^\006\016\001d\004\188\b?\006\195\000\239\004\202\000h\004\189\007\129\005F\005~\004\214\006f\000\240\005V\b;\004\203\000\239\001f\007\188\007\189\002\175\006\017\004\185\007\247\004\186\006\019\004\205\006e\004\215\005G\005\000\005\001\000\174\004\216\000\130\006i\000\184\004\217\005s\000\225\007\193\005%\000\174\004\218\001j\000\233\b\143\004T\005\158\005\134\005L\006e\001\251\007n\005H\000\174\005\135\b\150\b=\001l\000\240\005^\004s\000\241\001n\b?\006\195\006t\005\000\005\001\000i\000\174\001p\005~\004\214\006\249\004\130\001u\006*\001t\000\239\001\249\001}\006v\002\175\005U\000\240\004\188\004\186\000\241\004\205\007^\004\215\004\189\b\151\000\242\001z\004\216\007\196\000\240\001y\004\217\000\241\001\203\006w\001|\000\174\004\218\005=\005#\001\205\004T\005\158\005\134\002\011\007_\007b\006\193\006\194\004\202\006v\000\242\007&\001\127\001\129\001\206\001\203\000\240\006\020\007q\004\203\001\238\001\133\001\229\000\242\b\003\006z\006\130\b\004\003\017\004\130\b\011\001\227\000\248\005G\005$\001S\001S\001\206\005U\001\017\004\188\006e\006\132\000\253\005\000\005\001\004\189\000\129\007x\005?\006\207\000\231\000\240\001\206\0060\000\241\000\235\b\133\000\244\000h\006\133\005=\001\025\001\186\b\132\006\021\001\019\006\136\b\133\006\029\006\189\007\219\000h\000\246\006\208\006\192\006\132\006/\004\214\001\135\006\211\006\193\006\194\006e\005A\006\195\006\190\000\242\000\129\001\139\001\138\006\190\004\186\001\141\004\205\004\202\004\215\001\151\b\180\005F\001\146\004\216\006\229\000\240\005V\004\217\004\203\006H\005\172\007\233\000\174\004\218\000\130\005?\b\181\005\232\000\243\000\225\001\145\001\015\005G\001\148\005%\000\233\000i\000\129\006\230\006\193\006\194\000\231\001\150\001\153\001\155\001\160\000\235\000\244\003)\000i\001\166\006\t\001<\001\165\001\168\001\207\006\n\005H\001\208\005\135\005A\005\166\000\246\007y\005^\006\016\001S\004\188\005f\001\170\000\239\004\202\006\195\004\189\000\136\005F\005~\004\214\001\207\000\240\005V\001\208\004\203\005\170\005\172\000h\001\172\002\175\006\017\001S\001\176\004\186\006\019\004\205\001\207\004\215\005G\001\208\001\254\001\230\004\216\001\183\000\130\001\242\004\217\001S\001\248\000\225\007\238\000\174\004\218\000l\001\247\000\233\004T\005\158\005\134\0030\006\195\007\139\0036\005H\000\129\005\135\000l\005\166\000\231\0035\005^\003B\003P\000\232\005f\003U\000\129\003T\003]\003Z\000\222\003\016\005~\004\214\007\014\004\130\003Y\003\\\003_\000h\000\239\003a\000i\002\175\005U\000\240\004\188\004\186\000\241\004\205\000\129\004\215\004\189\003e\002!\003g\004\216\002-\007\015\003i\004\217\007\018\006\193\006\194\000h\000\174\004\218\005=\003k\003p\004T\005\158\005\134\001\024\003o\003x\003u\000\134\004\202\000\130\000\242\006\223\004n\000\174\000\225\003t\000\240\006\020\000\137\004\203\000\233\000\130\003w\000y\003z\003|\000\225\003\128\003\130\004\130\003\134\003\133\000\226\005G\000i\003\136\004s\003\146\005U\001\017\004\188\006\248\006\193\006\194\006\210\000\130\004\189\000l\002#\005?\003\141\002p\005\251\000\240\002$\000\239\000\241\006\229\000\244\000i\000h\005=\001\025\006\242\000\174\006\021\001\019\000\239\006\208\006\029\003\140\006\195\003\205\000\246\006\211\006\193\006\194\006/\004\214\003\143\003\145\006\230\006\193\006\194\005A\b\000\001\022\002s\000\242\003\148\003\150\0023\b\007\003\155\003\161\004\202\004\215\000\140\003\160\005F\003\163\004\216\003\165\000\240\005V\004\217\004\203\005\209\005\172\000l\003\167\004\218\003\171\005?\003\188\003\187\003\204\001\017\003\210\003\209\005G\006\195\000\129\0047\003\213\000i\004\186\003\218\004\187\003\217\007+\003\226\003\223\003\222\000l\001\203\000\244\000\228\000\240\003\225\001\023\000\241\001\213\003\228\001\019\005H\003\230\005\135\005A\005\166\000\240\000\246\005^\000\241\006\195\003\234\005f\001\206\000h\004\202\000h\006\195\000\129\005F\005~\004\214\002!\000\240\005V\002-\004\203\006L\005\172\000\242\000\240\002\175\003\236\0024\003\238\004\186\003\240\004\205\003\245\004\215\005G\000\242\003\244\000\130\004\216\004\188\003\031\007@\004\217\003\253\003\250\004\189\003\249\000\174\004\218\000\184\000l\004V\004T\005\158\005\134\003\252\003\255\004\001\000\134\005H\004\005\005\135\002v\005\166\004\007\004c\005^\004\011\004\n\000\137\005f\000\248\004\r\000i\000y\000i\004\023\000\130\005~\004\214\002#\004\130\000\255\002p\004\018\b\003\002$\0027\b\004\002\175\005U\004\017\004\188\004\186\004\020\004\205\001S\004\215\004\189\004\022\004\025\004\027\004\216\000h\004 \0028\004\217\004&\001\214\004%\002\128\000\174\004\218\005=\002:\002\175\007\242\004(\005T\004\186\002;\004\205\004*\0023\004,\007z\0040\000\129\0046\0045\004;\002\176\004A\001\215\006\240\002\177\001\207\000\174\004@\001\208\001\249\006\182\007\242\006\186\005T\004\130\004V\001S\000l\007{\000l\007~\006\193\006\194\005U\006\227\004\188\006\206\004\202\006\220\007\b\0076\004\189\000\129\007O\005?\000\240\000\231\000i\004\203\007Q\004\130\000\235\bB\000\174\001\179\001\185\005=\001\184\007[\005U\007]\004\188\007g\007\131\000\174\000\129\b\031\004\189\bM\000\222\003\015\000\130\bQ\be\bc\002\178\b]\b_\b3\005A\ba\002\179\005=\bg\000\174\000\240\bm\000\183\0024\007\206\004\202\000\129\bn\005s\005F\000\231\001\186\bs\000\240\005V\000\235\004\203\b\018\005\172\bt\by\bx\000\130\005?\b\128\006\195\b\130\000\225\006\229\001\015\005G\b\136\004s\000\233\001C\000h\b\137\000l\002~\b\141\004\204\b\142\b\145\b\146\b\149\000\130\b\152\004<\005x\005?\000\225\b\153\006\230\006\193\006\194\005H\000\226\005\135\005A\005\166\b\170\b\159\005^\0027\b\168\b\164\005f\b\167\000\239\004\202\000h\000\130\005|\005F\005~\004\214\000\225\000\240\005V\b4\004\203\0028\000\233\b\176\005A\007z\002\128\b\174\007\247\b\178\002:\000\239\b\183\004\215\b7\004\202\002;\000\000\004\216\005F\000i\000\000\004\217\000\240\005V\b4\004\203\002\192\004\218\007{\000\000\007~\006\193\006\194\007\247\000\240\000\000\000\239\002\193\005H\b7\005Y\b9\000\000\000\000\000\000\005^\000\184\000\000\000h\b?\000\000\006\195\000\000\000h\000i\000\000\000h\005~\004\214\000\000\000\000\000\000\004|\000\000\005H\007\142\005Y\b9\002\175\000\000\000\240\005^\004\186\000\241\004\205\b?\004\215\000\000\000\000\000\000\000\000\004\216\000h\005~\004\214\004\217\004\128\000\000\001\187\000\000\000\174\004\218\000\145\000\240\000l\007\242\000\241\005T\002\003\000\000\000\129\007\207\004\215\000\000\000\231\000\242\000\000\004\216\000\000\000\237\006\195\004\217\001\190\000i\000\000\000\000\002\194\004\218\000i\000\240\001\237\000i\000\241\002\005\004\130\000\000\000\000\000\000\000\242\000l\000\000\001S\000\000\005U\001\017\004\188\006\248\006\193\006\194\000\000\000\000\004\189\002\175\007\208\000\000\000\000\004\186\000i\004\205\000\000\000\000\001S\b6\000\244\000\242\000\000\005=\001\025\000h\000\145\000\000\001\019\000\000\000h\000\174\000\130\000\000\000\000\000\246\004T\000\225\005T\000\000\000\129\006\255\000\000\000\233\002!\000\174\000\000\002-\000\000\000\000\001\017\001\249\007\211\005'\000\000\000l\000\000\000\129\000\000\000\000\000l\000\222\003\014\000l\000\000\004\130\000\000\000\000\004V\000\244\000\134\001\163\000\000\001\018\005U\005?\004\188\001\019\000\239\000\000\000\000\000\137\004\189\006\195\000\246\000\000\000y\000\129\000\000\005$\000i\000\231\007E\000\000\000\000\000i\000\235\005=\007\161\000\000\000\174\001\179\001\180\001\181\001\184\000\130\000\000\000\000\002#\000\174\005A\002p\000\000\000\174\002$\000\000\000\000\b\000\006T\000\000\000\000\004\202\000\130\005\204\b\002\005F\000\000\000\225\000\000\000\240\005V\b4\004\203\000\226\000\183\000h\000\000\000\134\003\153\000\000\007\247\000\000\000\000\001\186\000\000\001\222\b7\002s\000\137\005?\000\184\0023\000\130\000y\002\175\000\000\000\000\000\225\004\186\001\015\004\205\000\240\000\000\000\233\000\241\000l\005j\000\000\000\239\000\000\000l\005H\000\000\005Y\b9\000\000\000\174\005%\005^\000\000\000\000\004T\b?\005T\005A\b\000\000\000\000\000\000h\000\000\005~\004\214\b\n\000\000\000\000\004\202\000\242\000h\000\239\005F\000i\000\000\000\000\000\240\005V\000\000\004\203\000\000\000\129\004\215\004\130\000\000\002!\000\000\004\216\002-\000\000\000\000\004\217\005U\005\193\004\188\000\000\000\000\004\218\000\243\000\000\004\189\000\000\007\215\000\174\004n\000\000\000\000\000\240\000\000\000\000\0024\000h\005*\000h\000\000\005=\000\000\000\244\005H\000\000\005Y\005\195\000\245\003\020\000\240\005^\000i\000\241\004s\005f\000\000\000\000\000\246\001\217\000\000\000i\005\202\005~\004\214\000\000\b\003\005\204\000\000\b\004\004t\002v\000\130\000\000\005$\002#\000\000\001S\000\000\000\000\000\240\002$\004\215\000\241\002\175\000\242\000\000\004\216\004\186\000\000\004\205\004\217\000\000\005?\004x\000\000\0027\004\218\005M\000\143\001\187\000\000\000i\000\000\000i\000\129\000\174\000\000\002\011\000\222\003\r\004T\005O\005T\0028\000\242\000\000\000\129\0023\002\128\000\000\000\231\000\000\002:\001\190\000\000\000\237\000l\005A\002;\000\000\000\000\001\237\002\r\b\003\000\000\000l\b\004\000\000\004\202\004\130\001S\000\000\005F\001\017\001S\000\000\000\240\005V\005U\004\203\004\188\000\000\000\000\000\000\000\129\000\000\004\189\000\000\000\222\000\224\000\000\005%\000\244\005\193\000\000\000\000\001\025\000\000\000\000\000\130\001\019\005=\000\000\000\000\000\225\000\000\000l\000\246\000l\000\000\000\226\000\130\000\000\002\175\000\000\000\000\000\225\004\186\005H\004\205\005Y\005\195\000\233\000\000\000h\005^\000\000\000\000\005[\005f\000\240\000\000\000\000\0024\000\000\000\174\000\000\005~\004\214\000\134\004T\005\\\005\134\000\000\000\000\000\239\000\184\000\000\000\000\000\130\000\137\000\000\000\000\005?\000\225\000y\004\215\000\239\000\000\000\000\000\226\004\216\005\234\000\000\000\000\004\217\000\174\000\000\000\000\004\130\000\000\004\218\000\174\001\179\001\180\001\240\001\184\000\000\005U\000\000\004\188\0025\000h\0026\000\000\000\000\004\189\000\000\005A\000i\002_\001S\000\000\0027\000\000\000\239\000\184\000\000\000\184\004\202\000\000\005=\000\000\005F\000\000\007\014\000\183\000\240\005V\000\000\004\203\0028\005\242\000\000\006\002\001\186\0029\000\000\000\000\000\000\002:\000\000\000\000\000\000\005\139\000\000\002;\000\000\000\240\007\015\002`\000\241\007\018\006\193\006\194\000\000\000\000\000\000\b\000\000\000\000\240\000\000\000\000\000\241\002\175\b\r\000\000\000i\004\186\005H\004\205\005Y\005\141\005?\000\000\000\000\005^\000\000\000\000\005\137\005\143\000\000\000\000\000\242\000l\000\000\000\174\000\000\005~\004\214\000\000\004T\005\\\005\134\000\000\000\242\000\000\000\000\000\240\000\129\000\000\000\241\000\000\004\186\000\174\004\205\000\000\004\215\005A\000\000\000\000\000\000\004\216\000\000\006\229\000\000\004\217\000\000\000\000\004\202\004\130\000\174\004\218\005F\000\243\000\000\005\232\000\240\005V\005U\004\203\004\188\006\195\000\242\000\000\007z\000h\004\189\006\230\006\193\006\194\000\000\000l\000\244\005G\000\000\000\000\000\000\001;\000\000\006\007\000\174\005=\000\000\000\000\006\n\004T\000\000\000\246\007{\000\000\007~\006\193\006\194\006\016\000\000\004\188\000\000\000\000\005H\000\000\005\135\004\189\005\136\000\184\001\203\005^\000h\000\000\000\000\005f\b\014\001\213\000\000\000\000\004\130\000\000\006\017\005~\004\214\006\011\006\019\000h\001\187\001\186\000h\000\000\001\206\000\000\002\175\000\000\000i\000\000\004\186\005?\004\205\b\015\004\215\b\003\000\000\000\000\b\004\004\216\000\000\005\142\000\000\004\217\001\190\006\195\001S\004V\000\174\004\218\000h\000\000\001\237\004T\005\\\005\134\000\000\000\000\0069\000\184\000\000\000\000\004\210\000\000\000\000\001H\005A\000\000\006\195\000i\000\174\001\179\001\180\001\245\001\184\006!\000\000\004\202\000\000\007\148\000\000\005F\004\130\000\000\000i\000\240\005V\000i\004\203\000\000\000\000\005U\000\000\004\188\000\000\000h\000\000\000\000\000\000\004\189\000\000\000\000\005G\000l\000\183\000\000\000\000\000\129\000\000\000\000\000\000\000\231\004\202\001\186\005=\000i\000\237\000\000\000\000\000\000\000\240\006\020\000\000\004\203\000\000\001\214\000\000\005H\001\255\005\135\000h\005\136\000\129\000\000\005^\000\000\000\231\005\154\005f\000h\000\000\000\232\000\000\000\000\000l\000\000\005~\004\214\000\000\000\000\001\220\005V\000\000\001\207\000\000\000\000\001\208\002\175\000\000\000l\000i\004\186\000l\004\205\001S\004\215\005?\002\001\006\253\006\021\004\216\000h\000\130\006;\004\217\000\000\000h\000\225\000\000\000\174\004\218\006/\004\214\000\233\004T\005\158\005\134\000\000\002\175\007\168\000l\000\000\002\176\002&\006}\000i\002\177\000\130\007\211\005^\004\215\005A\000\225\005f\000i\004\216\000\000\000\000\000\233\004\217\005s\005~\004\202\004\130\004V\004\218\005F\000\000\000\239\000h\000\240\005V\005U\004\203\004\188\000\174\001\179\001\180\0033\001\184\004\189\000\000\000\000\000\000\004s\000l\000i\005G\000\000\000\000\000\000\000i\000\000\000\239\000\000\005=\000\000\000\000\000\000\000\184\005x\000\000\002m\002\195\000\000\000\000\000\000\002\178\000\000\000\183\000\000\007z\005H\002\179\005\135\0061\005\136\000\000\001\186\005^\000l\001\187\000\000\005f\005|\000\000\000\000\000\000\000\000\000l\002\167\005~\004\214\000\000\000i\007{\000\000\007~\006\193\006\194\002\175\000\000\000\000\000\000\004\186\001\190\004\205\005?\002\197\000\000\004\215\000\240\000\000\001\237\000\241\004\216\000\000\000\000\000\000\004\217\000\000\000l\000\174\000\000\000\000\004\218\000l\004T\005\158\005\134\000\000\000\000\000\000\002\175\000\000\002\181\000\240\002\176\002\198\000\241\000\000\002\177\005A\000\000\000\000\000\000\000\242\000\174\001\179\001\180\003\185\001\184\000\000\004\202\000\000\000\000\004\130\005F\000\000\000\000\000\000\000\240\005V\000\000\004\203\005U\005\165\004\188\002\200\000l\002\190\000\242\000\000\004\189\000\000\000\243\000\000\006\195\005G\004\191\000\000\000\183\000\000\000\000\002\192\007\215\002\235\005s\005=\000\000\001\186\000\000\000\240\000\000\000\244\002\193\000\000\000\000\002\195\001>\000\000\000\000\002\178\005H\000\000\005\135\000\000\005\166\002\179\000\246\005^\004s\000\000\006\229\005f\000\000\004\200\000\000\000\000\000\248\002\175\000\000\005~\004\214\004\186\000\000\004\205\005x\000\000\000\174\001\001\002\203\000\000\000\000\004T\002\196\001\187\006\230\006\193\006\194\005?\004\215\000\174\002\197\000\000\006\229\004\216\004T\005\158\005\134\004\217\005|\000\000\006\248\006\193\006\194\004\218\000\000\000\000\005\019\001\190\000\000\000\000\004\130\000\000\000\000\000\000\000\000\001\237\006\230\006\193\006\194\001\186\002\198\002\205\005A\004\130\000\000\000\000\000\174\001\179\001\180\003\202\001\184\000\000\005U\004\202\004\188\000\000\002\206\005F\000\000\000\000\004\189\000\240\005V\002\175\004\203\007\171\005\167\004\186\000\000\004\205\002\200\000\174\000\000\000\000\000\000\005=\000\000\000\000\005G\000\000\000\183\000\000\000\000\000\000\006\195\000\174\002\192\003\004\002\238\001\186\004T\005\196\005\134\000\000\000\240\000\129\000\000\002\193\000\000\000\231\006\195\000\000\000\000\005H\000\235\005\135\000\000\005\166\000\000\007T\005^\000\000\000\000\000\000\005f\001\187\006\195\000\000\002\249\004\130\000\000\000\000\005~\004\214\002\241\000\000\000\000\005?\005U\000\000\004\188\000\000\000\000\002\203\000\000\000\000\004\189\000\000\000\000\001\190\000\000\004\215\001\203\000\000\002\175\000\000\004\216\001\237\002\176\001\213\004\217\005=\002\177\000\000\000\000\000\000\004\218\000\000\000\000\000\000\000\130\000\000\005A\006\229\001\206\000\225\000\000\001\015\002\175\005V\000\000\000\233\004\186\004\202\004\205\005\198\002\205\005F\000\000\000\000\000\000\000\240\005V\000\000\004\203\000\000\005\185\006\230\006\193\006\194\000\174\002\206\000\000\000\000\000\000\004T\005\196\005\134\005G\000\000\000\000\000\000\000\000\005?\000\000\000\000\000\239\006\251\000\000\002\195\000\000\000\000\006\127\002\178\000\000\000\000\000\000\005^\000\000\002\179\000\000\005f\000\000\005H\004\130\005\135\000\000\005\166\000\000\005~\005^\000\000\001F\005U\005f\004\188\000\000\000\000\005A\007\n\000\000\004\189\005~\004\214\000\000\000\000\002\240\001\187\000\000\004\202\000\000\000\000\000\000\005F\002\197\000\000\005=\000\240\005V\000\000\004\203\004\215\000\000\000\000\000\000\001\214\004\216\006\195\000\000\000\000\004\217\001\190\000\000\000\174\005G\000\000\004\218\000\000\000\000\001\237\005\200\000\000\000\000\000\000\002\198\000\000\000\000\000\000\000\000\000\240\004f\000\000\000\241\001\207\002\175\000\000\001\208\000\000\004\186\005H\004\205\005\135\000\000\005\199\001S\000\000\005^\000\000\005?\005\218\005f\000\000\000\000\000\000\002\200\000\000\000\174\001J\005~\004\214\000\000\004T\005\\\005\134\000\242\000\000\000\000\000\000\000\000\000\129\002\192\000\000\002\238\002!\000\000\000\000\002-\004\215\000\240\000\000\000\000\002\193\004\216\005A\001\203\000\000\004\217\000\000\000\000\000\000\004\130\001\213\004\218\001\017\004\202\000\000\000\000\000\000\005F\005U\000\000\004\188\000\240\005V\000\000\004\203\001\206\004\189\002\241\000\000\000\000\000\000\000\244\000\000\000\000\000\174\001\025\002\203\000\000\005G\001\019\000\000\005=\000\000\000\000\002\175\000\000\000\246\000\000\004\186\007\025\004\205\000\000\000\000\000\130\000\000\000h\002#\000\000\000\000\002p\000\000\000\000\002$\005H\000\000\005\135\000\174\005\199\000\000\000\000\005^\004T\000\000\005T\005f\000\000\000\129\000\000\000\000\002\205\000\231\000\000\005~\004\214\000\000\000\232\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005?\002\206\002s\000\000\000\000\004V\0023\004\130\004\215\000\000\000\000\000\000\001\203\004\216\000\000\000\000\005U\004\217\004\188\001\213\000\000\000\000\000\000\004\218\004\189\000\000\000\000\000i\000h\000\000\000\000\000\000\000\000\001\214\001\206\005A\000\000\000\000\000\000\005=\000\000\002\175\000\000\000\000\000\000\004\186\004\202\004\205\000\130\000\000\005F\000\000\000\000\000\225\000\240\005V\000\000\004\203\004p\000\233\006F\001\207\000\000\000\174\001\208\005\204\000\000\000\000\004T\000\000\005T\005G\001S\000\000\000\000\000\174\001\179\001\180\003\207\001\184\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\229\000\000\000\240\000\000\005?\0024\000i\000\239\000\000\005H\004\130\005\135\000\000\005\136\000\000\000l\005^\000\000\002t\005U\005f\004\188\000\183\000\000\006\230\006\193\006\194\004\189\005~\004\214\000\000\001\186\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005A\002v\000h\005=\000\000\000\145\002\175\000\000\004\215\001\214\004\186\004\202\004\205\004\216\000\000\005F\000\000\004\217\000\000\000\240\005V\000\000\004\203\004\218\006V\000\000\0027\000\129\000\174\005\204\000\000\000\222\003\006\004T\005m\005T\005\193\001\207\000\000\000\000\001\208\000\000\000l\000\000\0028\004V\000\000\000\000\001S\002\128\000\000\000\240\006\229\002:\000\241\005?\000\000\000\000\000\000\002;\000\000\005H\004\130\005Y\005\195\006\195\000\184\000i\005^\000\000\000\000\005U\005f\004\188\000\000\000\000\006\230\006\193\006\194\004\189\005~\004\214\004\131\000\000\000\000\000\000\000\242\000\174\001\179\001\189\005A\001\184\000\130\000\000\005=\000\000\002\175\000\225\000\000\004\215\004\186\004\202\004\205\000\226\004\216\005F\004\135\000\000\004\217\000\240\005V\000\000\004\203\000\000\004\218\006X\000\134\003\158\000\174\000\000\005\204\000\183\000\000\004T\000\000\005T\005\193\000\137\000\000\000\000\001\186\000\000\000y\000\000\000\248\000\000\000\000\000\000\000\239\000\000\000\000\000\000\000l\000\000\000\000\001\003\005?\000\000\000\000\000\000\001\187\005H\004\130\005Y\005\195\000\000\006\195\000\000\005^\000\000\002\175\005U\005f\004\188\002\176\000\000\000\000\000\000\002\177\004\189\005~\004\214\000\000\000\000\001\190\000\000\000\000\000\000\000\000\000\000\000\000\005A\001\237\000\000\005=\000\174\000\000\002\175\007$\004\215\004T\004\186\004\202\004\205\004\216\000\000\005F\000\000\004\217\000\000\000\240\005V\007\228\004\203\004\218\007\220\000\000\000\000\000\129\000\174\005\204\000\000\000\222\002\024\004T\005\\\005\134\005\193\000\000\004\130\000\000\000\240\000\000\000\000\000\241\002\195\000\000\000\000\001\186\002\178\000\000\000\000\000\184\006\229\000\000\002\179\005?\000\000\000\000\000\000\000\000\006\229\005H\004\130\005Y\005\195\000\000\000\000\005\128\005^\000\000\000\000\005U\005f\004\188\000\000\000\242\006\230\006\193\006\194\004\189\005~\004\214\000\000\000h\006\230\006\193\006\194\000\000\000\000\002\197\005A\005\132\000\130\000\000\005=\000\000\002\175\000\225\0071\004\215\004\186\004\202\004\205\000\226\004\216\005F\000\000\001\187\004\217\000\240\005V\000\000\004\203\000\000\004\218\000\000\000\000\000\000\000\174\002\198\000\000\000\000\000\000\004T\000\000\005T\005\193\000\000\000\000\000\000\000\000\001\190\000\174\001\179\001\180\0043\001\184\000\000\000\239\001\237\000\000\000\000\000\000\000\000\000\000\000\000\005?\000\000\000i\002\200\000\000\005H\004\130\005Y\005\195\000\000\006\195\000\000\005^\000\000\000\000\005U\005f\004\188\006\195\002\192\000\183\002\245\000\000\004\189\005~\004\214\000\000\000\240\000\000\001\186\002\193\005V\000\000\000\000\000\000\005A\000\000\000\000\005=\000\000\000\145\002\175\000\000\004\215\000\000\004\186\004\202\004\205\004\216\000\000\005F\000\000\004\217\000\000\000\240\005V\b\024\004\203\004\218\007\234\000\000\000h\000\000\000\174\005\204\000\000\002\203\000\000\004T\005\\\005\134\005G\000\129\000\000\006\129\000\240\000\231\000l\000\241\005^\000\000\000\232\000\000\005f\002\248\000\000\000\000\006\229\000\000\000\000\005?\005~\000\000\000\000\006\229\000\000\005H\004\130\005\135\000\000\005\136\000\000\000\000\005^\000\000\000\000\005U\005f\004\188\002\205\000\242\006\230\006\193\006\194\004\189\005~\004\214\000\000\006\230\006\193\006\194\000\000\000\000\000\000\002\206\005A\000i\000\000\000\000\005=\000\000\000\000\000\000\007/\004\215\000\000\004\202\000\130\000\000\004\216\005F\007-\000\225\004\217\000\240\005V\000\000\004\203\000\233\004\218\000\000\000\134\004\030\002\175\000\000\000\000\005\213\004\186\000\000\004\205\000\000\005\193\000\137\000\000\000\145\000\000\000\000\000y\000\000\000\174\001\179\001\180\0049\001\184\000\000\000\174\000\000\000\000\000\000\000\000\004T\005?\005\134\000\239\000\000\000\000\005H\001\187\005Y\005\195\000\000\006\195\000\000\005^\000\000\000\000\000\000\005f\006\195\000\000\000\000\000l\000\000\000\183\000\000\005~\004\214\000\000\000\000\004\130\000\000\001\190\001\186\000\000\000\000\000\000\005A\000\000\005U\001\237\004\188\000\000\000\000\000\000\004\215\000\000\004\189\004\202\000\000\004\216\000\000\005F\000\000\004\217\000\000\000\240\005V\000\000\004\203\004\218\000\000\005=\000\000\002\175\000\000\000\000\000\000\004\186\000\000\004\205\000\000\000\174\005G\000\000\000\000\000\174\001\179\001\180\004>\001\184\000\000\005\138\000\000\000\000\000\000\000\174\000\240\000\000\000\000\000\241\004T\000\000\005T\000\000\000\000\000\134\004#\005H\006\229\005\135\000\000\005\136\000\000\000\000\005^\000\000\000\137\000\000\005f\000\183\000\000\000y\000\000\005?\000\000\000\000\005~\004\214\001\186\004\130\000\000\000\242\006\230\006\193\006\194\000\000\000\000\000\000\005U\000\129\004\188\000\000\000\000\000\231\007K\004\215\004\189\000\000\000\232\000\000\004\216\007I\001\203\000\000\004\217\000\000\000\000\000\000\005A\001\213\004\218\005=\000\000\000\000\002\175\000\000\000\000\000\000\004\186\004\202\004\205\000\000\000\000\005F\001\206\000\000\000\000\000\240\005V\000\248\004\203\006\229\005S\000\000\000\000\000\000\000\174\000\000\000\129\000\000\001\005\004T\000\231\005T\005\215\000\000\000\000\000\235\000\000\000\000\001\187\000\000\000\000\000\000\000\130\006\230\006\193\006\194\000\000\000\225\000\000\000\000\006\195\005?\000\000\000\233\000\000\000\000\000\000\005H\004\130\005\135\000\000\005\217\001\190\000\000\005^\000\000\000\000\005U\005f\004\188\001\237\000\000\000\000\000\000\000\000\004\189\005~\004\214\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005A\000\000\000\239\000\000\005=\000\130\000\000\000\000\006\229\004\215\000\225\004\202\001\015\000\000\004\216\005F\000\233\002\175\004\217\000\240\005V\004\186\004\203\004\205\004\218\000\000\000\000\001\214\000\000\001\020\000\000\000\000\006\230\006\193\006\194\005]\005W\006\195\001\187\000\174\000\000\000\000\000\000\000\000\004T\000\000\005T\000\000\000\000\000\000\000\000\000\239\005u\000\000\000\000\001\207\005?\000\000\001\208\000\000\000\000\005H\001\190\005Y\005Z\000\129\001S\000\000\005^\000\231\001\237\000\000\005f\004\130\000\232\000\000\000\000\000\000\000\000\000\000\005~\004\214\005U\000\000\004\188\000\240\000\000\007G\000\241\000\000\004\189\005A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\215\000\000\000\000\004\202\000\000\004\216\005=\005F\000\000\004\217\000\000\000\240\005V\006\195\004\203\004\218\000\000\000\000\000\000\002\175\000\000\000\242\000\000\004\186\000\000\004\205\000\000\000\174\005W\000\000\000\000\000\130\000\000\000\000\000\000\000\240\000\225\000\000\000\241\000\000\000\000\000\174\000\233\000\000\000\000\000\000\004T\000\000\005T\000\000\000\000\000\000\000\000\005H\000\000\005Y\005Z\000\000\005?\000\000\005^\007X\000\000\001\024\005f\000\000\000\000\000\000\000\000\000\248\000\242\000\000\005~\004\214\000\000\004\130\000\000\000\239\000\000\000\000\001\007\000\000\000\000\000\000\005U\000\000\004\188\000\000\000\000\000\000\000\000\004\215\004\189\005A\000\000\000\000\004\216\000\000\001\203\001\017\004\217\000\000\000\000\000\000\004\202\001\213\004\218\005=\005F\000\000\002\175\000\000\000\240\005V\004\186\004\203\004\205\000\000\000\244\000\000\001\206\000\000\001\025\000\000\000\000\000\174\001\019\006\229\000\000\005W\000\000\000\000\000\174\000\246\000\129\000\000\007V\004T\000\231\005T\000\000\000\000\000\000\000\235\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\230\006\193\006\194\005H\000\000\005Y\005Z\000\000\005?\000\240\005^\000\000\000\241\000\000\005f\004\130\000\000\000\000\000\000\000\000\000\000\000\000\005~\004\214\005U\000\000\004\188\000\000\000\000\000\000\000\000\000\000\004\189\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\215\000\000\005A\000\242\001\203\004\216\005=\000\130\000\000\004\217\006\229\001\213\000\225\004\202\001\015\004\218\000\000\005F\000\233\002\175\000\000\000\240\005V\004\186\004\203\004\205\001\206\000\000\000\000\001\214\005\169\002?\000\000\000\000\006\230\006\193\006\194\000\000\005\162\006\195\000\000\000\174\000\000\000\000\000\000\000\000\004T\000\000\005T\000\000\000\000\000\248\000\129\000\239\005\245\000\000\000\231\001\207\005?\000\000\001\208\000\232\001\t\005H\000\000\005Y\005\164\000\129\001S\000\000\005^\000\231\000\000\000\000\005f\004\130\000\232\000\000\000\000\000\000\000\000\000\000\005~\004\214\005U\000\000\004\188\000\000\000\000\000\000\000\000\000\000\004\189\005A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\215\000\000\000\000\004\202\000\000\004\216\005=\005F\000\000\004\217\000\000\000\240\005V\006\195\004\203\004\218\000\130\000\000\000\000\002\175\005\161\000\225\000\000\004\186\000\000\004\205\001\214\000\233\005\162\000\000\000\000\000\130\000\000\000\000\000\000\000\240\000\225\000\000\000\241\000\000\000\000\000\174\000\233\000\000\000\000\000\000\004T\000\000\005T\000\000\000\000\006$\000\000\005H\001\207\005Y\005\164\001\208\005?\000\000\005^\007\146\000\239\001\024\005f\001S\000\000\000\000\000\000\000\000\000\242\000\000\005~\004\214\000\000\004\130\000\000\000\239\000\000\000\000\000\000\000\000\000\000\000\000\005U\000\000\004\188\000\000\000\000\000\000\000\000\004\215\004\189\005A\000\000\000\000\004\216\000\000\000\000\001\017\004\217\000\000\000\000\000\000\004\202\000\000\004\218\005=\005F\000\000\002\175\000\000\000\240\005V\004\186\004\203\004\205\000\000\000\244\000\000\005\181\000\000\001\025\000\000\000\000\000\000\001\019\000\000\000\000\005\182\000\000\000\000\000\174\000\246\000\129\000\000\007\151\004T\000\231\005T\000\000\000\000\000\000\000\235\000\000\000\240\000\000\000\000\000\241\000\000\000\000\000\000\000\000\000\000\005H\000\000\005Y\005\184\000\000\005?\000\240\005^\000\000\000\241\000\000\005f\004\130\000\000\000\000\000\000\000\000\000\000\000\000\005~\004\214\005U\000\000\004\188\000\000\000\000\000\242\000\000\000\000\004\189\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\215\000\000\005A\000\242\000\000\004\216\005=\000\130\000\000\004\217\000\000\000\000\000\225\004\202\001\015\004\218\000\000\005F\000\233\002\175\000\000\000\240\005V\004\186\004\203\004\205\000\000\000\000\000\000\000\000\005\179\000\000\005\192\000\000\000\000\000\129\000\248\000\000\005\162\000\231\000\000\000\174\000\000\000\000\000\232\000\000\004T\001\011\005T\000\000\000\000\000\248\000\000\000\239\000\000\000\000\002\175\000\000\005?\000\000\002\176\000\000\001\r\005H\002\177\005Y\005\164\000\000\000\000\000\000\005^\000\000\000\000\000\000\005f\004\130\000\000\000\000\000\000\002\130\000\000\000\000\005~\004\214\005U\000\000\004\188\000\000\000\000\000\000\000\000\000\000\004\189\005A\000\000\000\000\000\000\000\000\000\000\000\000\000\130\004\215\000\000\000\000\004\202\000\225\004\216\005=\005F\000\000\004\217\000\233\000\240\005V\000\000\004\203\004\218\000\000\000\000\000\000\002\175\002\195\000\000\000\000\004\186\002\178\004\205\000\000\000\000\005\193\000\000\002\179\000\000\005\197\000\000\000\000\000\240\007\224\000\000\000\241\000\000\000\000\000\174\000\000\000\000\000\000\000\239\004T\000\000\005T\000\000\000\000\000\000\000\000\005H\000\000\005Y\005\195\002\244\005?\000\000\005^\000\000\000\000\001J\005f\002\197\000\000\000\000\000\000\000\000\000\242\000\000\005~\004\214\000\000\004\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005U\000\000\004\188\000\000\000\000\000\000\000\000\004\215\004\189\005A\000\000\002\198\004\216\000\000\000\000\001\017\004\217\000\000\000\000\000\000\004\202\000\000\004\218\005=\005F\000\000\002\175\000\000\000\240\005V\004\186\004\203\004\205\000\000\000\244\000\000\000\000\000\000\001\025\000\000\000\000\002\200\001\019\007\236\000\240\005\193\000\000\000\241\000\174\000\246\000\000\000\000\000\000\004T\000\000\005T\000\000\002\192\000\000\002\238\000\000\000\000\000\000\000\000\000\000\000\240\000\000\000\000\002\193\000\000\005H\000\000\005Y\005\195\000\000\005?\000\000\005^\000\000\000\242\000\000\005f\004\130\000\000\000\000\000\000\000\000\000\000\000\000\005~\004\214\005U\000\000\004\188\000\000\002\241\000\000\000\000\000\000\004\189\000\000\000\000\000\000\000\000\002\203\000\000\000\000\000\000\004\215\000\000\005A\000\000\000\000\004\216\005=\000\000\002\175\004\217\000\000\000\000\004\186\004\202\004\205\004\218\000\000\005F\000\000\001E\000\000\000\240\005V\000\000\004\203\007\239\000\000\000\000\000\000\000\000\000\174\000\000\000\000\000\000\000\000\004T\000\000\005T\007\225\002\205\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\206\000\000\000\000\000\000\005?\000\000\000\000\000\000\000\000\005H\004\130\005Y\007\227\000\000\000\000\000\000\005^\000\000\002\175\005U\005f\004\188\002\176\000\000\000\000\000\000\002\177\004\189\005~\004\214\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005A\000\000\000\000\005=\000\000\000\000\002\175\000\000\004\215\000\000\004\186\004\202\004\205\004\216\000\000\005F\000\000\004\217\000\000\000\240\005V\000\129\004\203\004\218\000\000\000\231\000\000\000\000\000\174\000\000\000\235\000\000\000\000\004T\000\000\006m\007\225\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\195\000\000\000\000\000\000\002\178\000\000\000\000\000\000\000\000\000\000\002\179\005?\000\000\000\000\000\000\000\000\000\000\005H\004\130\005Y\007\227\000\000\000\000\000\000\005^\000\000\002\175\005U\005f\004\188\002\176\000\000\000\000\000\000\002\177\004\189\005~\004\214\000\000\000\000\000\000\000\000\000\130\000\000\000\000\002\197\005A\000\225\000\000\000\000\005=\000\000\002\175\000\233\000\000\004\215\004\186\004\202\004\205\000\000\004\216\005F\000\000\000\000\004\217\000\240\005V\000\000\004\203\000\000\004\218\000\000\000\000\000\000\000\174\002\198\000\000\000\000\000\000\004T\000\000\006m\007\225\000\000\000\000\000\000\000\000\000\000\000\239\000\000\000\000\002\195\000\000\000\000\000\000\002\178\000\000\000\000\000\000\000\000\000\000\002\179\005?\000\000\000\000\002\200\000\000\005H\004\130\005Y\007\227\000\000\000\000\000\000\005^\000\000\000\000\005U\005f\004\188\000\000\002\192\000\000\002\202\000\000\004\189\005~\004\214\002\196\000\240\000\000\000\000\002\193\000\000\000\000\000\000\002\197\005A\006n\000\000\005=\000\000\000\000\002\175\000\000\004\215\000\000\004\186\004\202\004\205\004\216\000\000\005F\000\000\004\217\000\000\000\240\005V\000\000\004\203\004\218\000\000\000\000\000\000\000\000\000\174\002\198\000\000\002\203\000\000\004T\000\240\006m\005G\000\241\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005?\000\000\000\000\000\000\002\200\000\000\005H\004\130\006q\000\000\000\000\000\000\002A\005^\000\242\000\000\005U\005f\004\188\002\205\002\192\003\001\002\238\000\000\004\189\005~\004\214\000\000\000\240\000\000\000\000\002\193\000\000\000\000\002\206\005A\006p\000\000\000\000\005=\000\000\000\000\000\000\001\017\004\215\000\000\004\202\000\000\000\000\004\216\005F\000\000\002\249\004\217\000\240\005V\000\129\004\203\002\241\004\218\002!\000\000\000\244\002-\000\000\000\000\001\023\002\203\000\000\000\000\001\019\005G\000\000\000\000\000\000\000\000\000\000\000\246\000\174\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005?\000\000\000\000\000\000\000\000\005H\000\000\006q\000\000\000\129\000\000\000\000\005^\000\231\000\000\000\000\005f\000\000\000\235\002\205\000\000\000\000\000\000\000\000\005~\004\214\000\000\000\000\000\000\000\000\000\130\000\174\000\000\002#\002\206\005A\006s\000\000\000\000\002$\000\129\000\000\000\000\004\215\002!\000\000\004\202\002-\004\216\000\000\005F\000\000\004\217\000\000\000\240\005V\000\129\004\203\004\218\000\000\002!\000\000\000\174\002-\000\000\000\000\000\000\000\000\000\000\000\000\002d\005G\000\000\000\000\000\130\000\000\0023\000\000\000\000\000\225\000\000\001\015\000\129\000\000\000\000\000\233\002!\000\000\000\000\002-\000\000\000\000\000\000\000\000\000\000\000\000\005H\000\000\006q\000\000\000\000\000\000\000\000\005^\000\174\000\130\000\000\005f\002#\000\000\000\000\000\000\000\000\000\000\002$\005~\004\214\000\000\000\000\000\000\000\239\000\130\000\000\000\000\002#\000\000\000\000\002p\000\000\000\000\002$\002\175\000\000\000\000\004\215\004\186\000\000\004\205\000\000\004\216\000\000\000\000\000\000\004\217\000\000\002d\001F\000\130\001H\004\218\002#\0023\000\000\000\000\000\000\000\000\002$\000\000\000\000\000\240\0056\006S\0024\002s\000\000\000\000\000\000\0023\000\000\000\000\000\000\000\129\000\000\000\000\000\000\000\231\000\000\000\000\000\000\000\000\000\237\000\000\000\000\000\000\000\000\002e\003\n\002d\000\000\000\000\000\000\000\000\000\000\0023\000\000\000\000\002\195\000\000\004\188\000\000\000\000\000\000\000\000\000\240\004\189\000\000\000\241\000\129\000\000\000\000\0025\002!\0026\000\000\002-\000\000\000\000\000\000\000\000\005=\001S\000\000\0027\000\000\000\000\000\000\000\000\000\000\000\000\000\174\000\000\001J\000\000\000\000\000\240\000\000\000\130\0024\000\242\000\000\0028\000\225\000\000\000\000\000\000\0029\000\000\000\233\000\000\002:\000\240\000\000\000\000\0024\000\000\002;\001P\000\000\000\000\002\\\002e\002f\000\000\000\000\001S\000\000\002\139\001\017\000\000\000\000\000\000\005?\000\130\000\000\000\000\002#\000\240\000\000\000\000\0024\000\000\002$\000\239\000\000\000\000\0025\000\244\0026\002v\000\000\001\025\000\000\000\000\000\000\001\019\001S\000\000\0027\000\000\000\000\000\000\000\246\002e\002\183\000\000\000\000\005A\000\000\000\000\000\000\000\129\000\000\002d\0027\000\231\0028\000\000\004\202\0023\000\232\0029\005F\000\000\000\000\002:\000\240\000\000\0025\004\203\0026\002;\0028\000\000\000\000\002\\\000\000\002\128\001S\000\000\0027\002:\000\000\005G\000\000\002\175\000\000\002;\000\000\004\186\000\000\004\205\000\000\000\000\000\000\000\000\000\000\000\000\0028\000\000\000\000\000\000\000\000\0029\000\000\000\000\000\240\002:\005H\000\241\000\000\000\000\000\000\002;\0056\005\155\000\130\002\\\000\000\002\175\000\000\000\225\000\000\004\186\000\000\004\205\000\000\000\233\004\214\000\000\000\000\000\000\000\129\000\000\000\000\000\000\002!\000\000\000\000\002-\000\000\000\242\000\240\000\000\000\000\0024\004\215\000\000\0056\005\145\002\195\004\216\004\188\000\000\000\174\004\217\000\000\000\000\004\189\000\000\000\000\004\218\000\239\000\000\000\000\000\000\000\000\000\000\002e\004\193\000\243\000\000\000\000\005=\000\000\000\000\000\000\000\000\000\000\002\175\000\000\000\000\000\000\004\186\002\195\004\205\004\188\000\000\000\000\000\244\000\000\000\000\004\189\0025\002/\0026\000\000\000\130\000\000\000\000\002#\000\000\000\000\001S\000\246\0027\002$\005=\0056\0057\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\175\000\000\000\000\0028\004\186\005?\004\205\000\000\0029\000\000\000\000\000\000\002:\000\000\000\000\000\000\000\129\002d\002;\000\000\000\222\002\027\002\\\0023\002\195\000\240\004\188\000\000\000\241\0056\005E\000\000\004\189\000\000\000\000\000\000\000\000\000\000\000\000\005?\005A\000\000\000\000\000\000\000\000\000\000\000\000\005=\000\000\000\000\000\000\004\202\000\000\000\000\000\000\005F\000\000\000\129\000\000\000\240\000\242\002!\004\203\000\000\002-\002\195\000\000\004\188\000\000\000\000\000\000\000\000\000\000\004\189\005A\000\000\005G\000\000\000\000\000\174\000\000\000\130\000\000\000\000\000\000\004\202\000\225\000\000\005=\005F\000\000\000\000\000\226\000\240\000\000\000\000\004\203\000\000\000\000\005?\000\000\005H\000\000\000\000\000\000\000\000\000\240\000\000\000\248\0024\005G\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\027\000\000\004\214\000\130\000\000\000\000\002#\000\000\000\239\000\000\000\000\000\000\002$\002e\005C\005A\005H\000\000\000\000\000\000\004\215\005?\000\000\000\000\000\000\004\216\004\202\000\000\000\000\004\217\005F\000\000\000\000\000\000\000\240\004\218\004\214\004\203\0025\000\000\0026\000\000\000\000\002d\000\000\000\000\000\000\000\000\001S\0023\0027\005G\000\000\000\000\004\215\000\000\005A\000\000\000\000\004\216\002\175\000\000\000\000\004\217\004\186\000\000\004\205\004\202\0028\004\218\000\000\005F\000\000\0029\000\000\000\240\005H\002:\004\203\000\000\000\000\000\000\000\000\002;\000\000\000\000\000\000\002\\\000\000\0056\005\157\000\240\005G\000\000\000\241\000\000\004\214\000\000\000\000\000\000\000\129\000\000\000\000\000\000\002!\000\000\000\000\002-\000\000\000\000\000\000\000\000\000\000\000\000\004\215\000\000\000\000\005H\000\000\004\216\000\000\000\000\000\174\004\217\000\000\002\195\000\242\004\188\000\000\004\218\000\000\000\000\000\240\004\189\000\129\0024\000\000\004\214\002!\000\000\000\000\002-\000\000\000\000\000\000\000\000\000\000\000\000\005=\000\000\000\000\000\000\000\000\000\000\000\000\004\215\000\174\000\000\002e\005`\004\216\000\000\000\000\000\000\004\217\000\130\000\000\000\000\002#\000\000\004\218\000\000\000\000\000\000\002$\000\129\000\000\000\000\000\000\002!\000\000\000\000\002-\0025\000\000\0026\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001S\000\000\0027\000\000\000\174\000\000\000\130\005?\000\000\002#\000\000\000\000\002d\000\000\000\000\002$\000\000\000\000\0023\000\000\0028\000\000\000\000\000\000\000\000\0029\000\129\000\000\000\000\002:\002!\000\000\000\000\002-\000\000\002;\000\000\000\000\000\000\002\\\000\000\000\000\005A\000\000\000\000\000\000\002c\000\130\000\174\000\000\002#\000\000\0023\004\202\000\000\000\000\002$\005F\000\000\000\000\000\000\000\240\000\000\000\000\004\203\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005G\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0022\000\000\000\000\000\000\000\130\000\000\0023\002#\000\129\000\000\000\000\000\000\002!\002$\000\240\002-\005H\0024\000\000\000\000\000\000\002\175\000\000\000\000\000\000\002\176\000\000\000\000\000\000\002\177\000\174\000\000\000\000\000\000\000\000\000\000\004\214\000\000\000\000\000\000\002e\006\023\000\000\000\000\002^\000\000\000\000\000\000\000\240\000\000\0023\0024\000\129\000\000\004\215\000\000\000\231\000\000\000\000\004\216\000\000\000\235\000\000\004\217\000\000\0025\000\000\0026\000\000\004\218\000\000\000\000\000\000\000\130\000\174\001S\002#\0027\000\000\000\000\000\000\000\000\002$\000\000\000\000\000\000\002\195\000\000\000\000\000\240\002\178\000\000\0024\000\000\000\000\0028\002\179\000\000\000\000\0025\0029\0026\000\000\000\000\002:\000\000\000\000\000\000\000\000\001S\002;\0027\000\000\002b\002\\\000\000\000\000\000\130\000\000\0023\000\000\000\000\000\225\002\196\001\015\000\000\000\000\000\000\000\233\0028\000\000\002\197\000\000\000\240\0029\000\000\0024\000\000\002:\000\000\0025\000\000\0026\000\000\002;\000\000\000\000\000\000\002\\\000\000\001S\000\129\0027\000\000\000\000\000\231\000\000\000\000\000\000\000\000\000\235\002\198\000\000\000\239\000\000\002\175\000\000\000\000\000\000\002\176\0028\000\000\000\000\002\177\000\000\0029\000\000\000\000\000\000\002:\000\000\000\000\000\000\000\000\0025\002;\0026\000\000\000\000\002\\\000\000\002\200\000\000\000\000\001S\000\000\0027\000\000\000\000\000\000\000\000\000\000\000\240\000\000\000\000\0024\000\000\002\192\002\255\002\238\000\000\000\000\000\000\000\000\0028\000\240\000\130\000\000\002\193\0029\000\000\000\225\000\000\002:\000\000\000\000\000\000\000\233\000\000\002;\002\195\000\000\000\000\002\\\002\178\000\000\000\000\000\000\000\000\002\249\002\179\000\000\000\000\000\000\000\000\002\241\000\240\000\000\000\000\000\241\000\000\000\000\000\000\0025\002\203\0026\000\000\000\000\000\000\000\000\000\129\000\000\000\239\001S\000\231\0027\000\000\002\196\000\000\000\235\000\000\000\000\000\000\000\000\002\133\002\197\000\000\000\000\000\000\000\000\000\000\000\242\000\174\0028\000\000\000\000\000\000\000\000\0029\000\000\000\000\000\129\002:\000\000\000\000\000\231\000\000\002\205\002;\002\135\000\235\000\000\002\\\000\000\000\000\002\198\000\000\001S\000\000\000\000\001\017\000\000\002\206\000\174\000\129\000\000\000\000\000\000\000\231\000\000\000\000\000\000\000\000\000\232\000\000\000\130\000\000\000\000\000\000\000\244\000\225\000\000\001\015\001\025\000\000\002\200\000\233\001\019\000\129\000\000\000\000\000\000\000\231\000\000\000\246\000\240\000\000\000\235\000\241\000\000\000\000\002\192\002\236\002\238\000\000\000\000\000\130\000\000\000\000\000\240\000\174\000\225\002\193\001\015\000\000\000\000\000\000\000\233\000\000\000\000\000\000\000\239\000\000\000\000\000\000\000\000\000\000\000\000\004\224\000\130\000\242\000\000\000\000\002\249\000\225\000\000\000\000\000\000\000\000\002\241\000\233\000\000\000\000\000\000\000\000\000\129\000\000\000\000\002\203\000\231\000\000\000\000\000\239\000\130\000\235\000\000\000\000\000\000\000\225\001\017\001\015\000\129\000\000\000\000\000\233\000\231\000\000\000\174\000\000\000\000\000\235\000\000\000\000\000\000\000\000\000\239\000\000\000\000\000\244\000\000\000\000\000\000\001\023\000\174\000\000\000\000\001\019\000\000\000\000\000\000\000\000\002\205\000\000\000\246\000\000\000\000\000\000\000\000\000\000\000\239\000\000\000\000\000\000\000\000\000\240\000\000\002\206\000\241\000\000\000\000\000\130\000\000\000\000\000\000\000\000\000\225\000\000\001\015\000\000\000\000\000\000\000\233\000\000\000\000\000\000\000\000\000\130\000\000\000\000\000\000\000\000\000\225\002\011\001\015\000\000\000\240\000\000\000\233\000\241\000\242\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\239\003\028\000\240\000\000\000\000\000\241\000\000\002\011\000\000\001S\000\000\000\000\001\017\002\175\000\242\000\000\000\239\002\176\000\000\000\000\000\000\002\177\000\000\000\000\000\000\000\000\000\240\000\000\000\000\000\241\000\000\000\244\003\"\000\000\000\000\001\025\000\000\000\242\000\000\001\019\001S\000\000\000\000\001\017\000\000\000\000\000\246\002\175\000\000\000\000\000\000\002\176\000\000\000\000\002\011\002\177\000\129\000\000\000\000\000\000\000\231\000\242\000\244\000\000\000\000\000\235\001\025\000\000\000\000\000\000\001\019\000\000\000\000\000\000\000\000\000\000\000\000\000\246\002\195\003&\000\000\000\000\002\178\000\240\000\000\003\026\000\241\001S\002\179\000\000\001\017\000\000\000\000\000\000\000\000\000\000\002\175\000\000\000\000\000\240\002\176\000\000\000\241\000\129\002\177\000\000\000\000\000\222\002\030\000\244\000\000\002\011\002\195\001\025\000\000\002\196\002\178\001\019\000\242\000\000\000\000\000\130\002\179\002\197\000\246\000\000\000\225\004\165\001\015\000\000\000\000\000\000\000\233\000\000\000\242\000\000\004\144\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001S\000\000\000\129\001\017\000\000\002\196\000\231\000\000\004\167\002\198\000\000\000\235\000\000\002\197\000\000\000\000\001S\002\195\000\000\001\017\000\000\002\178\000\244\000\239\000\130\000\000\001\025\002\179\000\000\000\225\001\019\000\000\000\000\000\000\000\000\000\226\000\000\000\246\000\244\002\200\000\129\000\000\001\025\002\198\000\231\000\000\001\019\000\000\000\000\000\235\000\000\000\000\000\000\000\246\002\247\002\192\004\252\002\238\000\000\000\000\000\000\000\000\002\197\000\240\000\000\000\000\002\193\000\130\000\000\000\000\000\239\000\000\000\225\002\200\001\015\000\000\000\000\000\000\000\233\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\249\000\000\002\192\007\230\002\238\002\198\002\241\000\000\000\000\000\000\000\240\000\000\000\129\002\193\002\251\002\203\000\231\000\000\000\130\000\240\000\000\000\232\000\241\000\225\000\000\001\015\000\239\000\000\000\000\000\233\000\000\000\000\000\000\000\000\002\249\002\200\000\000\000\000\000\000\000\000\002\241\000\000\000\000\000\000\000\000\000\000\000\129\002\253\000\000\002\203\000\231\002\192\000\000\002\238\000\242\000\235\000\000\000\000\002\205\000\240\000\000\000\000\002\193\000\129\000\239\000\000\000\240\000\231\000\000\000\241\000\000\000\000\000\235\002\206\000\000\000\000\000\000\000\130\000\000\000\000\000\000\000\000\000\225\001\017\000\000\000\000\000\000\000\000\000\233\002\241\000\000\000\000\002\205\000\000\000\000\000\000\000\000\000\000\002\203\000\000\000\000\000\242\000\244\000\000\004Y\000\000\001\025\002\206\000\000\000\240\001\019\000\130\000\241\000\000\000\000\000\000\000\225\000\246\001\015\000\000\000\000\000\129\000\233\000\239\000\000\000\231\000\000\000\000\000\130\000\000\000\235\000\000\000\000\000\225\000\000\001\015\000\000\002\253\000\000\000\233\000\000\002\205\004j\000\000\000\242\000\129\000\000\000\240\000\000\000\231\000\241\000\000\000\000\000\000\000\237\000\000\002\206\000\239\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\129\001\017\000\239\002\253\000\231\000\000\000\000\000\000\000\000\000\235\000\242\000\000\000\000\000\000\000\130\000\000\000\000\000\000\000\000\000\225\000\244\001\015\000\129\000\000\001\025\000\233\000\231\000\000\001\019\000\000\000\000\000\235\000\000\000\000\000\240\000\246\000\000\000\241\000\130\001\017\000\000\000\000\000\129\000\225\000\000\000\000\000\231\000\000\000\000\000\233\000\000\000\235\000\000\000\000\000\000\000\000\000\000\000\000\000\244\000\000\000\239\000\000\001\025\004v\000\000\000\130\001\019\000\000\000\240\000\242\000\225\000\241\001\015\000\246\000\000\000\000\000\233\000\000\000\000\000\000\004~\000\000\000\000\000\000\000\239\000\240\000\000\000\130\000\241\004\222\000\000\000\000\000\225\000\129\001\015\000\000\002\253\000\231\000\233\000\000\000\000\000\000\000\235\000\242\000\000\000\000\000\000\000\130\000\000\000\000\000\000\000\239\000\225\002\253\001\015\000\000\000\000\000\248\000\233\000\000\000\242\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\029\000\000\000\000\005\023\001\017\000\239\000\000\000\000\000\129\000\000\004\133\000\000\000\231\000\000\000\000\000\240\000\000\000\235\000\241\000\000\000\000\001\017\000\000\000\244\000\000\000\239\000\000\001\025\000\000\000\000\000\130\001\019\000\000\000\000\000\000\000\225\000\000\001\015\000\246\000\240\000\244\000\233\000\241\002\253\001\025\000\000\000\000\000\000\001\019\000\000\000\242\000\000\000\000\000\000\005\025\000\246\000\000\000\000\000\000\000\129\000\000\000\000\000\000\000\231\000\000\000\000\000\240\000\000\000\235\000\241\000\000\000\000\000\000\000\130\000\242\000\000\000\239\000\000\000\225\001\017\001\015\000\000\000\000\005d\000\233\000\000\000\000\000\000\000\240\000\000\000\000\000\241\000\000\000\000\001\024\000\000\000\000\005\027\000\244\000\000\000\000\000\242\001\025\000\243\000\000\000\000\001\019\000\000\000\240\000\000\000\000\000\241\000\000\000\246\000\000\000\000\002\253\000\000\000\000\000\239\000\000\000\000\000\244\000\242\000\130\000\000\000\000\0021\000\000\000\225\001\017\001\015\000\000\000\000\000\000\000\233\001\024\000\246\000\129\000\000\000\000\000\000\000\231\000\242\000\000\000\000\000\000\000\235\000\000\000\244\000\000\000\000\001\017\001\025\000\000\000\000\000\129\001\019\000\000\000\240\000\231\000\000\000\241\000\000\000\246\000\235\000\000\000\000\000\000\000\129\000\239\000\244\001\017\000\231\000\000\001\025\000\000\000\000\000\235\001\019\000\000\000\000\000\000\000\000\000\000\000\000\000\246\001\024\000\000\000\000\000\000\000\244\000\000\000\000\000\242\001\025\000\000\000\000\000\000\001\019\000\129\000\000\000\240\000\130\000\231\000\241\000\246\000\000\000\225\000\235\001\015\000\000\000\000\000\000\000\233\000\000\000\000\000\000\000\000\000\000\000\000\000\130\000\000\001\017\000\000\000\000\000\225\000\000\001\015\000\000\001\024\000\129\000\233\000\000\000\130\000\231\000\000\000\242\000\000\000\225\000\235\001\015\000\244\000\000\000\000\000\233\001\025\000\000\005q\000\239\001\019\000\000\000\000\000\240\000\000\000\000\000\241\000\246\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\130\001\017\000\239\000\000\000\000\000\225\000\000\001\015\000\000\000\000\000\000\000\233\000\000\000\000\000\000\000\239\002\253\000\000\000\000\000\000\000\244\000\000\000\000\000\242\001\025\000\000\000\000\000\000\001\019\000\000\000\000\000\130\000\000\000\000\000\000\000\246\000\225\000\000\001\015\000\000\000\129\000\000\000\233\000\000\000\231\000\000\000\239\000\000\000\000\000\235\000\000\000\000\001\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005z\000\000\000\000\000\000\000\000\000\240\000\000\000\000\000\241\000\244\000\000\000\000\000\000\001\025\000\000\000\239\000\000\001\019\005\130\000\000\000\000\000\129\000\000\000\240\000\246\000\231\000\241\000\000\000\000\000\000\000\237\005\237\000\000\002\253\000\000\000\000\000\240\000\000\000\000\000\241\000\242\000\000\000\000\000\130\000\000\000\000\000\000\000\000\000\225\000\000\001\015\002\253\000\129\000\000\000\233\000\000\000\231\000\000\000\242\000\000\000\000\000\235\005\249\000\000\002\253\000\000\000\000\000\240\000\000\001\017\000\241\000\242\000\129\000\000\000\000\000\000\000\231\000\000\000\000\000\000\000\000\000\235\000\000\000\000\000\000\000\000\000\130\001\017\000\244\000\239\000\000\000\225\001\025\005\254\000\000\002\253\001\019\000\233\000\240\000\000\001\017\000\241\000\242\000\246\000\000\000\000\000\244\000\000\000\000\000\000\001\025\000\000\000\000\000\000\001\019\000\000\000\000\000\130\000\000\000\244\000\000\000\246\000\225\001\025\001\015\000\000\002\253\001\019\000\233\000\000\000\000\001\017\000\239\000\242\000\246\000\000\000\000\000\130\000\000\000\000\000\000\000\000\000\225\000\000\001\015\000\000\000\000\000\000\000\233\000\000\000\244\000\129\000\000\000\000\001\025\000\231\000\000\000\000\001\019\000\000\000\235\000\000\001\017\000\239\000\129\000\246\000\000\006\005\000\231\000\000\000\000\000\000\000\240\000\237\000\000\000\241\000\000\000\000\000\000\000\000\000\000\000\244\000\129\000\239\000\000\001\025\000\231\000\000\000\000\001\019\000\000\000\235\000\000\000\000\000\000\000\129\000\246\000\000\000\000\000\231\002\253\000\000\000\000\000\000\000\235\000\000\000\000\000\242\000\129\000\000\000\000\000\000\000\231\000\000\000\000\000\240\000\130\000\235\000\241\000\000\000\000\000\225\000\000\001\015\000\000\000\000\000\000\000\233\007\194\000\130\000\000\000\000\000\000\000\000\000\225\000\000\001\017\000\000\000\000\000\000\000\233\006\014\000\000\000\000\000\000\000\000\000\240\000\130\000\000\000\241\000\242\000\000\000\225\000\000\001\015\000\244\000\000\000\000\000\233\001\025\000\130\006\027\000\239\001\019\000\000\000\225\000\240\001\015\000\000\000\241\000\246\000\233\000\000\000\130\002\253\000\239\000\000\000\000\000\225\000\243\001\015\000\242\000\000\000\000\000\233\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\239\002\253\000\000\000\000\000\000\000\244\000\000\000\000\000\242\000\000\004\207\000\000\000\129\000\239\000\000\000\000\000\231\001\017\000\000\000\000\000\246\000\235\000\000\000\000\000\000\000\129\000\239\000\000\000\000\000\231\000\000\000\000\b'\000\000\000\235\000\000\000\244\001\017\000\000\000\000\001\025\000\000\000\000\000\000\001\019\000\129\000\000\006(\000\000\000\231\000\000\000\246\000\240\000\000\000\235\000\241\000\244\000\000\000\000\000\000\001\025\000\000\000\000\000\000\001\019\000\240\000\000\000\000\000\241\000\000\000\000\000\246\000\000\000\000\000\000\000\000\000\000\000\130\006-\000\000\002\253\000\000\000\225\000\240\001\015\000\000\000\241\000\242\000\233\000\000\000\130\0064\000\000\000\000\000\000\000\225\000\240\001\015\000\000\000\241\000\242\000\233\000\129\000\000\000\000\000\000\000\222\002\160\000\000\000\240\000\130\002\253\000\241\000\000\000\000\000\225\001\017\001\015\000\242\000\000\000\000\000\233\000\000\000\239\002\253\000\000\000\000\000\000\000\000\000\243\000\000\000\242\000\000\000\000\000\000\000\244\000\239\007\195\000\000\001\025\000\000\000\000\000\000\001\019\000\242\000\129\000\000\001\017\000\244\000\231\000\246\000\000\000\000\004\209\000\235\000\129\000\239\000\000\000\000\000\231\001\017\000\000\000\000\000\246\000\235\000\000\000\244\000\130\000\000\000\000\001\025\000\000\000\225\001\017\001\019\000\000\000\000\000\000\000\226\000\244\000\000\000\246\000\000\001\025\000\000\000\000\000\000\001\019\000\000\000\000\000\000\000\000\000\244\000\000\000\246\000\000\001\025\000\000\000\000\000\000\001\019\000\000\000\000\000\000\000\000\000\000\000\240\000\246\000\000\000\241\000\130\000\000\000\000\000\239\000\000\000\225\000\000\001\015\000\000\000\240\000\130\000\233\000\241\000\000\000\000\000\225\000\000\001\015\000\000\000\000\000\000\000\233\000\000\000\000\007\195\000\000\000\000\000\000\000\000\000\240\000\000\000\242\000\241\000\000\000\129\000\000\000\000\001?\000\231\000\000\000\000\000\000\000\000\000\235\000\242\000\000\000\239\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\129\000\000\000\239\001L\000\231\000\000\001\017\000\000\000\000\000\235\000\242\000\000\000\000\000\000\000\000\000\000\000\000\000\129\000\000\001\017\000\000\000\231\000\000\000\000\000\000\000\244\000\235\000\000\000\000\001\025\000\000\000\000\000\240\001\019\000\000\000\241\000\000\000\000\000\244\001\017\000\246\000\000\001\025\000\000\000\000\000\130\001\019\000\000\000\000\000\000\000\225\000\000\001\015\000\246\000\000\000\000\000\233\000\000\000\244\000\000\000\000\000\000\001\025\000\000\000\000\000\130\001\019\000\242\000\000\000\000\000\225\000\000\001\015\000\246\000\000\000\240\000\233\000\000\000\241\000\000\000\000\000\000\000\130\000\000\000\000\000\240\000\000\000\225\000\241\001\015\000\000\000\239\000\000\000\233\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002i\000\000\000\000\000\000\000\000\000\000\000\000\000\242\000\239\000\000\002z\000\129\000\000\000\000\000\000\000\231\000\000\000\242\000\000\000\000\000\235\000\000\000\000\000\000\000\000\000\239\000\000\000\000\000\129\000\000\000\000\000\000\000\231\000\000\000\000\000\000\001\017\000\235\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\017\000\000\000\129\000\000\000\000\000\000\000\231\000\000\000\000\000\244\000\000\000\235\000\000\001\025\000\000\000\000\000\000\001\019\000\000\000\244\000\000\000\000\000\129\001\025\000\246\000\240\000\231\001\019\000\241\000\000\000\130\000\235\000\000\000\000\000\246\000\225\000\000\001\015\000\000\000\000\000\000\000\233\000\000\000\000\000\000\000\240\000\000\000\130\000\241\000\000\000\000\000\000\000\225\002\142\001\015\000\129\000\000\000\000\000\233\000\231\000\242\000\000\000\240\000\000\000\235\000\241\000\000\000\130\000\000\000\000\000\000\000\000\000\225\002\144\001\015\000\000\000\239\000\000\000\233\000\000\000\242\000\000\000\000\000\000\000\000\000\000\000\000\000\130\000\000\001\017\002\186\000\000\000\225\000\239\001\015\000\000\000\000\000\242\000\233\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\244\001\017\000\000\000\000\001\025\000\239\000\000\000\000\001\019\000\000\000\000\000\000\000\130\000\000\000\000\000\246\000\000\000\225\001\017\001\015\000\244\000\000\000\129\000\233\001\025\000\239\000\231\000\000\001\019\000\000\000\000\000\235\000\000\000\000\000\000\000\246\000\000\000\244\000\000\000\000\000\000\001\025\000\000\000\000\000\000\001\019\000\000\000\000\000\000\000\000\000\000\000\240\000\246\000\000\000\241\000\000\000\000\000\000\000\239\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\240\000\000\000\000\000\241\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004H\000\000\000\000\000\000\000\000\000\000\000\000\000\242\000\130\000\240\000\000\000\000\000\241\000\225\000\000\001\015\000\000\004N\000\000\000\233\000\000\000\000\000\000\000\000\000\242\000\000\000\000\000\000\000\000\000\240\000\000\000\000\000\241\000\000\000\000\000\000\001\017\004\149\000\000\000\129\000\000\000\000\000\000\000\231\000\242\000\000\000\000\000\000\000\235\000\000\000\000\000\000\000\129\001\017\000\239\000\244\000\231\004\154\000\000\001\025\000\000\000\235\000\240\001\019\000\242\000\241\000\000\000\000\000\000\000\000\000\246\000\000\000\244\001\017\000\000\000\000\001\025\000\000\000\000\000\000\001\019\000\000\000\129\000\000\000\000\000\000\000\231\000\246\000\000\000\000\004\158\000\235\000\244\001\017\000\000\000\000\001\025\000\242\000\000\000\129\001\019\000\000\000\000\000\231\000\130\000\000\000\000\000\246\000\235\000\225\000\000\001\015\000\244\000\000\000\000\000\233\001\025\000\130\000\000\000\000\001\019\000\000\000\225\000\000\001\015\000\000\001\017\000\246\000\233\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\240\000\000\000\000\000\241\000\000\000\129\000\000\000\000\000\244\000\231\000\130\000\000\001\025\000\239\000\235\000\225\001\019\001\015\000\000\000\000\000\000\000\233\000\000\000\246\000\000\000\000\000\239\000\130\004\196\000\000\000\000\000\000\000\225\000\000\001\015\000\242\000\000\000\000\000\233\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\239\000\000\000\129\000\000\000\000\000\000\000\231\000\000\001\017\000\000\000\000\000\235\000\000\000\000\000\130\000\000\000\000\000\239\000\000\000\225\000\000\001\015\000\000\000\000\000\000\000\233\000\000\000\244\000\000\000\000\000\000\001\025\000\000\000\000\000\000\001\019\000\000\000\000\000\000\000\000\000\240\000\000\000\246\000\241\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\240\000\000\000\000\000\241\000\000\000\000\000\000\000\239\000\000\000\000\000\000\000\000\000\000\000\000\000\130\005\015\000\000\000\000\000\000\000\225\000\000\001\015\000\242\000\000\000\000\000\233\000\000\000\000\005:\000\000\000\240\000\000\000\000\000\241\000\000\000\242\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\240\000\000\000\000\000\241\001\017\000\000\000\000\000\000\000\000\000\000\000\129\005\224\000\000\000\239\000\231\000\000\000\000\001\017\000\242\000\235\000\000\000\000\000\000\000\244\000\000\000\000\000\000\001\025\006J\000\000\000\000\001\019\000\000\000\000\000\000\000\242\000\244\000\000\000\246\000\000\001\025\000\129\000\000\000\240\001\019\000\231\000\241\001\017\000\000\000\000\000\235\000\246\000\000\000\129\000\000\000\000\000\000\000\231\000\000\000\000\000\000\000\000\000\235\000\129\001\017\000\000\000\244\000\231\000\000\000\000\001\025\006^\000\235\000\000\001\019\000\130\000\000\000\000\000\242\000\000\000\225\000\246\001\015\000\244\000\000\000\000\000\233\001\025\000\000\000\000\000\000\001\019\000\000\000\000\000\000\000\000\000\240\000\000\000\246\000\241\000\129\000\000\000\000\000\000\000\231\000\000\000\130\001\017\000\000\000\232\000\129\000\225\000\000\001\015\000\231\000\000\000\000\000\233\000\130\000\232\000\000\000\239\000\000\000\225\006`\001\015\000\244\000\000\000\130\000\233\001\025\000\242\000\000\000\225\001\019\001\015\000\000\000\000\000\129\000\233\000\000\000\246\000\231\000\000\000\000\000\000\000\000\000\232\000\000\000\000\000\000\000\000\000\239\000\129\000\000\000\000\000\000\000\231\000\000\000\000\001\017\000\000\000\232\000\000\000\239\000\130\000\000\000\000\000\000\000\000\000\225\000\000\000\000\000\000\000\239\000\130\000\233\000\000\000\000\000\244\000\225\000\000\000\000\001\025\000\000\000\000\000\233\001\019\000\000\000\129\000\000\000\000\000\000\000\231\000\246\000\000\000\000\000\000\000\232\000\000\000\000\000\000\000\000\000\130\000\240\000\000\000\000\000\241\000\225\000\000\000\000\000\239\000\000\000\129\000\233\000\000\000\000\000\231\000\130\000\000\000\000\000\239\000\232\000\225\000\000\000\000\000\000\000\000\000\000\000\233\000\000\000\000\006b\000\000\000\000\000\240\000\000\000\000\000\241\000\242\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\240\000\000\000\239\000\241\000\000\000\000\000\000\000\130\000\000\000\000\000\240\000\000\000\225\000\241\000\000\000\000\006h\000\239\000\233\000\000\000\000\001\017\000\000\000\242\000\000\000\000\000\000\000\000\006y\000\000\000\000\000\130\000\000\000\000\000\000\000\242\000\225\000\129\006\135\000\000\000\244\000\231\000\233\000\000\001\025\000\242\000\232\000\240\001\019\000\000\000\241\000\000\001\017\000\239\000\000\000\246\000\000\000\240\000\129\000\000\000\241\000\000\000\231\000\000\001\017\000\000\000\000\000\232\000\000\000\000\000\000\000\244\000\000\000\000\001\017\001\025\000\000\000\239\000\000\001\019\000\129\000\000\000\242\000\244\000\231\000\240\000\246\001\025\000\241\000\232\000\000\001\019\000\242\000\244\000\000\000\000\000\000\001\025\000\246\000\000\000\240\001\019\000\130\000\241\000\000\000\129\000\000\000\225\000\246\000\231\000\000\000\000\000\000\000\233\000\232\000\000\000\000\000\000\000\000\000\000\000\242\000\000\000\129\000\130\000\000\000\000\000\231\000\000\000\225\000\000\000\248\000\232\000\000\000\000\000\233\000\242\000\240\000\000\000\000\000\241\000\248\001\031\000\000\000\000\000\000\000\130\000\000\000\000\000\239\000\000\000\225\001!\000\000\000\000\000\000\000\000\000\233\000\000\000\000\000\000\000\240\000\000\000\000\000\241\000\000\000\000\000\000\000\000\000\248\000\239\000\130\000\242\000\000\000\000\000\000\000\225\000\000\000\000\000\000\001#\000\129\000\233\000\000\000\248\000\231\000\000\000\000\000\130\000\000\000\232\000\000\000\239\000\225\000\129\001%\000\242\000\000\000\231\000\233\000\000\000\129\000\000\000\232\000\000\000\231\000\000\000\000\000\000\000\000\000\232\000\000\000\000\000\000\000\000\000\000\000\000\000\239\000\000\000\129\000\248\000\129\000\000\000\231\000\000\000\231\000\000\000\000\000\232\000\000\000\232\001'\000\240\000\000\000\239\000\241\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\129\000\248\000\000\000\130\000\231\000\000\000\000\000\000\000\225\000\232\000\240\000\000\001)\000\241\000\233\000\000\000\130\000\000\000\000\000\000\000\000\000\225\000\000\000\130\000\242\000\000\000\000\000\233\000\225\000\000\000\000\000\000\000\240\000\000\000\233\000\241\000\000\000\000\000\000\000\000\000\000\000\130\000\000\000\130\000\000\000\242\000\225\000\129\000\225\000\239\000\000\000\231\000\233\000\000\000\233\000\129\000\232\000\240\000\000\000\231\000\241\000\000\000\239\000\000\000\232\000\130\000\000\000\242\000\000\000\239\000\225\000\129\000\248\000\000\000\240\000\231\000\233\000\241\000\000\000\000\000\232\000\000\000\000\001+\000\000\000\000\000\000\000\239\000\000\000\239\000\000\000\000\000\242\000\248\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001-\000\000\000\000\000\000\000\000\000\242\000\000\000\239\000\130\000\000\000\000\000\248\000\000\000\225\000\000\000\000\000\130\000\000\000\000\000\233\000\000\000\225\001/\000\000\000\000\000\000\000\000\000\233\000\240\000\000\000\129\000\241\000\130\000\000\000\231\000\000\000\248\000\225\000\000\000\232\000\000\000\240\000\000\000\233\000\241\000\000\000\000\0011\000\240\000\000\000\000\000\241\000\000\000\248\000\239\000\000\000\129\000\000\000\000\000\000\000\231\000\000\000\239\000\242\0013\000\232\000\240\000\000\000\240\000\241\000\000\000\241\000\000\000\000\000\000\000\000\000\242\000\000\000\239\000\000\000\000\000\000\000\129\000\242\000\000\000\000\000\231\000\000\000\000\000\000\000\240\000\232\000\000\000\241\000\000\000\130\000\000\000\000\000\129\000\000\000\225\000\242\000\231\000\242\000\000\000\129\000\233\000\232\000\000\000\231\000\000\000\248\000\000\000\000\000\232\000\000\000\000\000\000\000\000\000\000\000\000\000\130\0015\000\000\000\248\000\242\000\225\000\000\000\000\000\129\000\000\000\248\000\233\000\231\000\000\0017\000\000\000\240\000\232\000\000\000\241\000\239\0019\000\000\000\000\000\240\000\000\000\130\000\241\000\248\000\000\000\248\000\225\000\000\000\000\000\000\000\000\000\000\000\233\000\000\002=\000\240\002C\000\130\000\241\000\000\000\000\000\239\000\225\000\000\000\130\000\000\000\242\000\248\000\233\000\225\000\000\000\000\000\000\000\000\000\242\000\233\000\129\000\000\002E\000\000\000\231\000\000\000\000\000\000\000\000\000\232\000\000\000\239\000\130\000\000\000\242\000\129\000\129\000\225\000\000\000\231\000\231\000\000\000\000\000\233\000\232\000\232\000\000\000\239\000\129\000\000\000\000\000\000\000\231\000\000\000\239\000\000\000\000\000\232\000\248\000\000\000\000\000\000\000\240\000\000\000\000\000\241\000\248\000\000\000\000\002G\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002I\000\239\000\000\000\000\000\000\000\248\000\000\000\000\000\130\000\000\000\000\000\240\000\000\000\225\000\241\000\000\002K\000\000\000\000\000\233\000\242\000\129\000\000\000\130\000\130\000\231\000\000\000\000\000\225\000\225\000\232\000\000\000\000\000\000\000\233\000\233\000\130\000\240\000\000\000\000\000\241\000\225\000\000\000\000\000\000\000\000\000\242\000\233\000\129\000\000\000\000\000\000\000\231\000\240\000\239\000\000\000\241\000\232\000\129\000\000\000\240\000\000\000\231\000\241\000\000\000\000\000\000\000\232\000\248\000\239\000\239\000\000\000\242\000\000\000\129\000\000\000\000\000\000\000\231\002M\000\000\000\129\000\239\000\232\000\240\000\231\000\130\000\241\000\242\000\000\000\232\000\225\000\000\000\000\000\248\000\242\000\000\000\233\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002O\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\130\000\000\000\000\000\000\000\000\000\225\000\242\000\248\000\129\000\000\000\130\000\233\000\231\000\000\000\000\000\225\000\000\000\232\002Q\000\239\000\000\000\233\000\000\000\248\000\240\000\000\000\130\000\241\000\000\000\000\000\248\000\225\000\000\000\130\002S\000\000\000\000\000\233\000\225\000\240\000\240\002U\000\241\000\241\000\233\000\000\000\239\000\000\000\000\000\000\000\000\000\000\000\240\000\000\000\248\000\241\000\239\000\000\000\000\000\242\000\129\000\000\000\000\000\000\000\231\002W\000\000\000\000\000\000\000\232\000\000\000\000\000\239\000\130\000\242\000\242\000\000\000\000\000\225\000\239\000\000\000\000\000\000\000\000\000\233\000\000\000\000\000\242\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\240\000\000\000\000\000\241\000\000\000\248\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\129\002Y\000\239\000\000\000\231\000\248\000\248\000\000\000\130\000\232\000\000\000\000\000\240\000\225\000\000\000\241\002[\002\208\000\248\000\233\000\242\000\000\000\240\000\000\000\129\000\241\000\000\000\000\000\231\002\210\000\000\000\129\000\000\000\232\000\000\000\231\000\000\000\000\000\240\000\000\000\232\000\241\000\000\000\000\000\000\000\240\000\000\000\242\000\241\000\129\000\000\000\000\000\000\000\231\000\239\000\000\000\000\000\242\000\232\000\000\000\000\000\000\000\000\000\000\000\000\000\130\000\000\000\000\000\248\000\000\000\225\000\000\000\000\000\242\000\000\000\000\000\233\000\000\000\129\002\212\000\242\000\000\000\231\000\000\000\000\000\240\000\000\000\232\000\241\000\130\000\000\000\000\000\000\000\129\000\225\000\248\000\130\000\231\000\000\000\000\000\233\000\225\000\232\000\000\000\000\000\248\002\214\000\233\000\000\000\000\000\000\000\239\000\000\000\000\000\130\000\000\002\216\000\000\000\000\000\225\000\242\000\248\000\000\000\000\000\000\000\233\000\000\000\000\000\248\000\000\000\000\000\000\002\218\000\000\000\000\000\239\000\000\000\240\000\000\002\220\000\241\000\000\000\239\000\130\000\000\000\000\000\129\000\129\000\225\000\000\000\231\000\231\000\000\000\000\000\233\000\232\000\232\000\000\000\130\000\000\000\239\000\000\000\129\000\225\000\000\000\000\000\231\000\000\000\248\000\233\000\000\000\232\000\242\000\000\000\129\000\000\000\000\000\000\000\231\002\222\000\000\000\000\000\000\000\232\000\000\000\000\000\129\000\000\000\000\000\239\000\231\000\000\000\000\000\000\000\240\000\232\000\000\000\241\000\129\000\000\000\000\000\000\000\231\000\000\000\239\000\000\000\000\000\232\000\000\000\000\000\000\000\130\000\130\000\000\000\000\000\000\000\225\000\225\000\240\000\000\000\248\000\241\000\233\000\233\000\000\000\240\000\000\000\130\000\241\000\242\000\000\002\224\000\225\000\000\000\000\000\000\000\000\000\000\000\233\000\130\000\000\000\000\000\000\000\240\000\225\000\000\000\241\000\000\000\000\000\000\000\233\000\130\000\000\000\242\000\000\000\000\000\225\000\239\000\239\000\000\000\242\000\000\000\233\000\130\000\000\000\000\000\000\000\000\000\225\000\000\000\000\000\000\000\240\000\239\000\233\000\241\000\000\000\248\000\242\000\000\000\000\000\000\000\129\000\000\000\000\000\239\000\231\000\240\002\226\000\000\000\241\000\232\000\000\000\000\000\000\000\000\000\000\000\239\000\000\000\000\000\000\000\248\000\129\000\000\000\000\000\000\000\231\000\242\000\248\000\239\000\000\000\232\002\228\000\000\000\000\000\000\000\000\000\000\000\000\002\230\000\129\000\000\000\242\000\000\000\231\000\000\000\248\000\000\000\000\000\232\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\232\000\000\000\000\000\240\000\240\000\129\000\241\000\241\000\000\000\231\000\130\000\000\000\000\000\000\000\232\000\225\000\000\000\000\000\248\000\240\000\000\000\233\000\241\000\129\000\000\000\000\000\000\000\231\000\000\002\234\000\130\000\240\000\232\000\248\000\241\000\225\000\000\000\000\000\242\000\242\000\000\000\233\000\000\000\240\004\220\000\000\000\241\000\129\000\130\000\000\000\000\000\222\002\169\000\225\000\242\000\240\000\239\000\129\000\241\000\233\000\000\000\222\002\172\000\000\000\000\000\129\000\242\000\000\000\000\000\231\000\130\000\000\000\000\000\000\000\232\000\225\000\239\000\000\000\242\000\000\000\129\000\233\000\000\000\000\000\231\000\000\000\248\000\248\000\130\000\232\000\242\000\000\000\000\000\225\000\239\000\000\000\000\004\226\004\228\000\233\000\000\000\000\000\248\000\000\000\000\000\129\000\000\000\000\000\000\000\222\004\146\000\000\000\130\004\230\000\248\000\000\000\239\000\225\000\000\000\000\000\000\000\000\000\130\000\226\000\000\004\232\000\248\000\225\000\000\000\000\000\130\000\000\000\000\000\226\000\239\000\225\000\000\004\234\000\248\000\240\000\000\000\233\000\241\000\000\000\000\000\130\000\000\000\000\000\000\004\236\000\225\000\000\000\000\000\000\000\000\000\000\000\233\000\000\000\239\000\240\000\000\000\129\000\241\000\000\000\000\000\222\004\177\000\000\000\239\000\000\000\130\000\000\000\000\000\000\000\242\000\225\000\239\000\240\000\000\000\000\000\241\000\226\000\000\000\000\000\000\000\129\000\000\000\000\000\000\000\222\004\180\000\239\000\000\000\000\000\242\000\000\000\000\000\000\000\000\000\240\000\000\000\000\000\241\000\129\000\000\000\000\000\000\000\222\004\183\000\000\000\000\000\000\000\242\000\000\000\000\000\000\000\239\000\240\000\000\000\000\000\241\000\000\000\248\000\000\000\000\000\000\000\130\000\000\000\000\000\000\000\000\000\225\000\000\004\238\000\242\000\000\000\000\000\226\000\000\000\000\000\000\000\240\000\248\000\000\000\241\000\000\000\000\000\000\000\000\000\000\000\130\000\240\000\242\004\240\000\241\000\225\000\000\000\000\000\000\000\240\000\248\000\226\000\241\000\000\000\000\000\000\000\000\000\000\000\130\000\000\000\000\004\242\000\239\000\225\000\240\000\000\000\242\000\241\000\000\000\226\000\000\000\000\000\248\000\000\000\000\000\000\000\242\000\000\000\000\000\000\000\000\000\000\000\000\004\244\000\242\000\000\000\239\000\000\000\000\000\240\000\248\000\000\000\241\000\000\000\000\000\000\000\000\000\000\000\000\000\242\000\000\004\246\000\000\000\000\000\239\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\242\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\248\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\248\000\000\000\240\000\000\000\248\000\241\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\250\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\240\000\000\000\000\000\241\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\242\000\000\000\000\000\000\000\000\000\000\000\000\000\240\000\000\000\000\000\241\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\242\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\242"))
   
   let semantic_action =
     [|
@@ -1757,7 +1757,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_aexpr = 
-# 2320 "parser_cocci_menhir.mly"
+# 2357 "parser_cocci_menhir.mly"
              ( Ast0.set_arg_exp _1 )
 # 1763 "parser_cocci_menhir.ml"
          in
@@ -1778,14 +1778,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 136 "parser_cocci_menhir.mly"
+# 162 "parser_cocci_menhir.mly"
        (Parse_aux.list_info)
 # 1784 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_aexpr = 
-# 2322 "parser_cocci_menhir.mly"
+# 2359 "parser_cocci_menhir.mly"
       ( let (nm,lenname,pure,clt) = _1 in
       let nm = P.clt2mcode nm clt in
       let lenname =
@@ -1816,7 +1816,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_aexpr = 
-# 2331 "parser_cocci_menhir.mly"
+# 2368 "parser_cocci_menhir.mly"
       ( Ast0.set_arg_exp(Ast0.wrap(Ast0.TypeExp(_1))) )
 # 1822 "parser_cocci_menhir.ml"
          in
@@ -1838,7 +1838,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_any_strict = 
-# 2367 "parser_cocci_menhir.mly"
+# 2404 "parser_cocci_menhir.mly"
             ( Ast.WhenAny )
 # 1844 "parser_cocci_menhir.ml"
          in
@@ -1860,7 +1860,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_any_strict = 
-# 2368 "parser_cocci_menhir.mly"
+# 2405 "parser_cocci_menhir.mly"
             ( Ast.WhenStrict )
 # 1866 "parser_cocci_menhir.ml"
          in
@@ -1882,7 +1882,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_any_strict = 
-# 2369 "parser_cocci_menhir.mly"
+# 2406 "parser_cocci_menhir.mly"
             ( Ast.WhenForall )
 # 1888 "parser_cocci_menhir.ml"
          in
@@ -1904,7 +1904,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_any_strict = 
-# 2370 "parser_cocci_menhir.mly"
+# 2407 "parser_cocci_menhir.mly"
             ( Ast.WhenExists )
 # 1910 "parser_cocci_menhir.ml"
          in
@@ -1928,7 +1928,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_arith_expr_eexpr_dot_expressions_ = 
-# 1541 "parser_cocci_menhir.mly"
+# 1578 "parser_cocci_menhir.mly"
                                             ( _1 )
 # 1934 "parser_cocci_menhir.ml"
          in
@@ -1960,7 +1960,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 171 "parser_cocci_menhir.mly"
+# 197 "parser_cocci_menhir.mly"
        (Data.clt)
 # 1966 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -1968,7 +1968,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_dot_expressions_ = 
-# 1543 "parser_cocci_menhir.mly"
+# 1580 "parser_cocci_menhir.mly"
       ( P.arith_op Ast.Mul _1 _2 _3 )
 # 1974 "parser_cocci_menhir.ml"
          in
@@ -2000,7 +2000,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 169 "parser_cocci_menhir.mly"
+# 195 "parser_cocci_menhir.mly"
        (Ast_cocci.arithOp * Data.clt)
 # 2006 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -2008,7 +2008,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_dot_expressions_ = 
-# 1545 "parser_cocci_menhir.mly"
+# 1582 "parser_cocci_menhir.mly"
       ( let (op,clt) = _2 in P.arith_op op _1 clt _3 )
 # 2014 "parser_cocci_menhir.ml"
          in
@@ -2040,7 +2040,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 170 "parser_cocci_menhir.mly"
+# 196 "parser_cocci_menhir.mly"
        (Data.clt)
 # 2046 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -2048,7 +2048,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_dot_expressions_ = 
-# 1547 "parser_cocci_menhir.mly"
+# 1584 "parser_cocci_menhir.mly"
       ( P.arith_op Ast.Plus _1 _2 _3 )
 # 2054 "parser_cocci_menhir.ml"
          in
@@ -2080,7 +2080,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 170 "parser_cocci_menhir.mly"
+# 196 "parser_cocci_menhir.mly"
        (Data.clt)
 # 2086 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -2088,7 +2088,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_dot_expressions_ = 
-# 1549 "parser_cocci_menhir.mly"
+# 1586 "parser_cocci_menhir.mly"
       ( P.arith_op Ast.Minus _1 _2 _3 )
 # 2094 "parser_cocci_menhir.ml"
          in
@@ -2120,7 +2120,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 168 "parser_cocci_menhir.mly"
+# 194 "parser_cocci_menhir.mly"
        (Ast_cocci.arithOp * Data.clt)
 # 2126 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -2128,7 +2128,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_dot_expressions_ = 
-# 1551 "parser_cocci_menhir.mly"
+# 1588 "parser_cocci_menhir.mly"
       ( let (op,clt) = _2 in P.arith_op op _1 clt _3 )
 # 2134 "parser_cocci_menhir.ml"
          in
@@ -2160,7 +2160,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 168 "parser_cocci_menhir.mly"
+# 194 "parser_cocci_menhir.mly"
        (Ast_cocci.arithOp * Data.clt)
 # 2166 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -2168,7 +2168,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_dot_expressions_ = 
-# 1553 "parser_cocci_menhir.mly"
+# 1590 "parser_cocci_menhir.mly"
       ( let (op,clt) = _2 in P.arith_op op _1 clt _3 )
 # 2174 "parser_cocci_menhir.ml"
          in
@@ -2200,7 +2200,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 167 "parser_cocci_menhir.mly"
+# 193 "parser_cocci_menhir.mly"
        (Ast_cocci.logicalOp * Data.clt)
 # 2206 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -2208,7 +2208,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_dot_expressions_ = 
-# 1555 "parser_cocci_menhir.mly"
+# 1592 "parser_cocci_menhir.mly"
       ( let (op,clt) = _2 in P.logic_op op _1 clt _3 )
 # 2214 "parser_cocci_menhir.ml"
          in
@@ -2240,7 +2240,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 166 "parser_cocci_menhir.mly"
+# 192 "parser_cocci_menhir.mly"
        (Data.clt)
 # 2246 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -2248,7 +2248,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_dot_expressions_ = 
-# 1557 "parser_cocci_menhir.mly"
+# 1594 "parser_cocci_menhir.mly"
       ( P.logic_op Ast.Eq _1 _2 _3 )
 # 2254 "parser_cocci_menhir.ml"
          in
@@ -2280,7 +2280,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 166 "parser_cocci_menhir.mly"
+# 192 "parser_cocci_menhir.mly"
        (Data.clt)
 # 2286 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -2288,7 +2288,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_dot_expressions_ = 
-# 1559 "parser_cocci_menhir.mly"
+# 1596 "parser_cocci_menhir.mly"
       ( P.logic_op Ast.NotEq _1 _2 _3 )
 # 2294 "parser_cocci_menhir.ml"
          in
@@ -2320,7 +2320,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 165 "parser_cocci_menhir.mly"
+# 191 "parser_cocci_menhir.mly"
        (Data.clt)
 # 2326 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -2328,7 +2328,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_dot_expressions_ = 
-# 1561 "parser_cocci_menhir.mly"
+# 1598 "parser_cocci_menhir.mly"
       ( P.arith_op Ast.And _1 _2 _3 )
 # 2334 "parser_cocci_menhir.ml"
          in
@@ -2360,7 +2360,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 163 "parser_cocci_menhir.mly"
+# 189 "parser_cocci_menhir.mly"
        (Data.clt)
 # 2366 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -2368,7 +2368,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_dot_expressions_ = 
-# 1563 "parser_cocci_menhir.mly"
+# 1600 "parser_cocci_menhir.mly"
       ( P.arith_op Ast.Or _1 _2 _3 )
 # 2374 "parser_cocci_menhir.ml"
          in
@@ -2400,7 +2400,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 164 "parser_cocci_menhir.mly"
+# 190 "parser_cocci_menhir.mly"
        (Data.clt)
 # 2406 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -2408,7 +2408,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_dot_expressions_ = 
-# 1565 "parser_cocci_menhir.mly"
+# 1602 "parser_cocci_menhir.mly"
       ( P.arith_op Ast.Xor _1 _2 _3 )
 # 2414 "parser_cocci_menhir.ml"
          in
@@ -2440,7 +2440,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 162 "parser_cocci_menhir.mly"
+# 188 "parser_cocci_menhir.mly"
        (Data.clt)
 # 2446 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -2448,7 +2448,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_dot_expressions_ = 
-# 1567 "parser_cocci_menhir.mly"
+# 1604 "parser_cocci_menhir.mly"
       ( P.logic_op Ast.AndLog _1 _2 _3 )
 # 2454 "parser_cocci_menhir.ml"
          in
@@ -2480,7 +2480,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 161 "parser_cocci_menhir.mly"
+# 187 "parser_cocci_menhir.mly"
        (Data.clt)
 # 2486 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -2488,7 +2488,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_dot_expressions_ = 
-# 1569 "parser_cocci_menhir.mly"
+# 1606 "parser_cocci_menhir.mly"
       ( P.logic_op Ast.OrLog _1 _2 _3 )
 # 2494 "parser_cocci_menhir.ml"
          in
@@ -2512,7 +2512,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_arith_expr_eexpr_invalid_ = 
-# 1541 "parser_cocci_menhir.mly"
+# 1578 "parser_cocci_menhir.mly"
                                             ( _1 )
 # 2518 "parser_cocci_menhir.ml"
          in
@@ -2544,7 +2544,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 171 "parser_cocci_menhir.mly"
+# 197 "parser_cocci_menhir.mly"
        (Data.clt)
 # 2550 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -2552,7 +2552,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_invalid_ = 
-# 1543 "parser_cocci_menhir.mly"
+# 1580 "parser_cocci_menhir.mly"
       ( P.arith_op Ast.Mul _1 _2 _3 )
 # 2558 "parser_cocci_menhir.ml"
          in
@@ -2584,7 +2584,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 169 "parser_cocci_menhir.mly"
+# 195 "parser_cocci_menhir.mly"
        (Ast_cocci.arithOp * Data.clt)
 # 2590 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -2592,7 +2592,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_invalid_ = 
-# 1545 "parser_cocci_menhir.mly"
+# 1582 "parser_cocci_menhir.mly"
       ( let (op,clt) = _2 in P.arith_op op _1 clt _3 )
 # 2598 "parser_cocci_menhir.ml"
          in
@@ -2624,7 +2624,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 170 "parser_cocci_menhir.mly"
+# 196 "parser_cocci_menhir.mly"
        (Data.clt)
 # 2630 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -2632,7 +2632,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_invalid_ = 
-# 1547 "parser_cocci_menhir.mly"
+# 1584 "parser_cocci_menhir.mly"
       ( P.arith_op Ast.Plus _1 _2 _3 )
 # 2638 "parser_cocci_menhir.ml"
          in
@@ -2664,7 +2664,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 170 "parser_cocci_menhir.mly"
+# 196 "parser_cocci_menhir.mly"
        (Data.clt)
 # 2670 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -2672,7 +2672,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_invalid_ = 
-# 1549 "parser_cocci_menhir.mly"
+# 1586 "parser_cocci_menhir.mly"
       ( P.arith_op Ast.Minus _1 _2 _3 )
 # 2678 "parser_cocci_menhir.ml"
          in
@@ -2704,7 +2704,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 168 "parser_cocci_menhir.mly"
+# 194 "parser_cocci_menhir.mly"
        (Ast_cocci.arithOp * Data.clt)
 # 2710 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -2712,7 +2712,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_invalid_ = 
-# 1551 "parser_cocci_menhir.mly"
+# 1588 "parser_cocci_menhir.mly"
       ( let (op,clt) = _2 in P.arith_op op _1 clt _3 )
 # 2718 "parser_cocci_menhir.ml"
          in
@@ -2744,7 +2744,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 168 "parser_cocci_menhir.mly"
+# 194 "parser_cocci_menhir.mly"
        (Ast_cocci.arithOp * Data.clt)
 # 2750 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -2752,7 +2752,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_invalid_ = 
-# 1553 "parser_cocci_menhir.mly"
+# 1590 "parser_cocci_menhir.mly"
       ( let (op,clt) = _2 in P.arith_op op _1 clt _3 )
 # 2758 "parser_cocci_menhir.ml"
          in
@@ -2784,7 +2784,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 167 "parser_cocci_menhir.mly"
+# 193 "parser_cocci_menhir.mly"
        (Ast_cocci.logicalOp * Data.clt)
 # 2790 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -2792,7 +2792,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_invalid_ = 
-# 1555 "parser_cocci_menhir.mly"
+# 1592 "parser_cocci_menhir.mly"
       ( let (op,clt) = _2 in P.logic_op op _1 clt _3 )
 # 2798 "parser_cocci_menhir.ml"
          in
@@ -2824,7 +2824,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 166 "parser_cocci_menhir.mly"
+# 192 "parser_cocci_menhir.mly"
        (Data.clt)
 # 2830 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -2832,7 +2832,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_invalid_ = 
-# 1557 "parser_cocci_menhir.mly"
+# 1594 "parser_cocci_menhir.mly"
       ( P.logic_op Ast.Eq _1 _2 _3 )
 # 2838 "parser_cocci_menhir.ml"
          in
@@ -2864,7 +2864,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 166 "parser_cocci_menhir.mly"
+# 192 "parser_cocci_menhir.mly"
        (Data.clt)
 # 2870 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -2872,7 +2872,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_invalid_ = 
-# 1559 "parser_cocci_menhir.mly"
+# 1596 "parser_cocci_menhir.mly"
       ( P.logic_op Ast.NotEq _1 _2 _3 )
 # 2878 "parser_cocci_menhir.ml"
          in
@@ -2904,7 +2904,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 165 "parser_cocci_menhir.mly"
+# 191 "parser_cocci_menhir.mly"
        (Data.clt)
 # 2910 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -2912,7 +2912,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_invalid_ = 
-# 1561 "parser_cocci_menhir.mly"
+# 1598 "parser_cocci_menhir.mly"
       ( P.arith_op Ast.And _1 _2 _3 )
 # 2918 "parser_cocci_menhir.ml"
          in
@@ -2944,7 +2944,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 163 "parser_cocci_menhir.mly"
+# 189 "parser_cocci_menhir.mly"
        (Data.clt)
 # 2950 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -2952,7 +2952,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_invalid_ = 
-# 1563 "parser_cocci_menhir.mly"
+# 1600 "parser_cocci_menhir.mly"
       ( P.arith_op Ast.Or _1 _2 _3 )
 # 2958 "parser_cocci_menhir.ml"
          in
@@ -2984,7 +2984,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 164 "parser_cocci_menhir.mly"
+# 190 "parser_cocci_menhir.mly"
        (Data.clt)
 # 2990 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -2992,7 +2992,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_invalid_ = 
-# 1565 "parser_cocci_menhir.mly"
+# 1602 "parser_cocci_menhir.mly"
       ( P.arith_op Ast.Xor _1 _2 _3 )
 # 2998 "parser_cocci_menhir.ml"
          in
@@ -3024,7 +3024,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 162 "parser_cocci_menhir.mly"
+# 188 "parser_cocci_menhir.mly"
        (Data.clt)
 # 3030 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -3032,7 +3032,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_invalid_ = 
-# 1567 "parser_cocci_menhir.mly"
+# 1604 "parser_cocci_menhir.mly"
       ( P.logic_op Ast.AndLog _1 _2 _3 )
 # 3038 "parser_cocci_menhir.ml"
          in
@@ -3064,7 +3064,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 161 "parser_cocci_menhir.mly"
+# 187 "parser_cocci_menhir.mly"
        (Data.clt)
 # 3070 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -3072,7 +3072,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_invalid_ = 
-# 1569 "parser_cocci_menhir.mly"
+# 1606 "parser_cocci_menhir.mly"
       ( P.logic_op Ast.OrLog _1 _2 _3 )
 # 3078 "parser_cocci_menhir.ml"
          in
@@ -3096,7 +3096,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_arith_expr_eexpr_nest_expressions_ = 
-# 1541 "parser_cocci_menhir.mly"
+# 1578 "parser_cocci_menhir.mly"
                                             ( _1 )
 # 3102 "parser_cocci_menhir.ml"
          in
@@ -3128,7 +3128,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 171 "parser_cocci_menhir.mly"
+# 197 "parser_cocci_menhir.mly"
        (Data.clt)
 # 3134 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -3136,7 +3136,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_nest_expressions_ = 
-# 1543 "parser_cocci_menhir.mly"
+# 1580 "parser_cocci_menhir.mly"
       ( P.arith_op Ast.Mul _1 _2 _3 )
 # 3142 "parser_cocci_menhir.ml"
          in
@@ -3168,7 +3168,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 169 "parser_cocci_menhir.mly"
+# 195 "parser_cocci_menhir.mly"
        (Ast_cocci.arithOp * Data.clt)
 # 3174 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -3176,7 +3176,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_nest_expressions_ = 
-# 1545 "parser_cocci_menhir.mly"
+# 1582 "parser_cocci_menhir.mly"
       ( let (op,clt) = _2 in P.arith_op op _1 clt _3 )
 # 3182 "parser_cocci_menhir.ml"
          in
@@ -3208,7 +3208,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 170 "parser_cocci_menhir.mly"
+# 196 "parser_cocci_menhir.mly"
        (Data.clt)
 # 3214 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -3216,7 +3216,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_nest_expressions_ = 
-# 1547 "parser_cocci_menhir.mly"
+# 1584 "parser_cocci_menhir.mly"
       ( P.arith_op Ast.Plus _1 _2 _3 )
 # 3222 "parser_cocci_menhir.ml"
          in
@@ -3248,7 +3248,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 170 "parser_cocci_menhir.mly"
+# 196 "parser_cocci_menhir.mly"
        (Data.clt)
 # 3254 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -3256,7 +3256,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_nest_expressions_ = 
-# 1549 "parser_cocci_menhir.mly"
+# 1586 "parser_cocci_menhir.mly"
       ( P.arith_op Ast.Minus _1 _2 _3 )
 # 3262 "parser_cocci_menhir.ml"
          in
@@ -3288,7 +3288,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 168 "parser_cocci_menhir.mly"
+# 194 "parser_cocci_menhir.mly"
        (Ast_cocci.arithOp * Data.clt)
 # 3294 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -3296,7 +3296,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_nest_expressions_ = 
-# 1551 "parser_cocci_menhir.mly"
+# 1588 "parser_cocci_menhir.mly"
       ( let (op,clt) = _2 in P.arith_op op _1 clt _3 )
 # 3302 "parser_cocci_menhir.ml"
          in
@@ -3328,7 +3328,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 168 "parser_cocci_menhir.mly"
+# 194 "parser_cocci_menhir.mly"
        (Ast_cocci.arithOp * Data.clt)
 # 3334 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -3336,7 +3336,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_nest_expressions_ = 
-# 1553 "parser_cocci_menhir.mly"
+# 1590 "parser_cocci_menhir.mly"
       ( let (op,clt) = _2 in P.arith_op op _1 clt _3 )
 # 3342 "parser_cocci_menhir.ml"
          in
@@ -3368,7 +3368,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 167 "parser_cocci_menhir.mly"
+# 193 "parser_cocci_menhir.mly"
        (Ast_cocci.logicalOp * Data.clt)
 # 3374 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -3376,7 +3376,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_nest_expressions_ = 
-# 1555 "parser_cocci_menhir.mly"
+# 1592 "parser_cocci_menhir.mly"
       ( let (op,clt) = _2 in P.logic_op op _1 clt _3 )
 # 3382 "parser_cocci_menhir.ml"
          in
@@ -3408,7 +3408,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 166 "parser_cocci_menhir.mly"
+# 192 "parser_cocci_menhir.mly"
        (Data.clt)
 # 3414 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -3416,7 +3416,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_nest_expressions_ = 
-# 1557 "parser_cocci_menhir.mly"
+# 1594 "parser_cocci_menhir.mly"
       ( P.logic_op Ast.Eq _1 _2 _3 )
 # 3422 "parser_cocci_menhir.ml"
          in
@@ -3448,7 +3448,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 166 "parser_cocci_menhir.mly"
+# 192 "parser_cocci_menhir.mly"
        (Data.clt)
 # 3454 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -3456,7 +3456,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_nest_expressions_ = 
-# 1559 "parser_cocci_menhir.mly"
+# 1596 "parser_cocci_menhir.mly"
       ( P.logic_op Ast.NotEq _1 _2 _3 )
 # 3462 "parser_cocci_menhir.ml"
          in
@@ -3488,7 +3488,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 165 "parser_cocci_menhir.mly"
+# 191 "parser_cocci_menhir.mly"
        (Data.clt)
 # 3494 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -3496,7 +3496,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_nest_expressions_ = 
-# 1561 "parser_cocci_menhir.mly"
+# 1598 "parser_cocci_menhir.mly"
       ( P.arith_op Ast.And _1 _2 _3 )
 # 3502 "parser_cocci_menhir.ml"
          in
@@ -3528,7 +3528,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 163 "parser_cocci_menhir.mly"
+# 189 "parser_cocci_menhir.mly"
        (Data.clt)
 # 3534 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -3536,7 +3536,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_nest_expressions_ = 
-# 1563 "parser_cocci_menhir.mly"
+# 1600 "parser_cocci_menhir.mly"
       ( P.arith_op Ast.Or _1 _2 _3 )
 # 3542 "parser_cocci_menhir.ml"
          in
@@ -3568,7 +3568,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 164 "parser_cocci_menhir.mly"
+# 190 "parser_cocci_menhir.mly"
        (Data.clt)
 # 3574 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -3576,7 +3576,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_nest_expressions_ = 
-# 1565 "parser_cocci_menhir.mly"
+# 1602 "parser_cocci_menhir.mly"
       ( P.arith_op Ast.Xor _1 _2 _3 )
 # 3582 "parser_cocci_menhir.ml"
          in
@@ -3608,7 +3608,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 162 "parser_cocci_menhir.mly"
+# 188 "parser_cocci_menhir.mly"
        (Data.clt)
 # 3614 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -3616,7 +3616,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_nest_expressions_ = 
-# 1567 "parser_cocci_menhir.mly"
+# 1604 "parser_cocci_menhir.mly"
       ( P.logic_op Ast.AndLog _1 _2 _3 )
 # 3622 "parser_cocci_menhir.ml"
          in
@@ -3648,7 +3648,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 161 "parser_cocci_menhir.mly"
+# 187 "parser_cocci_menhir.mly"
        (Data.clt)
 # 3654 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -3656,7 +3656,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_eexpr_nest_expressions_ = 
-# 1569 "parser_cocci_menhir.mly"
+# 1606 "parser_cocci_menhir.mly"
       ( P.logic_op Ast.OrLog _1 _2 _3 )
 # 3662 "parser_cocci_menhir.ml"
          in
@@ -3680,7 +3680,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_arith_expr_expr_invalid_ = 
-# 1541 "parser_cocci_menhir.mly"
+# 1578 "parser_cocci_menhir.mly"
                                             ( _1 )
 # 3686 "parser_cocci_menhir.ml"
          in
@@ -3712,7 +3712,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 171 "parser_cocci_menhir.mly"
+# 197 "parser_cocci_menhir.mly"
        (Data.clt)
 # 3718 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -3720,7 +3720,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_expr_invalid_ = 
-# 1543 "parser_cocci_menhir.mly"
+# 1580 "parser_cocci_menhir.mly"
       ( P.arith_op Ast.Mul _1 _2 _3 )
 # 3726 "parser_cocci_menhir.ml"
          in
@@ -3752,7 +3752,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 169 "parser_cocci_menhir.mly"
+# 195 "parser_cocci_menhir.mly"
        (Ast_cocci.arithOp * Data.clt)
 # 3758 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -3760,7 +3760,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_expr_invalid_ = 
-# 1545 "parser_cocci_menhir.mly"
+# 1582 "parser_cocci_menhir.mly"
       ( let (op,clt) = _2 in P.arith_op op _1 clt _3 )
 # 3766 "parser_cocci_menhir.ml"
          in
@@ -3792,7 +3792,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 170 "parser_cocci_menhir.mly"
+# 196 "parser_cocci_menhir.mly"
        (Data.clt)
 # 3798 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -3800,7 +3800,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_expr_invalid_ = 
-# 1547 "parser_cocci_menhir.mly"
+# 1584 "parser_cocci_menhir.mly"
       ( P.arith_op Ast.Plus _1 _2 _3 )
 # 3806 "parser_cocci_menhir.ml"
          in
@@ -3832,7 +3832,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 170 "parser_cocci_menhir.mly"
+# 196 "parser_cocci_menhir.mly"
        (Data.clt)
 # 3838 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -3840,7 +3840,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_expr_invalid_ = 
-# 1549 "parser_cocci_menhir.mly"
+# 1586 "parser_cocci_menhir.mly"
       ( P.arith_op Ast.Minus _1 _2 _3 )
 # 3846 "parser_cocci_menhir.ml"
          in
@@ -3872,7 +3872,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 168 "parser_cocci_menhir.mly"
+# 194 "parser_cocci_menhir.mly"
        (Ast_cocci.arithOp * Data.clt)
 # 3878 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -3880,7 +3880,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_expr_invalid_ = 
-# 1551 "parser_cocci_menhir.mly"
+# 1588 "parser_cocci_menhir.mly"
       ( let (op,clt) = _2 in P.arith_op op _1 clt _3 )
 # 3886 "parser_cocci_menhir.ml"
          in
@@ -3912,7 +3912,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 168 "parser_cocci_menhir.mly"
+# 194 "parser_cocci_menhir.mly"
        (Ast_cocci.arithOp * Data.clt)
 # 3918 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -3920,7 +3920,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_expr_invalid_ = 
-# 1553 "parser_cocci_menhir.mly"
+# 1590 "parser_cocci_menhir.mly"
       ( let (op,clt) = _2 in P.arith_op op _1 clt _3 )
 # 3926 "parser_cocci_menhir.ml"
          in
@@ -3952,7 +3952,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 167 "parser_cocci_menhir.mly"
+# 193 "parser_cocci_menhir.mly"
        (Ast_cocci.logicalOp * Data.clt)
 # 3958 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -3960,7 +3960,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_expr_invalid_ = 
-# 1555 "parser_cocci_menhir.mly"
+# 1592 "parser_cocci_menhir.mly"
       ( let (op,clt) = _2 in P.logic_op op _1 clt _3 )
 # 3966 "parser_cocci_menhir.ml"
          in
@@ -3992,7 +3992,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 166 "parser_cocci_menhir.mly"
+# 192 "parser_cocci_menhir.mly"
        (Data.clt)
 # 3998 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -4000,7 +4000,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_expr_invalid_ = 
-# 1557 "parser_cocci_menhir.mly"
+# 1594 "parser_cocci_menhir.mly"
       ( P.logic_op Ast.Eq _1 _2 _3 )
 # 4006 "parser_cocci_menhir.ml"
          in
@@ -4032,7 +4032,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 166 "parser_cocci_menhir.mly"
+# 192 "parser_cocci_menhir.mly"
        (Data.clt)
 # 4038 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -4040,7 +4040,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_expr_invalid_ = 
-# 1559 "parser_cocci_menhir.mly"
+# 1596 "parser_cocci_menhir.mly"
       ( P.logic_op Ast.NotEq _1 _2 _3 )
 # 4046 "parser_cocci_menhir.ml"
          in
@@ -4072,7 +4072,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 165 "parser_cocci_menhir.mly"
+# 191 "parser_cocci_menhir.mly"
        (Data.clt)
 # 4078 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -4080,7 +4080,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_expr_invalid_ = 
-# 1561 "parser_cocci_menhir.mly"
+# 1598 "parser_cocci_menhir.mly"
       ( P.arith_op Ast.And _1 _2 _3 )
 # 4086 "parser_cocci_menhir.ml"
          in
@@ -4112,7 +4112,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 163 "parser_cocci_menhir.mly"
+# 189 "parser_cocci_menhir.mly"
        (Data.clt)
 # 4118 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -4120,7 +4120,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_expr_invalid_ = 
-# 1563 "parser_cocci_menhir.mly"
+# 1600 "parser_cocci_menhir.mly"
       ( P.arith_op Ast.Or _1 _2 _3 )
 # 4126 "parser_cocci_menhir.ml"
          in
@@ -4152,7 +4152,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 164 "parser_cocci_menhir.mly"
+# 190 "parser_cocci_menhir.mly"
        (Data.clt)
 # 4158 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -4160,7 +4160,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_expr_invalid_ = 
-# 1565 "parser_cocci_menhir.mly"
+# 1602 "parser_cocci_menhir.mly"
       ( P.arith_op Ast.Xor _1 _2 _3 )
 # 4166 "parser_cocci_menhir.ml"
          in
@@ -4192,7 +4192,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 162 "parser_cocci_menhir.mly"
+# 188 "parser_cocci_menhir.mly"
        (Data.clt)
 # 4198 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -4200,7 +4200,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_expr_invalid_ = 
-# 1567 "parser_cocci_menhir.mly"
+# 1604 "parser_cocci_menhir.mly"
       ( P.logic_op Ast.AndLog _1 _2 _3 )
 # 4206 "parser_cocci_menhir.ml"
          in
@@ -4232,7 +4232,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 161 "parser_cocci_menhir.mly"
+# 187 "parser_cocci_menhir.mly"
        (Data.clt)
 # 4238 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -4240,7 +4240,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_expr_invalid_ = 
-# 1569 "parser_cocci_menhir.mly"
+# 1606 "parser_cocci_menhir.mly"
       ( P.logic_op Ast.OrLog _1 _2 _3 )
 # 4246 "parser_cocci_menhir.ml"
          in
@@ -4264,7 +4264,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_arith_expr_bis = 
-# 1574 "parser_cocci_menhir.mly"
+# 1611 "parser_cocci_menhir.mly"
                                                              ( _1 )
 # 4270 "parser_cocci_menhir.ml"
          in
@@ -4296,7 +4296,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 171 "parser_cocci_menhir.mly"
+# 197 "parser_cocci_menhir.mly"
        (Data.clt)
 # 4302 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -4304,7 +4304,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_bis = 
-# 1576 "parser_cocci_menhir.mly"
+# 1613 "parser_cocci_menhir.mly"
       ( P.arith_op Ast.Mul _1 _2 _3 )
 # 4310 "parser_cocci_menhir.ml"
          in
@@ -4336,7 +4336,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 169 "parser_cocci_menhir.mly"
+# 195 "parser_cocci_menhir.mly"
        (Ast_cocci.arithOp * Data.clt)
 # 4342 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -4344,7 +4344,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_bis = 
-# 1578 "parser_cocci_menhir.mly"
+# 1615 "parser_cocci_menhir.mly"
       ( let (op,clt) = _2 in P.arith_op op _1 clt _3 )
 # 4350 "parser_cocci_menhir.ml"
          in
@@ -4376,7 +4376,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 170 "parser_cocci_menhir.mly"
+# 196 "parser_cocci_menhir.mly"
        (Data.clt)
 # 4382 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -4384,7 +4384,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_bis = 
-# 1580 "parser_cocci_menhir.mly"
+# 1617 "parser_cocci_menhir.mly"
       ( P.arith_op Ast.Plus _1 _2 _3 )
 # 4390 "parser_cocci_menhir.ml"
          in
@@ -4416,7 +4416,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 170 "parser_cocci_menhir.mly"
+# 196 "parser_cocci_menhir.mly"
        (Data.clt)
 # 4422 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -4424,7 +4424,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_bis = 
-# 1582 "parser_cocci_menhir.mly"
+# 1619 "parser_cocci_menhir.mly"
       ( P.arith_op Ast.Minus _1 _2 _3 )
 # 4430 "parser_cocci_menhir.ml"
          in
@@ -4456,7 +4456,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 168 "parser_cocci_menhir.mly"
+# 194 "parser_cocci_menhir.mly"
        (Ast_cocci.arithOp * Data.clt)
 # 4462 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -4464,7 +4464,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_bis = 
-# 1584 "parser_cocci_menhir.mly"
+# 1621 "parser_cocci_menhir.mly"
       ( let (op,clt) = _2 in P.arith_op op _1 clt _3 )
 # 4470 "parser_cocci_menhir.ml"
          in
@@ -4496,7 +4496,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 168 "parser_cocci_menhir.mly"
+# 194 "parser_cocci_menhir.mly"
        (Ast_cocci.arithOp * Data.clt)
 # 4502 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -4504,7 +4504,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_bis = 
-# 1586 "parser_cocci_menhir.mly"
+# 1623 "parser_cocci_menhir.mly"
       ( let (op,clt) = _2 in P.arith_op op _1 clt _3 )
 # 4510 "parser_cocci_menhir.ml"
          in
@@ -4536,7 +4536,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 167 "parser_cocci_menhir.mly"
+# 193 "parser_cocci_menhir.mly"
        (Ast_cocci.logicalOp * Data.clt)
 # 4542 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -4544,7 +4544,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_bis = 
-# 1588 "parser_cocci_menhir.mly"
+# 1625 "parser_cocci_menhir.mly"
       ( let (op,clt) = _2 in P.logic_op op _1 clt _3 )
 # 4550 "parser_cocci_menhir.ml"
          in
@@ -4576,7 +4576,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 166 "parser_cocci_menhir.mly"
+# 192 "parser_cocci_menhir.mly"
        (Data.clt)
 # 4582 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -4584,7 +4584,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_bis = 
-# 1590 "parser_cocci_menhir.mly"
+# 1627 "parser_cocci_menhir.mly"
       ( P.logic_op Ast.Eq _1 _2 _3 )
 # 4590 "parser_cocci_menhir.ml"
          in
@@ -4616,7 +4616,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 166 "parser_cocci_menhir.mly"
+# 192 "parser_cocci_menhir.mly"
        (Data.clt)
 # 4622 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -4624,7 +4624,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_bis = 
-# 1592 "parser_cocci_menhir.mly"
+# 1629 "parser_cocci_menhir.mly"
       ( P.logic_op Ast.NotEq _1 _2 _3 )
 # 4630 "parser_cocci_menhir.ml"
          in
@@ -4656,7 +4656,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 165 "parser_cocci_menhir.mly"
+# 191 "parser_cocci_menhir.mly"
        (Data.clt)
 # 4662 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -4664,7 +4664,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_bis = 
-# 1594 "parser_cocci_menhir.mly"
+# 1631 "parser_cocci_menhir.mly"
       ( P.arith_op Ast.And _1 _2 _3 )
 # 4670 "parser_cocci_menhir.ml"
          in
@@ -4696,7 +4696,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 163 "parser_cocci_menhir.mly"
+# 189 "parser_cocci_menhir.mly"
        (Data.clt)
 # 4702 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -4704,7 +4704,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_bis = 
-# 1596 "parser_cocci_menhir.mly"
+# 1633 "parser_cocci_menhir.mly"
       ( P.arith_op Ast.Or _1 _2 _3 )
 # 4710 "parser_cocci_menhir.ml"
          in
@@ -4736,7 +4736,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 164 "parser_cocci_menhir.mly"
+# 190 "parser_cocci_menhir.mly"
        (Data.clt)
 # 4742 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -4744,7 +4744,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_bis = 
-# 1598 "parser_cocci_menhir.mly"
+# 1635 "parser_cocci_menhir.mly"
       ( P.arith_op Ast.Xor _1 _2 _3 )
 # 4750 "parser_cocci_menhir.ml"
          in
@@ -4776,7 +4776,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_arith_expr_bis = Obj.magic _3 in
         let _2 : (
-# 162 "parser_cocci_menhir.mly"
+# 188 "parser_cocci_menhir.mly"
        (Data.clt)
 # 4782 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -4784,7 +4784,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_arith_expr_bis = 
-# 1600 "parser_cocci_menhir.mly"
+# 1637 "parser_cocci_menhir.mly"
       ( P.logic_op Ast.AndLog _1 _2 _3 )
 # 4790 "parser_cocci_menhir.ml"
          in
@@ -4806,7 +4806,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_arity = 
-# 628 "parser_cocci_menhir.mly"
+# 654 "parser_cocci_menhir.mly"
               ( Ast.UNIQUE )
 # 4812 "parser_cocci_menhir.ml"
          in
@@ -4828,7 +4828,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_arity = 
-# 629 "parser_cocci_menhir.mly"
+# 655 "parser_cocci_menhir.mly"
               ( Ast.OPT )
 # 4834 "parser_cocci_menhir.ml"
          in
@@ -4850,7 +4850,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_arity = 
-# 630 "parser_cocci_menhir.mly"
+# 656 "parser_cocci_menhir.mly"
               ( Ast.MULTI )
 # 4856 "parser_cocci_menhir.ml"
          in
@@ -4867,7 +4867,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in
         let _endpos = _startpos in
         let _v : 'tv_arity = 
-# 631 "parser_cocci_menhir.mly"
+# 657 "parser_cocci_menhir.mly"
                    ( Ast.NONE )
 # 4873 "parser_cocci_menhir.ml"
          in
@@ -4898,20 +4898,20 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let r : (
-# 174 "parser_cocci_menhir.mly"
+# 200 "parser_cocci_menhir.mly"
        (Data.clt)
 # 4904 "parser_cocci_menhir.ml"
         ) = Obj.magic r in
         let i : 'tv_option_eexpr_ = Obj.magic i in
         let l : (
-# 174 "parser_cocci_menhir.mly"
+# 200 "parser_cocci_menhir.mly"
        (Data.clt)
 # 4910 "parser_cocci_menhir.ml"
         ) = Obj.magic l in
         let _startpos = _startpos_l_ in
         let _endpos = _endpos_r_ in
         let _v : 'tv_array_dec = 
-# 1341 "parser_cocci_menhir.mly"
+# 1367 "parser_cocci_menhir.mly"
                                            ( (l,i,r) )
 # 4917 "parser_cocci_menhir.ml"
          in
@@ -4935,7 +4935,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_assign_expr_eexpr_dot_expressions_ = 
-# 1512 "parser_cocci_menhir.mly"
+# 1549 "parser_cocci_menhir.mly"
                                            ( _1 )
 # 4941 "parser_cocci_menhir.ml"
          in
@@ -4967,7 +4967,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_assign_expr_bis = Obj.magic _3 in
         let _2 : (
-# 180 "parser_cocci_menhir.mly"
+# 206 "parser_cocci_menhir.mly"
        (Ast_cocci.assignOp * Data.clt)
 # 4973 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -4975,7 +4975,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_assign_expr_eexpr_dot_expressions_ = 
-# 1514 "parser_cocci_menhir.mly"
+# 1551 "parser_cocci_menhir.mly"
       ( let (op,clt) = _2 in
       Ast0.wrap(Ast0.Assignment(_1,P.clt2mcode op clt,
                                Ast0.set_arg_exp _3,false)) )
@@ -5009,7 +5009,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_assign_expr_bis = Obj.magic _3 in
         let _2 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
 # 5015 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -5017,7 +5017,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_assign_expr_eexpr_dot_expressions_ = 
-# 1518 "parser_cocci_menhir.mly"
+# 1555 "parser_cocci_menhir.mly"
       ( Ast0.wrap
          (Ast0.Assignment
             (_1,P.clt2mcode Ast.SimpleAssign _2,Ast0.set_arg_exp _3,false)) )
@@ -5043,7 +5043,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_assign_expr_eexpr_nest_expressions_ = 
-# 1512 "parser_cocci_menhir.mly"
+# 1549 "parser_cocci_menhir.mly"
                                            ( _1 )
 # 5049 "parser_cocci_menhir.ml"
          in
@@ -5075,7 +5075,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_assign_expr_bis = Obj.magic _3 in
         let _2 : (
-# 180 "parser_cocci_menhir.mly"
+# 206 "parser_cocci_menhir.mly"
        (Ast_cocci.assignOp * Data.clt)
 # 5081 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -5083,7 +5083,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_assign_expr_eexpr_nest_expressions_ = 
-# 1514 "parser_cocci_menhir.mly"
+# 1551 "parser_cocci_menhir.mly"
       ( let (op,clt) = _2 in
       Ast0.wrap(Ast0.Assignment(_1,P.clt2mcode op clt,
                                Ast0.set_arg_exp _3,false)) )
@@ -5117,7 +5117,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_assign_expr_bis = Obj.magic _3 in
         let _2 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
 # 5123 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -5125,7 +5125,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_assign_expr_eexpr_nest_expressions_ = 
-# 1518 "parser_cocci_menhir.mly"
+# 1555 "parser_cocci_menhir.mly"
       ( Ast0.wrap
          (Ast0.Assignment
             (_1,P.clt2mcode Ast.SimpleAssign _2,Ast0.set_arg_exp _3,false)) )
@@ -5151,7 +5151,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_assign_expr_expr_invalid_ = 
-# 1512 "parser_cocci_menhir.mly"
+# 1549 "parser_cocci_menhir.mly"
                                            ( _1 )
 # 5157 "parser_cocci_menhir.ml"
          in
@@ -5183,7 +5183,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_assign_expr_bis = Obj.magic _3 in
         let _2 : (
-# 180 "parser_cocci_menhir.mly"
+# 206 "parser_cocci_menhir.mly"
        (Ast_cocci.assignOp * Data.clt)
 # 5189 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -5191,7 +5191,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_assign_expr_expr_invalid_ = 
-# 1514 "parser_cocci_menhir.mly"
+# 1551 "parser_cocci_menhir.mly"
       ( let (op,clt) = _2 in
       Ast0.wrap(Ast0.Assignment(_1,P.clt2mcode op clt,
                                Ast0.set_arg_exp _3,false)) )
@@ -5225,7 +5225,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_assign_expr_bis = Obj.magic _3 in
         let _2 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
 # 5231 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -5233,7 +5233,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_assign_expr_expr_invalid_ = 
-# 1518 "parser_cocci_menhir.mly"
+# 1555 "parser_cocci_menhir.mly"
       ( Ast0.wrap
          (Ast0.Assignment
             (_1,P.clt2mcode Ast.SimpleAssign _2,Ast0.set_arg_exp _3,false)) )
@@ -5259,7 +5259,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_assign_expr_bis = 
-# 1523 "parser_cocci_menhir.mly"
+# 1560 "parser_cocci_menhir.mly"
                                                             ( _1 )
 # 5265 "parser_cocci_menhir.ml"
          in
@@ -5291,7 +5291,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_assign_expr_bis = Obj.magic _3 in
         let _2 : (
-# 180 "parser_cocci_menhir.mly"
+# 206 "parser_cocci_menhir.mly"
        (Ast_cocci.assignOp * Data.clt)
 # 5297 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -5299,7 +5299,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_assign_expr_bis = 
-# 1525 "parser_cocci_menhir.mly"
+# 1562 "parser_cocci_menhir.mly"
       ( let (op,clt) = _2 in
       Ast0.wrap(Ast0.Assignment(_1,P.clt2mcode op clt,
                                Ast0.set_arg_exp _3,false)) )
@@ -5333,7 +5333,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_assign_expr_bis = Obj.magic _3 in
         let _2 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
 # 5339 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -5341,7 +5341,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_assign_expr_bis = 
-# 1529 "parser_cocci_menhir.mly"
+# 1566 "parser_cocci_menhir.mly"
       ( Ast0.wrap
          (Ast0.Assignment
             (_1,P.clt2mcode Ast.SimpleAssign _2,Ast0.set_arg_exp _3,false)) )
@@ -5367,7 +5367,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_basic_expr_eexpr_dot_expressions_ = 
-# 1509 "parser_cocci_menhir.mly"
+# 1546 "parser_cocci_menhir.mly"
                                                            ( _1 )
 # 5373 "parser_cocci_menhir.ml"
          in
@@ -5391,7 +5391,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_basic_expr_eexpr_nest_expressions_ = 
-# 1509 "parser_cocci_menhir.mly"
+# 1546 "parser_cocci_menhir.mly"
                                                            ( _1 )
 # 5397 "parser_cocci_menhir.ml"
          in
@@ -5415,7 +5415,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_basic_expr_expr_invalid_ = 
-# 1509 "parser_cocci_menhir.mly"
+# 1546 "parser_cocci_menhir.mly"
                                                            ( _1 )
 # 5421 "parser_cocci_menhir.ml"
          in
@@ -5447,19 +5447,19 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_fun_start = Obj.magic _3 in
         let _2 : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
 # 5453 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : (
-# 125 "parser_cocci_menhir.mly"
+# 151 "parser_cocci_menhir.mly"
        (Data.clt)
 # 5458 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_case_line = 
-# 1198 "parser_cocci_menhir.mly"
+# 1224 "parser_cocci_menhir.mly"
       ( Ast0.wrap
          (Ast0.Default(P.clt2mcode "default" _1,P.clt2mcode ":" _2,_3)) )
 # 5466 "parser_cocci_menhir.ml"
@@ -5497,20 +5497,20 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _4 : 'tv_fun_start = Obj.magic _4 in
         let _3 : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
 # 5503 "parser_cocci_menhir.ml"
         ) = Obj.magic _3 in
         let _2 : 'tv_eexpr = Obj.magic _2 in
         let _1 : (
-# 125 "parser_cocci_menhir.mly"
+# 151 "parser_cocci_menhir.mly"
        (Data.clt)
 # 5509 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__4_ in
         let _v : 'tv_case_line = 
-# 1201 "parser_cocci_menhir.mly"
+# 1227 "parser_cocci_menhir.mly"
       ( Ast0.wrap(Ast0.Case(P.clt2mcode "case" _1,_2,P.clt2mcode ":" _3,_4)) )
 # 5516 "parser_cocci_menhir.ml"
          in
@@ -5534,7 +5534,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_cast_expr_eexpr_dot_expressions_ = 
-# 1605 "parser_cocci_menhir.mly"
+# 1642 "parser_cocci_menhir.mly"
                                           ( _1 )
 # 5540 "parser_cocci_menhir.ml"
          in
@@ -5571,20 +5571,20 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let e : 'tv_cast_expr_eexpr_dot_expressions_ = Obj.magic e in
         let rp : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
 # 5577 "parser_cocci_menhir.ml"
         ) = Obj.magic rp in
         let t : 'tv_ctype = Obj.magic t in
         let lp : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
 # 5583 "parser_cocci_menhir.ml"
         ) = Obj.magic lp in
         let _startpos = _startpos_lp_ in
         let _endpos = _endpos_e_ in
         let _v : 'tv_cast_expr_eexpr_dot_expressions_ = 
-# 1607 "parser_cocci_menhir.mly"
+# 1644 "parser_cocci_menhir.mly"
       ( Ast0.wrap(Ast0.Cast (P.clt2mcode "(" lp, t,
                             P.clt2mcode ")" rp, e)) )
 # 5591 "parser_cocci_menhir.ml"
@@ -5609,7 +5609,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_cast_expr_eexpr_invalid_ = 
-# 1605 "parser_cocci_menhir.mly"
+# 1642 "parser_cocci_menhir.mly"
                                           ( _1 )
 # 5615 "parser_cocci_menhir.ml"
          in
@@ -5646,20 +5646,20 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let e : 'tv_cast_expr_eexpr_invalid_ = Obj.magic e in
         let rp : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
 # 5652 "parser_cocci_menhir.ml"
         ) = Obj.magic rp in
         let t : 'tv_ctype = Obj.magic t in
         let lp : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
 # 5658 "parser_cocci_menhir.ml"
         ) = Obj.magic lp in
         let _startpos = _startpos_lp_ in
         let _endpos = _endpos_e_ in
         let _v : 'tv_cast_expr_eexpr_invalid_ = 
-# 1607 "parser_cocci_menhir.mly"
+# 1644 "parser_cocci_menhir.mly"
       ( Ast0.wrap(Ast0.Cast (P.clt2mcode "(" lp, t,
                             P.clt2mcode ")" rp, e)) )
 # 5666 "parser_cocci_menhir.ml"
@@ -5684,7 +5684,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_cast_expr_eexpr_nest_expressions_ = 
-# 1605 "parser_cocci_menhir.mly"
+# 1642 "parser_cocci_menhir.mly"
                                           ( _1 )
 # 5690 "parser_cocci_menhir.ml"
          in
@@ -5721,20 +5721,20 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let e : 'tv_cast_expr_eexpr_nest_expressions_ = Obj.magic e in
         let rp : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
 # 5727 "parser_cocci_menhir.ml"
         ) = Obj.magic rp in
         let t : 'tv_ctype = Obj.magic t in
         let lp : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
 # 5733 "parser_cocci_menhir.ml"
         ) = Obj.magic lp in
         let _startpos = _startpos_lp_ in
         let _endpos = _endpos_e_ in
         let _v : 'tv_cast_expr_eexpr_nest_expressions_ = 
-# 1607 "parser_cocci_menhir.mly"
+# 1644 "parser_cocci_menhir.mly"
       ( Ast0.wrap(Ast0.Cast (P.clt2mcode "(" lp, t,
                             P.clt2mcode ")" rp, e)) )
 # 5741 "parser_cocci_menhir.ml"
@@ -5759,7 +5759,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_cast_expr_expr_invalid_ = 
-# 1605 "parser_cocci_menhir.mly"
+# 1642 "parser_cocci_menhir.mly"
                                           ( _1 )
 # 5765 "parser_cocci_menhir.ml"
          in
@@ -5796,20 +5796,20 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let e : 'tv_cast_expr_expr_invalid_ = Obj.magic e in
         let rp : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
 # 5802 "parser_cocci_menhir.ml"
         ) = Obj.magic rp in
         let t : 'tv_ctype = Obj.magic t in
         let lp : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
 # 5808 "parser_cocci_menhir.ml"
         ) = Obj.magic lp in
         let _startpos = _startpos_lp_ in
         let _endpos = _endpos_e_ in
         let _v : 'tv_cast_expr_expr_invalid_ = 
-# 1607 "parser_cocci_menhir.mly"
+# 1644 "parser_cocci_menhir.mly"
       ( Ast0.wrap(Ast0.Cast (P.clt2mcode "(" lp, t,
                             P.clt2mcode ")" rp, e)) )
 # 5816 "parser_cocci_menhir.ml"
@@ -5838,7 +5838,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_choose_iso = 
-# 310 "parser_cocci_menhir.mly"
+# 336 "parser_cocci_menhir.mly"
                                                  ( List.map P.id2name _2 )
 # 5844 "parser_cocci_menhir.ml"
          in
@@ -5862,7 +5862,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_comma_list_any_strict_ = 
-# 2345 "parser_cocci_menhir.mly"
+# 2382 "parser_cocci_menhir.mly"
                                        ( _1 )
 # 5868 "parser_cocci_menhir.ml"
          in
@@ -5886,7 +5886,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_comma_list_ctype_ = 
-# 2345 "parser_cocci_menhir.mly"
+# 2382 "parser_cocci_menhir.mly"
                                        ( _1 )
 # 5892 "parser_cocci_menhir.ml"
          in
@@ -5910,7 +5910,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_comma_list_d_ident_ = 
-# 2345 "parser_cocci_menhir.mly"
+# 2382 "parser_cocci_menhir.mly"
                                        ( _1 )
 # 5916 "parser_cocci_menhir.ml"
          in
@@ -5934,7 +5934,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_comma_list_ident_or_const_ = 
-# 2345 "parser_cocci_menhir.mly"
+# 2382 "parser_cocci_menhir.mly"
                                        ( _1 )
 # 5940 "parser_cocci_menhir.ml"
          in
@@ -5958,7 +5958,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_comma_list_meta_ident_ = 
-# 2345 "parser_cocci_menhir.mly"
+# 2382 "parser_cocci_menhir.mly"
                                        ( _1 )
 # 5964 "parser_cocci_menhir.ml"
          in
@@ -5982,7 +5982,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_comma_list_pure_ident_ = 
-# 2345 "parser_cocci_menhir.mly"
+# 2382 "parser_cocci_menhir.mly"
                                        ( _1 )
 # 5988 "parser_cocci_menhir.ml"
          in
@@ -6006,7 +6006,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_comma_list_pure_ident_or_meta_ident_ = 
-# 2345 "parser_cocci_menhir.mly"
+# 2382 "parser_cocci_menhir.mly"
                                        ( _1 )
 # 6012 "parser_cocci_menhir.ml"
          in
@@ -6030,7 +6030,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_comma_list_pure_ident_or_meta_ident_with_econstraint_not_ceq_or_sub__ = 
-# 2345 "parser_cocci_menhir.mly"
+# 2382 "parser_cocci_menhir.mly"
                                        ( _1 )
 # 6036 "parser_cocci_menhir.ml"
          in
@@ -6054,7 +6054,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_comma_list_pure_ident_or_meta_ident_with_econstraint_re_or_not_eqe_or_sub__ = 
-# 2345 "parser_cocci_menhir.mly"
+# 2382 "parser_cocci_menhir.mly"
                                        ( _1 )
 # 6060 "parser_cocci_menhir.ml"
          in
@@ -6078,7 +6078,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_comma_list_pure_ident_or_meta_ident_with_idconstraint_re_or_not_eqid__ = 
-# 2345 "parser_cocci_menhir.mly"
+# 2382 "parser_cocci_menhir.mly"
                                        ( _1 )
 # 6084 "parser_cocci_menhir.ml"
          in
@@ -6102,7 +6102,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_comma_list_pure_ident_or_meta_ident_with_idconstraint_virt_re_or_not_eqid__ = 
-# 2345 "parser_cocci_menhir.mly"
+# 2382 "parser_cocci_menhir.mly"
                                        ( _1 )
 # 6108 "parser_cocci_menhir.ml"
          in
@@ -6126,7 +6126,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_comma_list_pure_ident_or_meta_ident_with_seed_ = 
-# 2345 "parser_cocci_menhir.mly"
+# 2382 "parser_cocci_menhir.mly"
                                        ( _1 )
 # 6132 "parser_cocci_menhir.ml"
          in
@@ -6150,7 +6150,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_comma_list_pure_ident_or_meta_ident_with_x_eq_not_pos__ = 
-# 2345 "parser_cocci_menhir.mly"
+# 2382 "parser_cocci_menhir.mly"
                                        ( _1 )
 # 6156 "parser_cocci_menhir.ml"
          in
@@ -6174,7 +6174,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_comma_list_typedef_ident_ = 
-# 2345 "parser_cocci_menhir.mly"
+# 2382 "parser_cocci_menhir.mly"
                                        ( _1 )
 # 6180 "parser_cocci_menhir.ml"
          in
@@ -6198,7 +6198,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_cond_expr_eexpr_dot_expressions_ = 
-# 1534 "parser_cocci_menhir.mly"
+# 1571 "parser_cocci_menhir.mly"
                                              ( _1 )
 # 6204 "parser_cocci_menhir.ml"
          in
@@ -6240,13 +6240,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let r : 'tv_eargexpr = Obj.magic r in
         let dd : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
 # 6246 "parser_cocci_menhir.ml"
         ) = Obj.magic dd in
         let t : 'tv_option_eexpr_ = Obj.magic t in
         let w : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
 # 6252 "parser_cocci_menhir.ml"
         ) = Obj.magic w in
@@ -6254,7 +6254,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_l_ in
         let _endpos = _endpos_r_ in
         let _v : 'tv_cond_expr_eexpr_dot_expressions_ = 
-# 1537 "parser_cocci_menhir.mly"
+# 1574 "parser_cocci_menhir.mly"
       ( Ast0.wrap(Ast0.CondExpr (l, P.clt2mcode "?" w, t,
                                 P.clt2mcode ":" dd, r)) )
 # 6261 "parser_cocci_menhir.ml"
@@ -6279,7 +6279,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_cond_expr_eexpr_nest_expressions_ = 
-# 1534 "parser_cocci_menhir.mly"
+# 1571 "parser_cocci_menhir.mly"
                                              ( _1 )
 # 6285 "parser_cocci_menhir.ml"
          in
@@ -6321,13 +6321,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let r : 'tv_eargexpr = Obj.magic r in
         let dd : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
 # 6327 "parser_cocci_menhir.ml"
         ) = Obj.magic dd in
         let t : 'tv_option_eexpr_ = Obj.magic t in
         let w : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
 # 6333 "parser_cocci_menhir.ml"
         ) = Obj.magic w in
@@ -6335,7 +6335,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_l_ in
         let _endpos = _endpos_r_ in
         let _v : 'tv_cond_expr_eexpr_nest_expressions_ = 
-# 1537 "parser_cocci_menhir.mly"
+# 1574 "parser_cocci_menhir.mly"
       ( Ast0.wrap(Ast0.CondExpr (l, P.clt2mcode "?" w, t,
                                 P.clt2mcode ":" dd, r)) )
 # 6342 "parser_cocci_menhir.ml"
@@ -6360,7 +6360,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_cond_expr_expr_invalid_ = 
-# 1534 "parser_cocci_menhir.mly"
+# 1571 "parser_cocci_menhir.mly"
                                              ( _1 )
 # 6366 "parser_cocci_menhir.ml"
          in
@@ -6402,13 +6402,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let r : 'tv_eargexpr = Obj.magic r in
         let dd : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
 # 6408 "parser_cocci_menhir.ml"
         ) = Obj.magic dd in
         let t : 'tv_option_eexpr_ = Obj.magic t in
         let w : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
 # 6414 "parser_cocci_menhir.ml"
         ) = Obj.magic w in
@@ -6416,7 +6416,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_l_ in
         let _endpos = _endpos_r_ in
         let _v : 'tv_cond_expr_expr_invalid_ = 
-# 1537 "parser_cocci_menhir.mly"
+# 1574 "parser_cocci_menhir.mly"
       ( Ast0.wrap(Ast0.CondExpr (l, P.clt2mcode "?" w, t,
                                 P.clt2mcode ":" dd, r)) )
 # 6423 "parser_cocci_menhir.ml"
@@ -6438,14 +6438,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 122 "parser_cocci_menhir.mly"
+# 148 "parser_cocci_menhir.mly"
       (Data.clt)
 # 6444 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_const_vol = 
-# 1097 "parser_cocci_menhir.mly"
+# 1123 "parser_cocci_menhir.mly"
                    ( P.clt2mcode Ast.Const _1 )
 # 6451 "parser_cocci_menhir.ml"
          in
@@ -6466,14 +6466,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 122 "parser_cocci_menhir.mly"
+# 148 "parser_cocci_menhir.mly"
       (Data.clt)
 # 6472 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_const_vol = 
-# 1098 "parser_cocci_menhir.mly"
+# 1124 "parser_cocci_menhir.mly"
                    ( P.clt2mcode Ast.Volatile _1 )
 # 6479 "parser_cocci_menhir.ml"
          in
@@ -6497,7 +6497,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_continue_list_aexpr_TEllipsis_ = 
-# 2121 "parser_cocci_menhir.mly"
+# 2158 "parser_cocci_menhir.mly"
        ( fun build_dots build_comma -> [_1] )
 # 6503 "parser_cocci_menhir.ml"
          in
@@ -6523,7 +6523,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _2 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
 # 6529 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -6531,7 +6531,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_continue_list_aexpr_TEllipsis_ = 
-# 2123 "parser_cocci_menhir.mly"
+# 2160 "parser_cocci_menhir.mly"
     ( fun build_dots build_comma ->
       _1::[Ast0.wrap(build_comma(P.clt2mcode "," _2))] )
 # 6538 "parser_cocci_menhir.ml"
@@ -6564,7 +6564,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_nonempty_list_start_aexpr_TEllipsis_ = Obj.magic _3 in
         let _2 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
 # 6570 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -6572,7 +6572,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_continue_list_aexpr_TEllipsis_ = 
-# 2126 "parser_cocci_menhir.mly"
+# 2163 "parser_cocci_menhir.mly"
     ( fun build_dots build_comma ->
       _1::(Ast0.wrap(build_comma(P.clt2mcode "," _2)))::
       (_3 build_dots build_comma) )
@@ -6602,7 +6602,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_continue_list_aexpr_TEllipsis_ = 
-# 2129 "parser_cocci_menhir.mly"
+# 2166 "parser_cocci_menhir.mly"
                                             ( _2 )
 # 6608 "parser_cocci_menhir.ml"
          in
@@ -6626,7 +6626,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_continue_list_dparam_TEllipsis_ = 
-# 2121 "parser_cocci_menhir.mly"
+# 2158 "parser_cocci_menhir.mly"
        ( fun build_dots build_comma -> [_1] )
 # 6632 "parser_cocci_menhir.ml"
          in
@@ -6652,7 +6652,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _2 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
 # 6658 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -6660,7 +6660,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_continue_list_dparam_TEllipsis_ = 
-# 2123 "parser_cocci_menhir.mly"
+# 2160 "parser_cocci_menhir.mly"
     ( fun build_dots build_comma ->
       _1::[Ast0.wrap(build_comma(P.clt2mcode "," _2))] )
 # 6667 "parser_cocci_menhir.ml"
@@ -6693,7 +6693,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_nonempty_list_start_dparam_TEllipsis_ = Obj.magic _3 in
         let _2 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
 # 6699 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -6701,7 +6701,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_continue_list_dparam_TEllipsis_ = 
-# 2126 "parser_cocci_menhir.mly"
+# 2163 "parser_cocci_menhir.mly"
     ( fun build_dots build_comma ->
       _1::(Ast0.wrap(build_comma(P.clt2mcode "," _2)))::
       (_3 build_dots build_comma) )
@@ -6731,7 +6731,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_continue_list_dparam_TEllipsis_ = 
-# 2129 "parser_cocci_menhir.mly"
+# 2166 "parser_cocci_menhir.mly"
                                             ( _2 )
 # 6737 "parser_cocci_menhir.ml"
          in
@@ -6755,7 +6755,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_continue_list_enum_decl_one_edots_when_TEllipsis_enum_decl_one__ = 
-# 2121 "parser_cocci_menhir.mly"
+# 2158 "parser_cocci_menhir.mly"
        ( fun build_dots build_comma -> [_1] )
 # 6761 "parser_cocci_menhir.ml"
          in
@@ -6781,7 +6781,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _2 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
 # 6787 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -6789,7 +6789,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_continue_list_enum_decl_one_edots_when_TEllipsis_enum_decl_one__ = 
-# 2123 "parser_cocci_menhir.mly"
+# 2160 "parser_cocci_menhir.mly"
     ( fun build_dots build_comma ->
       _1::[Ast0.wrap(build_comma(P.clt2mcode "," _2))] )
 # 6796 "parser_cocci_menhir.ml"
@@ -6822,7 +6822,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_nonempty_list_start_enum_decl_one_edots_when_TEllipsis_enum_decl_one__ = Obj.magic _3 in
         let _2 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
 # 6828 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -6830,7 +6830,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_continue_list_enum_decl_one_edots_when_TEllipsis_enum_decl_one__ = 
-# 2126 "parser_cocci_menhir.mly"
+# 2163 "parser_cocci_menhir.mly"
     ( fun build_dots build_comma ->
       _1::(Ast0.wrap(build_comma(P.clt2mcode "," _2)))::
       (_3 build_dots build_comma) )
@@ -6860,7 +6860,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_continue_list_enum_decl_one_edots_when_TEllipsis_enum_decl_one__ = 
-# 2129 "parser_cocci_menhir.mly"
+# 2166 "parser_cocci_menhir.mly"
                                             ( _2 )
 # 6866 "parser_cocci_menhir.ml"
          in
@@ -6884,7 +6884,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_continue_list_initialize2_edots_when_TEllipsis_initialize__ = 
-# 2121 "parser_cocci_menhir.mly"
+# 2158 "parser_cocci_menhir.mly"
        ( fun build_dots build_comma -> [_1] )
 # 6890 "parser_cocci_menhir.ml"
          in
@@ -6910,7 +6910,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _2 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
 # 6916 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -6918,7 +6918,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_continue_list_initialize2_edots_when_TEllipsis_initialize__ = 
-# 2123 "parser_cocci_menhir.mly"
+# 2160 "parser_cocci_menhir.mly"
     ( fun build_dots build_comma ->
       _1::[Ast0.wrap(build_comma(P.clt2mcode "," _2))] )
 # 6925 "parser_cocci_menhir.ml"
@@ -6951,7 +6951,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_nonempty_list_start_initialize2_edots_when_TEllipsis_initialize__ = Obj.magic _3 in
         let _2 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
 # 6957 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -6959,7 +6959,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_continue_list_initialize2_edots_when_TEllipsis_initialize__ = 
-# 2126 "parser_cocci_menhir.mly"
+# 2163 "parser_cocci_menhir.mly"
     ( fun build_dots build_comma ->
       _1::(Ast0.wrap(build_comma(P.clt2mcode "," _2)))::
       (_3 build_dots build_comma) )
@@ -6989,7 +6989,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_continue_list_initialize2_edots_when_TEllipsis_initialize__ = 
-# 2129 "parser_cocci_menhir.mly"
+# 2166 "parser_cocci_menhir.mly"
                                             ( _2 )
 # 6995 "parser_cocci_menhir.ml"
          in
@@ -7013,7 +7013,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_continue_list_one_dec_decl__TEllipsis_ = 
-# 2121 "parser_cocci_menhir.mly"
+# 2158 "parser_cocci_menhir.mly"
        ( fun build_dots build_comma -> [_1] )
 # 7019 "parser_cocci_menhir.ml"
          in
@@ -7039,7 +7039,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _2 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
 # 7045 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -7047,7 +7047,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_continue_list_one_dec_decl__TEllipsis_ = 
-# 2123 "parser_cocci_menhir.mly"
+# 2160 "parser_cocci_menhir.mly"
     ( fun build_dots build_comma ->
       _1::[Ast0.wrap(build_comma(P.clt2mcode "," _2))] )
 # 7054 "parser_cocci_menhir.ml"
@@ -7080,7 +7080,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_nonempty_list_start_one_dec_decl__TEllipsis_ = Obj.magic _3 in
         let _2 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
 # 7086 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -7088,7 +7088,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_continue_list_one_dec_decl__TEllipsis_ = 
-# 2126 "parser_cocci_menhir.mly"
+# 2163 "parser_cocci_menhir.mly"
     ( fun build_dots build_comma ->
       _1::(Ast0.wrap(build_comma(P.clt2mcode "," _2)))::
       (_3 build_dots build_comma) )
@@ -7118,7 +7118,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_continue_list_one_dec_decl__TEllipsis_ = 
-# 2129 "parser_cocci_menhir.mly"
+# 2166 "parser_cocci_menhir.mly"
                                             ( _2 )
 # 7124 "parser_cocci_menhir.ml"
          in
@@ -7142,7 +7142,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_continue_list_one_dec_name_opt_decl__TEllipsis_ = 
-# 2121 "parser_cocci_menhir.mly"
+# 2158 "parser_cocci_menhir.mly"
        ( fun build_dots build_comma -> [_1] )
 # 7148 "parser_cocci_menhir.ml"
          in
@@ -7168,7 +7168,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _2 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
 # 7174 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -7176,7 +7176,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_continue_list_one_dec_name_opt_decl__TEllipsis_ = 
-# 2123 "parser_cocci_menhir.mly"
+# 2160 "parser_cocci_menhir.mly"
     ( fun build_dots build_comma ->
       _1::[Ast0.wrap(build_comma(P.clt2mcode "," _2))] )
 # 7183 "parser_cocci_menhir.ml"
@@ -7209,7 +7209,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_nonempty_list_start_one_dec_name_opt_decl__TEllipsis_ = Obj.magic _3 in
         let _2 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
 # 7215 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -7217,7 +7217,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_continue_list_one_dec_name_opt_decl__TEllipsis_ = 
-# 2126 "parser_cocci_menhir.mly"
+# 2163 "parser_cocci_menhir.mly"
     ( fun build_dots build_comma ->
       _1::(Ast0.wrap(build_comma(P.clt2mcode "," _2)))::
       (_3 build_dots build_comma) )
@@ -7247,7 +7247,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_continue_list_one_dec_name_opt_decl__TEllipsis_ = 
-# 2129 "parser_cocci_menhir.mly"
+# 2166 "parser_cocci_menhir.mly"
                                             ( _2 )
 # 7253 "parser_cocci_menhir.ml"
          in
@@ -7264,7 +7264,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in
         let _endpos = _startpos in
         let _v : 'tv_continue_struct_decl_list = 
-# 797 "parser_cocci_menhir.mly"
+# 823 "parser_cocci_menhir.mly"
                                      ( [] )
 # 7270 "parser_cocci_menhir.ml"
          in
@@ -7294,7 +7294,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_continue_struct_decl_list = 
-# 798 "parser_cocci_menhir.mly"
+# 824 "parser_cocci_menhir.mly"
                                      ( _1@_2 )
 # 7300 "parser_cocci_menhir.ml"
          in
@@ -7318,7 +7318,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_continue_struct_decl_list = 
-# 799 "parser_cocci_menhir.mly"
+# 825 "parser_cocci_menhir.mly"
                                      ( _1 )
 # 7324 "parser_cocci_menhir.ml"
          in
@@ -7350,12 +7350,12 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty00 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 7356 "parser_cocci_menhir.ml"
         ) = Obj.magic ty00 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
 # 7361 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
@@ -7367,13 +7367,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty = ty0 in
             
-# 638 "parser_cocci_menhir.mly"
+# 664 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.CharType,[P.clt2mcode "char" ty])) )
 # 7373 "parser_cocci_menhir.ml"
             
           in
           
-# 720 "parser_cocci_menhir.mly"
+# 746 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Signed r,Some ty)) )
 # 7379 "parser_cocci_menhir.ml"
           
@@ -7386,7 +7386,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 7392 "parser_cocci_menhir.ml"
          in
@@ -7418,12 +7418,12 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty00 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 7424 "parser_cocci_menhir.ml"
         ) = Obj.magic ty00 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
 # 7429 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
@@ -7435,13 +7435,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty = ty0 in
             
-# 640 "parser_cocci_menhir.mly"
+# 666 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.ShortType,[P.clt2mcode "short" ty])) )
 # 7441 "parser_cocci_menhir.ml"
             
           in
           
-# 720 "parser_cocci_menhir.mly"
+# 746 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Signed r,Some ty)) )
 # 7447 "parser_cocci_menhir.ml"
           
@@ -7454,7 +7454,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 7460 "parser_cocci_menhir.ml"
          in
@@ -7491,17 +7491,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty200 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 7497 "parser_cocci_menhir.ml"
         ) = Obj.magic ty200 in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 7502 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
 # 7507 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
@@ -7515,7 +7515,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let ty2 = ty20 in
             let ty1 = ty10 in
             
-# 642 "parser_cocci_menhir.mly"
+# 668 "parser_cocci_menhir.mly"
     ( Ast0.wrap
        (Ast0.BaseType
           (Ast.ShortIntType,[P.clt2mcode "short" ty1;P.clt2mcode "int" ty2])) )
@@ -7523,7 +7523,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             
           in
           
-# 720 "parser_cocci_menhir.mly"
+# 746 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Signed r,Some ty)) )
 # 7529 "parser_cocci_menhir.ml"
           
@@ -7536,7 +7536,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 7542 "parser_cocci_menhir.ml"
          in
@@ -7568,12 +7568,12 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty00 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 7574 "parser_cocci_menhir.ml"
         ) = Obj.magic ty00 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
 # 7579 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
@@ -7585,13 +7585,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty = ty0 in
             
-# 646 "parser_cocci_menhir.mly"
+# 672 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.IntType,[P.clt2mcode "int" ty])) )
 # 7591 "parser_cocci_menhir.ml"
             
           in
           
-# 720 "parser_cocci_menhir.mly"
+# 746 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Signed r,Some ty)) )
 # 7597 "parser_cocci_menhir.ml"
           
@@ -7604,7 +7604,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 7610 "parser_cocci_menhir.ml"
          in
@@ -7636,12 +7636,12 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let p00 : (
-# 134 "parser_cocci_menhir.mly"
+# 160 "parser_cocci_menhir.mly"
        (Parse_aux.info)
 # 7642 "parser_cocci_menhir.ml"
         ) = Obj.magic p00 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
 # 7647 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
@@ -7653,14 +7653,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let p = p0 in
             
-# 648 "parser_cocci_menhir.mly"
+# 674 "parser_cocci_menhir.mly"
     ( let (nm,pure,clt) = p in
       Ast0.wrap(Ast0.MetaType(P.clt2mcode nm clt,pure)) )
 # 7660 "parser_cocci_menhir.ml"
             
           in
           
-# 720 "parser_cocci_menhir.mly"
+# 746 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Signed r,Some ty)) )
 # 7666 "parser_cocci_menhir.ml"
           
@@ -7673,7 +7673,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 7679 "parser_cocci_menhir.ml"
          in
@@ -7714,17 +7714,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let p00 : (
-# 127 "parser_cocci_menhir.mly"
+# 153 "parser_cocci_menhir.mly"
        (string * Data.clt)
 # 7720 "parser_cocci_menhir.ml"
         ) = Obj.magic p00 in
         let r00 : (
-# 114 "parser_cocci_menhir.mly"
+# 140 "parser_cocci_menhir.mly"
       (string)
 # 7725 "parser_cocci_menhir.ml"
         ) = Obj.magic r00 in
         let r1 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
 # 7730 "parser_cocci_menhir.ml"
         ) = Obj.magic r1 in
@@ -7738,7 +7738,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let p = p0 in
             let r = r0 in
             
-# 651 "parser_cocci_menhir.mly"
+# 677 "parser_cocci_menhir.mly"
     ( let nm = (r,P.id2name p) in
     (* this is only possible when we are in a metavar decl.  Otherwise,
        it will be represented already as a MetaType *)
@@ -7749,7 +7749,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             
           in
           
-# 720 "parser_cocci_menhir.mly"
+# 746 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Signed r,Some ty)) )
 # 7755 "parser_cocci_menhir.ml"
           
@@ -7762,7 +7762,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 7768 "parser_cocci_menhir.ml"
          in
@@ -7794,12 +7794,12 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 7800 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
 # 7805 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
@@ -7811,13 +7811,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty1 = ty10 in
             
-# 658 "parser_cocci_menhir.mly"
+# 684 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.LongType,[P.clt2mcode "long" ty1])) )
 # 7817 "parser_cocci_menhir.ml"
             
           in
           
-# 720 "parser_cocci_menhir.mly"
+# 746 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Signed r,Some ty)) )
 # 7823 "parser_cocci_menhir.ml"
           
@@ -7830,7 +7830,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 7836 "parser_cocci_menhir.ml"
          in
@@ -7867,17 +7867,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty200 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 7873 "parser_cocci_menhir.ml"
         ) = Obj.magic ty200 in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 7878 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
 # 7883 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
@@ -7891,7 +7891,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let ty2 = ty20 in
             let ty1 = ty10 in
             
-# 660 "parser_cocci_menhir.mly"
+# 686 "parser_cocci_menhir.mly"
     ( Ast0.wrap
        (Ast0.BaseType
           (Ast.LongIntType,[P.clt2mcode "long" ty1;P.clt2mcode "int" ty2])) )
@@ -7899,7 +7899,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             
           in
           
-# 720 "parser_cocci_menhir.mly"
+# 746 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Signed r,Some ty)) )
 # 7905 "parser_cocci_menhir.ml"
           
@@ -7912,7 +7912,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 7918 "parser_cocci_menhir.ml"
          in
@@ -7949,17 +7949,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty200 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 7955 "parser_cocci_menhir.ml"
         ) = Obj.magic ty200 in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 7960 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
 # 7965 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
@@ -7973,7 +7973,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let ty2 = ty20 in
             let ty1 = ty10 in
             
-# 664 "parser_cocci_menhir.mly"
+# 690 "parser_cocci_menhir.mly"
     ( Ast0.wrap
        (Ast0.BaseType
           (Ast.LongLongType,
@@ -7982,7 +7982,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             
           in
           
-# 720 "parser_cocci_menhir.mly"
+# 746 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Signed r,Some ty)) )
 # 7988 "parser_cocci_menhir.ml"
           
@@ -7995,7 +7995,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 8001 "parser_cocci_menhir.ml"
          in
@@ -8037,22 +8037,22 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty300 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 8043 "parser_cocci_menhir.ml"
         ) = Obj.magic ty300 in
         let ty200 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 8048 "parser_cocci_menhir.ml"
         ) = Obj.magic ty200 in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 8053 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
 # 8058 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
@@ -8068,7 +8068,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let ty2 = ty20 in
             let ty1 = ty10 in
             
-# 669 "parser_cocci_menhir.mly"
+# 695 "parser_cocci_menhir.mly"
     ( Ast0.wrap
        (Ast0.BaseType
           (Ast.LongLongIntType,
@@ -8078,7 +8078,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             
           in
           
-# 720 "parser_cocci_menhir.mly"
+# 746 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Signed r,Some ty)) )
 # 8084 "parser_cocci_menhir.ml"
           
@@ -8091,7 +8091,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 8097 "parser_cocci_menhir.ml"
          in
@@ -8123,12 +8123,12 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty00 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 8129 "parser_cocci_menhir.ml"
         ) = Obj.magic ty00 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
 # 8134 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
@@ -8140,13 +8140,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty = ty0 in
             
-# 638 "parser_cocci_menhir.mly"
+# 664 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.CharType,[P.clt2mcode "char" ty])) )
 # 8146 "parser_cocci_menhir.ml"
             
           in
           
-# 722 "parser_cocci_menhir.mly"
+# 748 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Unsigned r,Some ty)) )
 # 8152 "parser_cocci_menhir.ml"
           
@@ -8159,7 +8159,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 8165 "parser_cocci_menhir.ml"
          in
@@ -8191,12 +8191,12 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty00 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 8197 "parser_cocci_menhir.ml"
         ) = Obj.magic ty00 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
 # 8202 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
@@ -8208,13 +8208,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty = ty0 in
             
-# 640 "parser_cocci_menhir.mly"
+# 666 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.ShortType,[P.clt2mcode "short" ty])) )
 # 8214 "parser_cocci_menhir.ml"
             
           in
           
-# 722 "parser_cocci_menhir.mly"
+# 748 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Unsigned r,Some ty)) )
 # 8220 "parser_cocci_menhir.ml"
           
@@ -8227,7 +8227,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 8233 "parser_cocci_menhir.ml"
          in
@@ -8264,17 +8264,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty200 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 8270 "parser_cocci_menhir.ml"
         ) = Obj.magic ty200 in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 8275 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
 # 8280 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
@@ -8288,7 +8288,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let ty2 = ty20 in
             let ty1 = ty10 in
             
-# 642 "parser_cocci_menhir.mly"
+# 668 "parser_cocci_menhir.mly"
     ( Ast0.wrap
        (Ast0.BaseType
           (Ast.ShortIntType,[P.clt2mcode "short" ty1;P.clt2mcode "int" ty2])) )
@@ -8296,7 +8296,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             
           in
           
-# 722 "parser_cocci_menhir.mly"
+# 748 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Unsigned r,Some ty)) )
 # 8302 "parser_cocci_menhir.ml"
           
@@ -8309,7 +8309,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 8315 "parser_cocci_menhir.ml"
          in
@@ -8341,12 +8341,12 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty00 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 8347 "parser_cocci_menhir.ml"
         ) = Obj.magic ty00 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
 # 8352 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
@@ -8358,13 +8358,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty = ty0 in
             
-# 646 "parser_cocci_menhir.mly"
+# 672 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.IntType,[P.clt2mcode "int" ty])) )
 # 8364 "parser_cocci_menhir.ml"
             
           in
           
-# 722 "parser_cocci_menhir.mly"
+# 748 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Unsigned r,Some ty)) )
 # 8370 "parser_cocci_menhir.ml"
           
@@ -8377,7 +8377,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 8383 "parser_cocci_menhir.ml"
          in
@@ -8409,12 +8409,12 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let p00 : (
-# 134 "parser_cocci_menhir.mly"
+# 160 "parser_cocci_menhir.mly"
        (Parse_aux.info)
 # 8415 "parser_cocci_menhir.ml"
         ) = Obj.magic p00 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
 # 8420 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
@@ -8426,14 +8426,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let p = p0 in
             
-# 648 "parser_cocci_menhir.mly"
+# 674 "parser_cocci_menhir.mly"
     ( let (nm,pure,clt) = p in
       Ast0.wrap(Ast0.MetaType(P.clt2mcode nm clt,pure)) )
 # 8433 "parser_cocci_menhir.ml"
             
           in
           
-# 722 "parser_cocci_menhir.mly"
+# 748 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Unsigned r,Some ty)) )
 # 8439 "parser_cocci_menhir.ml"
           
@@ -8446,7 +8446,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 8452 "parser_cocci_menhir.ml"
          in
@@ -8487,17 +8487,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let p00 : (
-# 127 "parser_cocci_menhir.mly"
+# 153 "parser_cocci_menhir.mly"
        (string * Data.clt)
 # 8493 "parser_cocci_menhir.ml"
         ) = Obj.magic p00 in
         let r00 : (
-# 114 "parser_cocci_menhir.mly"
+# 140 "parser_cocci_menhir.mly"
       (string)
 # 8498 "parser_cocci_menhir.ml"
         ) = Obj.magic r00 in
         let r1 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
 # 8503 "parser_cocci_menhir.ml"
         ) = Obj.magic r1 in
@@ -8511,7 +8511,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let p = p0 in
             let r = r0 in
             
-# 651 "parser_cocci_menhir.mly"
+# 677 "parser_cocci_menhir.mly"
     ( let nm = (r,P.id2name p) in
     (* this is only possible when we are in a metavar decl.  Otherwise,
        it will be represented already as a MetaType *)
@@ -8522,7 +8522,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             
           in
           
-# 722 "parser_cocci_menhir.mly"
+# 748 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Unsigned r,Some ty)) )
 # 8528 "parser_cocci_menhir.ml"
           
@@ -8535,7 +8535,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 8541 "parser_cocci_menhir.ml"
          in
@@ -8567,12 +8567,12 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 8573 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
 # 8578 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
@@ -8584,13 +8584,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty1 = ty10 in
             
-# 658 "parser_cocci_menhir.mly"
+# 684 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.LongType,[P.clt2mcode "long" ty1])) )
 # 8590 "parser_cocci_menhir.ml"
             
           in
           
-# 722 "parser_cocci_menhir.mly"
+# 748 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Unsigned r,Some ty)) )
 # 8596 "parser_cocci_menhir.ml"
           
@@ -8603,7 +8603,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 8609 "parser_cocci_menhir.ml"
          in
@@ -8640,17 +8640,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty200 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 8646 "parser_cocci_menhir.ml"
         ) = Obj.magic ty200 in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 8651 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
 # 8656 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
@@ -8664,7 +8664,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let ty2 = ty20 in
             let ty1 = ty10 in
             
-# 660 "parser_cocci_menhir.mly"
+# 686 "parser_cocci_menhir.mly"
     ( Ast0.wrap
        (Ast0.BaseType
           (Ast.LongIntType,[P.clt2mcode "long" ty1;P.clt2mcode "int" ty2])) )
@@ -8672,7 +8672,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             
           in
           
-# 722 "parser_cocci_menhir.mly"
+# 748 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Unsigned r,Some ty)) )
 # 8678 "parser_cocci_menhir.ml"
           
@@ -8685,7 +8685,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 8691 "parser_cocci_menhir.ml"
          in
@@ -8722,17 +8722,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty200 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 8728 "parser_cocci_menhir.ml"
         ) = Obj.magic ty200 in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 8733 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
 # 8738 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
@@ -8746,7 +8746,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let ty2 = ty20 in
             let ty1 = ty10 in
             
-# 664 "parser_cocci_menhir.mly"
+# 690 "parser_cocci_menhir.mly"
     ( Ast0.wrap
        (Ast0.BaseType
           (Ast.LongLongType,
@@ -8755,7 +8755,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             
           in
           
-# 722 "parser_cocci_menhir.mly"
+# 748 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Unsigned r,Some ty)) )
 # 8761 "parser_cocci_menhir.ml"
           
@@ -8768,7 +8768,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 8774 "parser_cocci_menhir.ml"
          in
@@ -8810,22 +8810,22 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty300 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 8816 "parser_cocci_menhir.ml"
         ) = Obj.magic ty300 in
         let ty200 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 8821 "parser_cocci_menhir.ml"
         ) = Obj.magic ty200 in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 8826 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
 # 8831 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
@@ -8841,7 +8841,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let ty2 = ty20 in
             let ty1 = ty10 in
             
-# 669 "parser_cocci_menhir.mly"
+# 695 "parser_cocci_menhir.mly"
     ( Ast0.wrap
        (Ast0.BaseType
           (Ast.LongLongIntType,
@@ -8851,7 +8851,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             
           in
           
-# 722 "parser_cocci_menhir.mly"
+# 748 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Unsigned r,Some ty)) )
 # 8857 "parser_cocci_menhir.ml"
           
@@ -8864,7 +8864,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 8870 "parser_cocci_menhir.ml"
          in
@@ -8891,7 +8891,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty00 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 8897 "parser_cocci_menhir.ml"
         ) = Obj.magic ty00 in
@@ -8902,13 +8902,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty = ty0 in
             
-# 638 "parser_cocci_menhir.mly"
+# 664 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.CharType,[P.clt2mcode "char" ty])) )
 # 8908 "parser_cocci_menhir.ml"
             
           in
           
-# 723 "parser_cocci_menhir.mly"
+# 749 "parser_cocci_menhir.mly"
                     ( ty )
 # 8914 "parser_cocci_menhir.ml"
           
@@ -8921,7 +8921,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 8927 "parser_cocci_menhir.ml"
          in
@@ -8948,7 +8948,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty00 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 8954 "parser_cocci_menhir.ml"
         ) = Obj.magic ty00 in
@@ -8959,13 +8959,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty = ty0 in
             
-# 640 "parser_cocci_menhir.mly"
+# 666 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.ShortType,[P.clt2mcode "short" ty])) )
 # 8965 "parser_cocci_menhir.ml"
             
           in
           
-# 723 "parser_cocci_menhir.mly"
+# 749 "parser_cocci_menhir.mly"
                     ( ty )
 # 8971 "parser_cocci_menhir.ml"
           
@@ -8978,7 +8978,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 8984 "parser_cocci_menhir.ml"
          in
@@ -9010,12 +9010,12 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty200 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 9016 "parser_cocci_menhir.ml"
         ) = Obj.magic ty200 in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 9021 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
@@ -9028,7 +9028,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let ty2 = ty20 in
             let ty1 = ty10 in
             
-# 642 "parser_cocci_menhir.mly"
+# 668 "parser_cocci_menhir.mly"
     ( Ast0.wrap
        (Ast0.BaseType
           (Ast.ShortIntType,[P.clt2mcode "short" ty1;P.clt2mcode "int" ty2])) )
@@ -9036,7 +9036,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             
           in
           
-# 723 "parser_cocci_menhir.mly"
+# 749 "parser_cocci_menhir.mly"
                     ( ty )
 # 9042 "parser_cocci_menhir.ml"
           
@@ -9049,7 +9049,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 9055 "parser_cocci_menhir.ml"
          in
@@ -9076,7 +9076,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty00 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 9082 "parser_cocci_menhir.ml"
         ) = Obj.magic ty00 in
@@ -9087,13 +9087,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty = ty0 in
             
-# 646 "parser_cocci_menhir.mly"
+# 672 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.IntType,[P.clt2mcode "int" ty])) )
 # 9093 "parser_cocci_menhir.ml"
             
           in
           
-# 723 "parser_cocci_menhir.mly"
+# 749 "parser_cocci_menhir.mly"
                     ( ty )
 # 9099 "parser_cocci_menhir.ml"
           
@@ -9106,7 +9106,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 9112 "parser_cocci_menhir.ml"
          in
@@ -9133,7 +9133,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let p00 : (
-# 134 "parser_cocci_menhir.mly"
+# 160 "parser_cocci_menhir.mly"
        (Parse_aux.info)
 # 9139 "parser_cocci_menhir.ml"
         ) = Obj.magic p00 in
@@ -9144,14 +9144,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let p = p0 in
             
-# 648 "parser_cocci_menhir.mly"
+# 674 "parser_cocci_menhir.mly"
     ( let (nm,pure,clt) = p in
       Ast0.wrap(Ast0.MetaType(P.clt2mcode nm clt,pure)) )
 # 9151 "parser_cocci_menhir.ml"
             
           in
           
-# 723 "parser_cocci_menhir.mly"
+# 749 "parser_cocci_menhir.mly"
                     ( ty )
 # 9157 "parser_cocci_menhir.ml"
           
@@ -9164,7 +9164,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 9170 "parser_cocci_menhir.ml"
          in
@@ -9200,12 +9200,12 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let p00 : (
-# 127 "parser_cocci_menhir.mly"
+# 153 "parser_cocci_menhir.mly"
        (string * Data.clt)
 # 9206 "parser_cocci_menhir.ml"
         ) = Obj.magic p00 in
         let r00 : (
-# 114 "parser_cocci_menhir.mly"
+# 140 "parser_cocci_menhir.mly"
       (string)
 # 9211 "parser_cocci_menhir.ml"
         ) = Obj.magic r00 in
@@ -9218,7 +9218,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let p = p0 in
             let r = r0 in
             
-# 651 "parser_cocci_menhir.mly"
+# 677 "parser_cocci_menhir.mly"
     ( let nm = (r,P.id2name p) in
     (* this is only possible when we are in a metavar decl.  Otherwise,
        it will be represented already as a MetaType *)
@@ -9229,7 +9229,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             
           in
           
-# 723 "parser_cocci_menhir.mly"
+# 749 "parser_cocci_menhir.mly"
                     ( ty )
 # 9235 "parser_cocci_menhir.ml"
           
@@ -9242,7 +9242,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 9248 "parser_cocci_menhir.ml"
          in
@@ -9269,7 +9269,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 9275 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
@@ -9280,13 +9280,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty1 = ty10 in
             
-# 658 "parser_cocci_menhir.mly"
+# 684 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.LongType,[P.clt2mcode "long" ty1])) )
 # 9286 "parser_cocci_menhir.ml"
             
           in
           
-# 723 "parser_cocci_menhir.mly"
+# 749 "parser_cocci_menhir.mly"
                     ( ty )
 # 9292 "parser_cocci_menhir.ml"
           
@@ -9299,7 +9299,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 9305 "parser_cocci_menhir.ml"
          in
@@ -9331,12 +9331,12 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty200 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 9337 "parser_cocci_menhir.ml"
         ) = Obj.magic ty200 in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 9342 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
@@ -9349,7 +9349,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let ty2 = ty20 in
             let ty1 = ty10 in
             
-# 660 "parser_cocci_menhir.mly"
+# 686 "parser_cocci_menhir.mly"
     ( Ast0.wrap
        (Ast0.BaseType
           (Ast.LongIntType,[P.clt2mcode "long" ty1;P.clt2mcode "int" ty2])) )
@@ -9357,7 +9357,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             
           in
           
-# 723 "parser_cocci_menhir.mly"
+# 749 "parser_cocci_menhir.mly"
                     ( ty )
 # 9363 "parser_cocci_menhir.ml"
           
@@ -9370,7 +9370,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 9376 "parser_cocci_menhir.ml"
          in
@@ -9402,12 +9402,12 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty200 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 9408 "parser_cocci_menhir.ml"
         ) = Obj.magic ty200 in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 9413 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
@@ -9420,7 +9420,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let ty2 = ty20 in
             let ty1 = ty10 in
             
-# 664 "parser_cocci_menhir.mly"
+# 690 "parser_cocci_menhir.mly"
     ( Ast0.wrap
        (Ast0.BaseType
           (Ast.LongLongType,
@@ -9429,7 +9429,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             
           in
           
-# 723 "parser_cocci_menhir.mly"
+# 749 "parser_cocci_menhir.mly"
                     ( ty )
 # 9435 "parser_cocci_menhir.ml"
           
@@ -9442,7 +9442,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 9448 "parser_cocci_menhir.ml"
          in
@@ -9479,17 +9479,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty300 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 9485 "parser_cocci_menhir.ml"
         ) = Obj.magic ty300 in
         let ty200 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 9490 "parser_cocci_menhir.ml"
         ) = Obj.magic ty200 in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 9495 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
@@ -9504,7 +9504,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let ty2 = ty20 in
             let ty1 = ty10 in
             
-# 669 "parser_cocci_menhir.mly"
+# 695 "parser_cocci_menhir.mly"
     ( Ast0.wrap
        (Ast0.BaseType
           (Ast.LongLongIntType,
@@ -9514,7 +9514,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             
           in
           
-# 723 "parser_cocci_menhir.mly"
+# 749 "parser_cocci_menhir.mly"
                     ( ty )
 # 9520 "parser_cocci_menhir.ml"
           
@@ -9527,7 +9527,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 9533 "parser_cocci_menhir.ml"
          in
@@ -9554,7 +9554,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty00 : (
-# 118 "parser_cocci_menhir.mly"
+# 144 "parser_cocci_menhir.mly"
       (Data.clt)
 # 9560 "parser_cocci_menhir.ml"
         ) = Obj.magic ty00 in
@@ -9565,13 +9565,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty = ty0 in
             
-# 678 "parser_cocci_menhir.mly"
+# 704 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.VoidType,[P.clt2mcode "void" ty])) )
 # 9571 "parser_cocci_menhir.ml"
             
           in
           
-# 724 "parser_cocci_menhir.mly"
+# 750 "parser_cocci_menhir.mly"
                         ( ty )
 # 9577 "parser_cocci_menhir.ml"
           
@@ -9584,7 +9584,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 9590 "parser_cocci_menhir.ml"
          in
@@ -9616,12 +9616,12 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty200 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 9622 "parser_cocci_menhir.ml"
         ) = Obj.magic ty200 in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 9627 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
@@ -9634,7 +9634,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let ty2 = ty20 in
             let ty1 = ty10 in
             
-# 680 "parser_cocci_menhir.mly"
+# 706 "parser_cocci_menhir.mly"
     ( Ast0.wrap
        (Ast0.BaseType
           (Ast.LongDoubleType,
@@ -9643,7 +9643,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             
           in
           
-# 724 "parser_cocci_menhir.mly"
+# 750 "parser_cocci_menhir.mly"
                         ( ty )
 # 9649 "parser_cocci_menhir.ml"
           
@@ -9656,7 +9656,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 9662 "parser_cocci_menhir.ml"
          in
@@ -9683,7 +9683,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty00 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 9689 "parser_cocci_menhir.ml"
         ) = Obj.magic ty00 in
@@ -9694,13 +9694,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty = ty0 in
             
-# 685 "parser_cocci_menhir.mly"
+# 711 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.DoubleType,[P.clt2mcode "double" ty])) )
 # 9700 "parser_cocci_menhir.ml"
             
           in
           
-# 724 "parser_cocci_menhir.mly"
+# 750 "parser_cocci_menhir.mly"
                         ( ty )
 # 9706 "parser_cocci_menhir.ml"
           
@@ -9713,7 +9713,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 9719 "parser_cocci_menhir.ml"
          in
@@ -9740,7 +9740,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty00 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 9746 "parser_cocci_menhir.ml"
         ) = Obj.magic ty00 in
@@ -9751,13 +9751,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty = ty0 in
             
-# 687 "parser_cocci_menhir.mly"
+# 713 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.FloatType,[P.clt2mcode "float" ty])) )
 # 9757 "parser_cocci_menhir.ml"
             
           in
           
-# 724 "parser_cocci_menhir.mly"
+# 750 "parser_cocci_menhir.mly"
                         ( ty )
 # 9763 "parser_cocci_menhir.ml"
           
@@ -9770,7 +9770,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 9776 "parser_cocci_menhir.ml"
          in
@@ -9797,7 +9797,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty00 : (
-# 117 "parser_cocci_menhir.mly"
+# 143 "parser_cocci_menhir.mly"
       (Data.clt)
 # 9803 "parser_cocci_menhir.ml"
         ) = Obj.magic ty00 in
@@ -9808,13 +9808,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty = ty0 in
             
-# 689 "parser_cocci_menhir.mly"
+# 715 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.SizeType,[P.clt2mcode "size_t" ty])) )
 # 9814 "parser_cocci_menhir.ml"
             
           in
           
-# 724 "parser_cocci_menhir.mly"
+# 750 "parser_cocci_menhir.mly"
                         ( ty )
 # 9820 "parser_cocci_menhir.ml"
           
@@ -9827,7 +9827,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 9833 "parser_cocci_menhir.ml"
          in
@@ -9854,7 +9854,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty00 : (
-# 117 "parser_cocci_menhir.mly"
+# 143 "parser_cocci_menhir.mly"
       (Data.clt)
 # 9860 "parser_cocci_menhir.ml"
         ) = Obj.magic ty00 in
@@ -9865,13 +9865,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty = ty0 in
             
-# 691 "parser_cocci_menhir.mly"
+# 717 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.SSizeType,[P.clt2mcode "ssize_t" ty])) )
 # 9871 "parser_cocci_menhir.ml"
             
           in
           
-# 724 "parser_cocci_menhir.mly"
+# 750 "parser_cocci_menhir.mly"
                         ( ty )
 # 9877 "parser_cocci_menhir.ml"
           
@@ -9884,7 +9884,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 9890 "parser_cocci_menhir.ml"
          in
@@ -9911,7 +9911,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty00 : (
-# 117 "parser_cocci_menhir.mly"
+# 143 "parser_cocci_menhir.mly"
       (Data.clt)
 # 9917 "parser_cocci_menhir.ml"
         ) = Obj.magic ty00 in
@@ -9922,13 +9922,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty = ty0 in
             
-# 693 "parser_cocci_menhir.mly"
+# 719 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.PtrDiffType,[P.clt2mcode "ptrdiff_t" ty])) )
 # 9928 "parser_cocci_menhir.ml"
             
           in
           
-# 724 "parser_cocci_menhir.mly"
+# 750 "parser_cocci_menhir.mly"
                         ( ty )
 # 9934 "parser_cocci_menhir.ml"
           
@@ -9941,7 +9941,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 9947 "parser_cocci_menhir.ml"
          in
@@ -9974,7 +9974,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let m : 'tv_list_TMul_ = Obj.magic m in
         let i00 : 'tv_ident = Obj.magic i00 in
         let s00 : (
-# 118 "parser_cocci_menhir.mly"
+# 144 "parser_cocci_menhir.mly"
       (Data.clt)
 # 9980 "parser_cocci_menhir.ml"
         ) = Obj.magic s00 in
@@ -9987,13 +9987,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let i = i0 in
             let s = s0 in
             
-# 695 "parser_cocci_menhir.mly"
+# 721 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.EnumName(P.clt2mcode "enum" s, Some i)) )
 # 9993 "parser_cocci_menhir.ml"
             
           in
           
-# 724 "parser_cocci_menhir.mly"
+# 750 "parser_cocci_menhir.mly"
                         ( ty )
 # 9999 "parser_cocci_menhir.ml"
           
@@ -10006,7 +10006,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 10012 "parser_cocci_menhir.ml"
          in
@@ -10048,18 +10048,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let r00 : (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
 # 10054 "parser_cocci_menhir.ml"
         ) = Obj.magic r00 in
         let ids00 : 'tv_enum_decl_list = Obj.magic ids00 in
         let l00 : (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
 # 10060 "parser_cocci_menhir.ml"
         ) = Obj.magic l00 in
         let s00 : (
-# 118 "parser_cocci_menhir.mly"
+# 144 "parser_cocci_menhir.mly"
       (Data.clt)
 # 10065 "parser_cocci_menhir.ml"
         ) = Obj.magic s00 in
@@ -10083,7 +10083,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
               
             in
             
-# 697 "parser_cocci_menhir.mly"
+# 723 "parser_cocci_menhir.mly"
     ( (if i = None && !Data.in_iso
     then failwith "enums must be named in the iso file");
       Ast0.wrap(Ast0.EnumDef(Ast0.wrap(Ast0.EnumName(P.clt2mcode "enum" s, i)),
@@ -10092,7 +10092,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             
           in
           
-# 724 "parser_cocci_menhir.mly"
+# 750 "parser_cocci_menhir.mly"
                         ( ty )
 # 10098 "parser_cocci_menhir.ml"
           
@@ -10105,7 +10105,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 10111 "parser_cocci_menhir.ml"
          in
@@ -10152,19 +10152,19 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let r00 : (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
 # 10158 "parser_cocci_menhir.ml"
         ) = Obj.magic r00 in
         let ids00 : 'tv_enum_decl_list = Obj.magic ids00 in
         let l00 : (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
 # 10164 "parser_cocci_menhir.ml"
         ) = Obj.magic l00 in
         let x000 : 'tv_ident = Obj.magic x000 in
         let s00 : (
-# 118 "parser_cocci_menhir.mly"
+# 144 "parser_cocci_menhir.mly"
       (Data.clt)
 # 10170 "parser_cocci_menhir.ml"
         ) = Obj.magic s00 in
@@ -10191,7 +10191,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
               
             in
             
-# 697 "parser_cocci_menhir.mly"
+# 723 "parser_cocci_menhir.mly"
     ( (if i = None && !Data.in_iso
     then failwith "enums must be named in the iso file");
       Ast0.wrap(Ast0.EnumDef(Ast0.wrap(Ast0.EnumName(P.clt2mcode "enum" s, i)),
@@ -10200,7 +10200,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             
           in
           
-# 724 "parser_cocci_menhir.mly"
+# 750 "parser_cocci_menhir.mly"
                         ( ty )
 # 10206 "parser_cocci_menhir.ml"
           
@@ -10213,7 +10213,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 10219 "parser_cocci_menhir.ml"
          in
@@ -10255,13 +10255,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let i = i0 in
             let s = s0 in
             
-# 702 "parser_cocci_menhir.mly"
+# 728 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.StructUnionName(s, Some i)) )
 # 10261 "parser_cocci_menhir.ml"
             
           in
           
-# 724 "parser_cocci_menhir.mly"
+# 750 "parser_cocci_menhir.mly"
                         ( ty )
 # 10267 "parser_cocci_menhir.ml"
           
@@ -10274,7 +10274,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 10280 "parser_cocci_menhir.ml"
          in
@@ -10316,13 +10316,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let r00 : (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
 # 10322 "parser_cocci_menhir.ml"
         ) = Obj.magic r00 in
         let d00 : 'tv_struct_decl_list = Obj.magic d00 in
         let l00 : (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
 # 10328 "parser_cocci_menhir.ml"
         ) = Obj.magic l00 in
@@ -10347,7 +10347,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
               
             in
             
-# 705 "parser_cocci_menhir.mly"
+# 731 "parser_cocci_menhir.mly"
     ( (if i = None && !Data.in_iso
     then failwith "structures must be named in the iso file");
       Ast0.wrap(Ast0.StructUnionDef(Ast0.wrap(Ast0.StructUnionName(s, i)),
@@ -10357,7 +10357,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             
           in
           
-# 724 "parser_cocci_menhir.mly"
+# 750 "parser_cocci_menhir.mly"
                         ( ty )
 # 10363 "parser_cocci_menhir.ml"
           
@@ -10370,7 +10370,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 10376 "parser_cocci_menhir.ml"
          in
@@ -10417,13 +10417,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let r00 : (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
 # 10423 "parser_cocci_menhir.ml"
         ) = Obj.magic r00 in
         let d00 : 'tv_struct_decl_list = Obj.magic d00 in
         let l00 : (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
 # 10429 "parser_cocci_menhir.ml"
         ) = Obj.magic l00 in
@@ -10452,7 +10452,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
               
             in
             
-# 705 "parser_cocci_menhir.mly"
+# 731 "parser_cocci_menhir.mly"
     ( (if i = None && !Data.in_iso
     then failwith "structures must be named in the iso file");
       Ast0.wrap(Ast0.StructUnionDef(Ast0.wrap(Ast0.StructUnionName(s, i)),
@@ -10462,7 +10462,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             
           in
           
-# 724 "parser_cocci_menhir.mly"
+# 750 "parser_cocci_menhir.mly"
                         ( ty )
 # 10468 "parser_cocci_menhir.ml"
           
@@ -10475,7 +10475,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 10481 "parser_cocci_menhir.ml"
          in
@@ -10517,18 +10517,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let r00 : (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
 # 10523 "parser_cocci_menhir.ml"
         ) = Obj.magic r00 in
         let d00 : 'tv_struct_decl_list = Obj.magic d00 in
         let l00 : (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
 # 10529 "parser_cocci_menhir.ml"
         ) = Obj.magic l00 in
         let s00 : (
-# 134 "parser_cocci_menhir.mly"
+# 160 "parser_cocci_menhir.mly"
        (Parse_aux.info)
 # 10534 "parser_cocci_menhir.ml"
         ) = Obj.magic s00 in
@@ -10545,7 +10545,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let l = l0 in
             let s = s0 in
             
-# 711 "parser_cocci_menhir.mly"
+# 737 "parser_cocci_menhir.mly"
     ( let (nm,pure,clt) = s in
     let ty = Ast0.wrap(Ast0.MetaType(P.clt2mcode nm clt,pure)) in
     Ast0.wrap(Ast0.StructUnionDef(ty,P.clt2mcode "{" l,d,P.clt2mcode "}" r)) )
@@ -10553,7 +10553,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             
           in
           
-# 724 "parser_cocci_menhir.mly"
+# 750 "parser_cocci_menhir.mly"
                         ( ty )
 # 10559 "parser_cocci_menhir.ml"
           
@@ -10566,7 +10566,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 10572 "parser_cocci_menhir.ml"
          in
@@ -10593,7 +10593,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let p00 : (
-# 127 "parser_cocci_menhir.mly"
+# 153 "parser_cocci_menhir.mly"
        (string * Data.clt)
 # 10599 "parser_cocci_menhir.ml"
         ) = Obj.magic p00 in
@@ -10604,13 +10604,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let p = p0 in
             
-# 715 "parser_cocci_menhir.mly"
+# 741 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.TypeName(P.id2mcode p)) )
 # 10610 "parser_cocci_menhir.ml"
             
           in
           
-# 724 "parser_cocci_menhir.mly"
+# 750 "parser_cocci_menhir.mly"
                         ( ty )
 # 10616 "parser_cocci_menhir.ml"
           
@@ -10623,7 +10623,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 10629 "parser_cocci_menhir.ml"
          in
@@ -10660,12 +10660,12 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty00 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 10666 "parser_cocci_menhir.ml"
         ) = Obj.magic ty00 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
 # 10671 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
@@ -10678,13 +10678,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty = ty0 in
             
-# 638 "parser_cocci_menhir.mly"
+# 664 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.CharType,[P.clt2mcode "char" ty])) )
 # 10684 "parser_cocci_menhir.ml"
             
           in
           
-# 720 "parser_cocci_menhir.mly"
+# 746 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Signed r,Some ty)) )
 # 10690 "parser_cocci_menhir.ml"
           
@@ -10698,7 +10698,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 10704 "parser_cocci_menhir.ml"
          in
@@ -10735,12 +10735,12 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty00 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 10741 "parser_cocci_menhir.ml"
         ) = Obj.magic ty00 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
 # 10746 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
@@ -10753,13 +10753,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty = ty0 in
             
-# 640 "parser_cocci_menhir.mly"
+# 666 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.ShortType,[P.clt2mcode "short" ty])) )
 # 10759 "parser_cocci_menhir.ml"
             
           in
           
-# 720 "parser_cocci_menhir.mly"
+# 746 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Signed r,Some ty)) )
 # 10765 "parser_cocci_menhir.ml"
           
@@ -10773,7 +10773,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 10779 "parser_cocci_menhir.ml"
          in
@@ -10815,17 +10815,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty200 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 10821 "parser_cocci_menhir.ml"
         ) = Obj.magic ty200 in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 10826 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
 # 10831 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
@@ -10840,7 +10840,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let ty2 = ty20 in
             let ty1 = ty10 in
             
-# 642 "parser_cocci_menhir.mly"
+# 668 "parser_cocci_menhir.mly"
     ( Ast0.wrap
        (Ast0.BaseType
           (Ast.ShortIntType,[P.clt2mcode "short" ty1;P.clt2mcode "int" ty2])) )
@@ -10848,7 +10848,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             
           in
           
-# 720 "parser_cocci_menhir.mly"
+# 746 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Signed r,Some ty)) )
 # 10854 "parser_cocci_menhir.ml"
           
@@ -10862,7 +10862,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 10868 "parser_cocci_menhir.ml"
          in
@@ -10899,12 +10899,12 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty00 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 10905 "parser_cocci_menhir.ml"
         ) = Obj.magic ty00 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
 # 10910 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
@@ -10917,13 +10917,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty = ty0 in
             
-# 646 "parser_cocci_menhir.mly"
+# 672 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.IntType,[P.clt2mcode "int" ty])) )
 # 10923 "parser_cocci_menhir.ml"
             
           in
           
-# 720 "parser_cocci_menhir.mly"
+# 746 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Signed r,Some ty)) )
 # 10929 "parser_cocci_menhir.ml"
           
@@ -10937,7 +10937,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 10943 "parser_cocci_menhir.ml"
          in
@@ -10974,12 +10974,12 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let p00 : (
-# 134 "parser_cocci_menhir.mly"
+# 160 "parser_cocci_menhir.mly"
        (Parse_aux.info)
 # 10980 "parser_cocci_menhir.ml"
         ) = Obj.magic p00 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
 # 10985 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
@@ -10992,14 +10992,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let p = p0 in
             
-# 648 "parser_cocci_menhir.mly"
+# 674 "parser_cocci_menhir.mly"
     ( let (nm,pure,clt) = p in
       Ast0.wrap(Ast0.MetaType(P.clt2mcode nm clt,pure)) )
 # 10999 "parser_cocci_menhir.ml"
             
           in
           
-# 720 "parser_cocci_menhir.mly"
+# 746 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Signed r,Some ty)) )
 # 11005 "parser_cocci_menhir.ml"
           
@@ -11013,7 +11013,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 11019 "parser_cocci_menhir.ml"
          in
@@ -11059,17 +11059,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let p00 : (
-# 127 "parser_cocci_menhir.mly"
+# 153 "parser_cocci_menhir.mly"
        (string * Data.clt)
 # 11065 "parser_cocci_menhir.ml"
         ) = Obj.magic p00 in
         let r00 : (
-# 114 "parser_cocci_menhir.mly"
+# 140 "parser_cocci_menhir.mly"
       (string)
 # 11070 "parser_cocci_menhir.ml"
         ) = Obj.magic r00 in
         let r1 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
 # 11075 "parser_cocci_menhir.ml"
         ) = Obj.magic r1 in
@@ -11084,7 +11084,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let p = p0 in
             let r = r0 in
             
-# 651 "parser_cocci_menhir.mly"
+# 677 "parser_cocci_menhir.mly"
     ( let nm = (r,P.id2name p) in
     (* this is only possible when we are in a metavar decl.  Otherwise,
        it will be represented already as a MetaType *)
@@ -11095,7 +11095,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             
           in
           
-# 720 "parser_cocci_menhir.mly"
+# 746 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Signed r,Some ty)) )
 # 11101 "parser_cocci_menhir.ml"
           
@@ -11109,7 +11109,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 11115 "parser_cocci_menhir.ml"
          in
@@ -11146,12 +11146,12 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 11152 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
 # 11157 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
@@ -11164,13 +11164,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty1 = ty10 in
             
-# 658 "parser_cocci_menhir.mly"
+# 684 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.LongType,[P.clt2mcode "long" ty1])) )
 # 11170 "parser_cocci_menhir.ml"
             
           in
           
-# 720 "parser_cocci_menhir.mly"
+# 746 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Signed r,Some ty)) )
 # 11176 "parser_cocci_menhir.ml"
           
@@ -11184,7 +11184,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 11190 "parser_cocci_menhir.ml"
          in
@@ -11226,17 +11226,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty200 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 11232 "parser_cocci_menhir.ml"
         ) = Obj.magic ty200 in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 11237 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
 # 11242 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
@@ -11251,7 +11251,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let ty2 = ty20 in
             let ty1 = ty10 in
             
-# 660 "parser_cocci_menhir.mly"
+# 686 "parser_cocci_menhir.mly"
     ( Ast0.wrap
        (Ast0.BaseType
           (Ast.LongIntType,[P.clt2mcode "long" ty1;P.clt2mcode "int" ty2])) )
@@ -11259,7 +11259,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             
           in
           
-# 720 "parser_cocci_menhir.mly"
+# 746 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Signed r,Some ty)) )
 # 11265 "parser_cocci_menhir.ml"
           
@@ -11273,7 +11273,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 11279 "parser_cocci_menhir.ml"
          in
@@ -11315,17 +11315,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty200 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 11321 "parser_cocci_menhir.ml"
         ) = Obj.magic ty200 in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 11326 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
 # 11331 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
@@ -11340,7 +11340,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let ty2 = ty20 in
             let ty1 = ty10 in
             
-# 664 "parser_cocci_menhir.mly"
+# 690 "parser_cocci_menhir.mly"
     ( Ast0.wrap
        (Ast0.BaseType
           (Ast.LongLongType,
@@ -11349,7 +11349,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             
           in
           
-# 720 "parser_cocci_menhir.mly"
+# 746 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Signed r,Some ty)) )
 # 11355 "parser_cocci_menhir.ml"
           
@@ -11363,7 +11363,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 11369 "parser_cocci_menhir.ml"
          in
@@ -11410,22 +11410,22 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty300 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 11416 "parser_cocci_menhir.ml"
         ) = Obj.magic ty300 in
         let ty200 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 11421 "parser_cocci_menhir.ml"
         ) = Obj.magic ty200 in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 11426 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
 # 11431 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
@@ -11442,7 +11442,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let ty2 = ty20 in
             let ty1 = ty10 in
             
-# 669 "parser_cocci_menhir.mly"
+# 695 "parser_cocci_menhir.mly"
     ( Ast0.wrap
        (Ast0.BaseType
           (Ast.LongLongIntType,
@@ -11452,7 +11452,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             
           in
           
-# 720 "parser_cocci_menhir.mly"
+# 746 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Signed r,Some ty)) )
 # 11458 "parser_cocci_menhir.ml"
           
@@ -11466,7 +11466,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 11472 "parser_cocci_menhir.ml"
          in
@@ -11503,12 +11503,12 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty00 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 11509 "parser_cocci_menhir.ml"
         ) = Obj.magic ty00 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
 # 11514 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
@@ -11521,13 +11521,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty = ty0 in
             
-# 638 "parser_cocci_menhir.mly"
+# 664 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.CharType,[P.clt2mcode "char" ty])) )
 # 11527 "parser_cocci_menhir.ml"
             
           in
           
-# 722 "parser_cocci_menhir.mly"
+# 748 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Unsigned r,Some ty)) )
 # 11533 "parser_cocci_menhir.ml"
           
@@ -11541,7 +11541,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 11547 "parser_cocci_menhir.ml"
          in
@@ -11578,12 +11578,12 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty00 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 11584 "parser_cocci_menhir.ml"
         ) = Obj.magic ty00 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
 # 11589 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
@@ -11596,13 +11596,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty = ty0 in
             
-# 640 "parser_cocci_menhir.mly"
+# 666 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.ShortType,[P.clt2mcode "short" ty])) )
 # 11602 "parser_cocci_menhir.ml"
             
           in
           
-# 722 "parser_cocci_menhir.mly"
+# 748 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Unsigned r,Some ty)) )
 # 11608 "parser_cocci_menhir.ml"
           
@@ -11616,7 +11616,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 11622 "parser_cocci_menhir.ml"
          in
@@ -11658,17 +11658,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty200 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 11664 "parser_cocci_menhir.ml"
         ) = Obj.magic ty200 in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 11669 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
 # 11674 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
@@ -11683,7 +11683,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let ty2 = ty20 in
             let ty1 = ty10 in
             
-# 642 "parser_cocci_menhir.mly"
+# 668 "parser_cocci_menhir.mly"
     ( Ast0.wrap
        (Ast0.BaseType
           (Ast.ShortIntType,[P.clt2mcode "short" ty1;P.clt2mcode "int" ty2])) )
@@ -11691,7 +11691,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             
           in
           
-# 722 "parser_cocci_menhir.mly"
+# 748 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Unsigned r,Some ty)) )
 # 11697 "parser_cocci_menhir.ml"
           
@@ -11705,7 +11705,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 11711 "parser_cocci_menhir.ml"
          in
@@ -11742,12 +11742,12 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty00 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 11748 "parser_cocci_menhir.ml"
         ) = Obj.magic ty00 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
 # 11753 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
@@ -11760,13 +11760,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty = ty0 in
             
-# 646 "parser_cocci_menhir.mly"
+# 672 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.IntType,[P.clt2mcode "int" ty])) )
 # 11766 "parser_cocci_menhir.ml"
             
           in
           
-# 722 "parser_cocci_menhir.mly"
+# 748 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Unsigned r,Some ty)) )
 # 11772 "parser_cocci_menhir.ml"
           
@@ -11780,7 +11780,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 11786 "parser_cocci_menhir.ml"
          in
@@ -11817,12 +11817,12 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let p00 : (
-# 134 "parser_cocci_menhir.mly"
+# 160 "parser_cocci_menhir.mly"
        (Parse_aux.info)
 # 11823 "parser_cocci_menhir.ml"
         ) = Obj.magic p00 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
 # 11828 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
@@ -11835,14 +11835,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let p = p0 in
             
-# 648 "parser_cocci_menhir.mly"
+# 674 "parser_cocci_menhir.mly"
     ( let (nm,pure,clt) = p in
       Ast0.wrap(Ast0.MetaType(P.clt2mcode nm clt,pure)) )
 # 11842 "parser_cocci_menhir.ml"
             
           in
           
-# 722 "parser_cocci_menhir.mly"
+# 748 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Unsigned r,Some ty)) )
 # 11848 "parser_cocci_menhir.ml"
           
@@ -11856,7 +11856,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 11862 "parser_cocci_menhir.ml"
          in
@@ -11902,17 +11902,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let p00 : (
-# 127 "parser_cocci_menhir.mly"
+# 153 "parser_cocci_menhir.mly"
        (string * Data.clt)
 # 11908 "parser_cocci_menhir.ml"
         ) = Obj.magic p00 in
         let r00 : (
-# 114 "parser_cocci_menhir.mly"
+# 140 "parser_cocci_menhir.mly"
       (string)
 # 11913 "parser_cocci_menhir.ml"
         ) = Obj.magic r00 in
         let r1 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
 # 11918 "parser_cocci_menhir.ml"
         ) = Obj.magic r1 in
@@ -11927,7 +11927,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let p = p0 in
             let r = r0 in
             
-# 651 "parser_cocci_menhir.mly"
+# 677 "parser_cocci_menhir.mly"
     ( let nm = (r,P.id2name p) in
     (* this is only possible when we are in a metavar decl.  Otherwise,
        it will be represented already as a MetaType *)
@@ -11938,7 +11938,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             
           in
           
-# 722 "parser_cocci_menhir.mly"
+# 748 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Unsigned r,Some ty)) )
 # 11944 "parser_cocci_menhir.ml"
           
@@ -11952,7 +11952,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 11958 "parser_cocci_menhir.ml"
          in
@@ -11989,12 +11989,12 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 11995 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
 # 12000 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
@@ -12007,13 +12007,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty1 = ty10 in
             
-# 658 "parser_cocci_menhir.mly"
+# 684 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.LongType,[P.clt2mcode "long" ty1])) )
 # 12013 "parser_cocci_menhir.ml"
             
           in
           
-# 722 "parser_cocci_menhir.mly"
+# 748 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Unsigned r,Some ty)) )
 # 12019 "parser_cocci_menhir.ml"
           
@@ -12027,7 +12027,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 12033 "parser_cocci_menhir.ml"
          in
@@ -12069,17 +12069,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty200 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 12075 "parser_cocci_menhir.ml"
         ) = Obj.magic ty200 in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 12080 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
 # 12085 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
@@ -12094,7 +12094,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let ty2 = ty20 in
             let ty1 = ty10 in
             
-# 660 "parser_cocci_menhir.mly"
+# 686 "parser_cocci_menhir.mly"
     ( Ast0.wrap
        (Ast0.BaseType
           (Ast.LongIntType,[P.clt2mcode "long" ty1;P.clt2mcode "int" ty2])) )
@@ -12102,7 +12102,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             
           in
           
-# 722 "parser_cocci_menhir.mly"
+# 748 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Unsigned r,Some ty)) )
 # 12108 "parser_cocci_menhir.ml"
           
@@ -12116,7 +12116,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 12122 "parser_cocci_menhir.ml"
          in
@@ -12158,17 +12158,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty200 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 12164 "parser_cocci_menhir.ml"
         ) = Obj.magic ty200 in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 12169 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
 # 12174 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
@@ -12183,7 +12183,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let ty2 = ty20 in
             let ty1 = ty10 in
             
-# 664 "parser_cocci_menhir.mly"
+# 690 "parser_cocci_menhir.mly"
     ( Ast0.wrap
        (Ast0.BaseType
           (Ast.LongLongType,
@@ -12192,7 +12192,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             
           in
           
-# 722 "parser_cocci_menhir.mly"
+# 748 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Unsigned r,Some ty)) )
 # 12198 "parser_cocci_menhir.ml"
           
@@ -12206,7 +12206,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 12212 "parser_cocci_menhir.ml"
          in
@@ -12253,22 +12253,22 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty300 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 12259 "parser_cocci_menhir.ml"
         ) = Obj.magic ty300 in
         let ty200 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 12264 "parser_cocci_menhir.ml"
         ) = Obj.magic ty200 in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 12269 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
 # 12274 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
@@ -12285,7 +12285,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let ty2 = ty20 in
             let ty1 = ty10 in
             
-# 669 "parser_cocci_menhir.mly"
+# 695 "parser_cocci_menhir.mly"
     ( Ast0.wrap
        (Ast0.BaseType
           (Ast.LongLongIntType,
@@ -12295,7 +12295,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             
           in
           
-# 722 "parser_cocci_menhir.mly"
+# 748 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Unsigned r,Some ty)) )
 # 12301 "parser_cocci_menhir.ml"
           
@@ -12309,7 +12309,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 12315 "parser_cocci_menhir.ml"
          in
@@ -12341,7 +12341,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty00 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 12347 "parser_cocci_menhir.ml"
         ) = Obj.magic ty00 in
@@ -12353,13 +12353,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty = ty0 in
             
-# 638 "parser_cocci_menhir.mly"
+# 664 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.CharType,[P.clt2mcode "char" ty])) )
 # 12359 "parser_cocci_menhir.ml"
             
           in
           
-# 723 "parser_cocci_menhir.mly"
+# 749 "parser_cocci_menhir.mly"
                     ( ty )
 # 12365 "parser_cocci_menhir.ml"
           
@@ -12373,7 +12373,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 12379 "parser_cocci_menhir.ml"
          in
@@ -12405,7 +12405,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty00 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 12411 "parser_cocci_menhir.ml"
         ) = Obj.magic ty00 in
@@ -12417,13 +12417,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty = ty0 in
             
-# 640 "parser_cocci_menhir.mly"
+# 666 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.ShortType,[P.clt2mcode "short" ty])) )
 # 12423 "parser_cocci_menhir.ml"
             
           in
           
-# 723 "parser_cocci_menhir.mly"
+# 749 "parser_cocci_menhir.mly"
                     ( ty )
 # 12429 "parser_cocci_menhir.ml"
           
@@ -12437,7 +12437,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 12443 "parser_cocci_menhir.ml"
          in
@@ -12474,12 +12474,12 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty200 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 12480 "parser_cocci_menhir.ml"
         ) = Obj.magic ty200 in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 12485 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
@@ -12493,7 +12493,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let ty2 = ty20 in
             let ty1 = ty10 in
             
-# 642 "parser_cocci_menhir.mly"
+# 668 "parser_cocci_menhir.mly"
     ( Ast0.wrap
        (Ast0.BaseType
           (Ast.ShortIntType,[P.clt2mcode "short" ty1;P.clt2mcode "int" ty2])) )
@@ -12501,7 +12501,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             
           in
           
-# 723 "parser_cocci_menhir.mly"
+# 749 "parser_cocci_menhir.mly"
                     ( ty )
 # 12507 "parser_cocci_menhir.ml"
           
@@ -12515,7 +12515,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 12521 "parser_cocci_menhir.ml"
          in
@@ -12547,7 +12547,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty00 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 12553 "parser_cocci_menhir.ml"
         ) = Obj.magic ty00 in
@@ -12559,13 +12559,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty = ty0 in
             
-# 646 "parser_cocci_menhir.mly"
+# 672 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.IntType,[P.clt2mcode "int" ty])) )
 # 12565 "parser_cocci_menhir.ml"
             
           in
           
-# 723 "parser_cocci_menhir.mly"
+# 749 "parser_cocci_menhir.mly"
                     ( ty )
 # 12571 "parser_cocci_menhir.ml"
           
@@ -12579,7 +12579,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 12585 "parser_cocci_menhir.ml"
          in
@@ -12611,7 +12611,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let p00 : (
-# 134 "parser_cocci_menhir.mly"
+# 160 "parser_cocci_menhir.mly"
        (Parse_aux.info)
 # 12617 "parser_cocci_menhir.ml"
         ) = Obj.magic p00 in
@@ -12623,14 +12623,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let p = p0 in
             
-# 648 "parser_cocci_menhir.mly"
+# 674 "parser_cocci_menhir.mly"
     ( let (nm,pure,clt) = p in
       Ast0.wrap(Ast0.MetaType(P.clt2mcode nm clt,pure)) )
 # 12630 "parser_cocci_menhir.ml"
             
           in
           
-# 723 "parser_cocci_menhir.mly"
+# 749 "parser_cocci_menhir.mly"
                     ( ty )
 # 12636 "parser_cocci_menhir.ml"
           
@@ -12644,7 +12644,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 12650 "parser_cocci_menhir.ml"
          in
@@ -12685,12 +12685,12 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let p00 : (
-# 127 "parser_cocci_menhir.mly"
+# 153 "parser_cocci_menhir.mly"
        (string * Data.clt)
 # 12691 "parser_cocci_menhir.ml"
         ) = Obj.magic p00 in
         let r00 : (
-# 114 "parser_cocci_menhir.mly"
+# 140 "parser_cocci_menhir.mly"
       (string)
 # 12696 "parser_cocci_menhir.ml"
         ) = Obj.magic r00 in
@@ -12704,7 +12704,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let p = p0 in
             let r = r0 in
             
-# 651 "parser_cocci_menhir.mly"
+# 677 "parser_cocci_menhir.mly"
     ( let nm = (r,P.id2name p) in
     (* this is only possible when we are in a metavar decl.  Otherwise,
        it will be represented already as a MetaType *)
@@ -12715,7 +12715,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             
           in
           
-# 723 "parser_cocci_menhir.mly"
+# 749 "parser_cocci_menhir.mly"
                     ( ty )
 # 12721 "parser_cocci_menhir.ml"
           
@@ -12729,7 +12729,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 12735 "parser_cocci_menhir.ml"
          in
@@ -12761,7 +12761,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 12767 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
@@ -12773,13 +12773,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty1 = ty10 in
             
-# 658 "parser_cocci_menhir.mly"
+# 684 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.LongType,[P.clt2mcode "long" ty1])) )
 # 12779 "parser_cocci_menhir.ml"
             
           in
           
-# 723 "parser_cocci_menhir.mly"
+# 749 "parser_cocci_menhir.mly"
                     ( ty )
 # 12785 "parser_cocci_menhir.ml"
           
@@ -12793,7 +12793,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 12799 "parser_cocci_menhir.ml"
          in
@@ -12830,12 +12830,12 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty200 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 12836 "parser_cocci_menhir.ml"
         ) = Obj.magic ty200 in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 12841 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
@@ -12849,7 +12849,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let ty2 = ty20 in
             let ty1 = ty10 in
             
-# 660 "parser_cocci_menhir.mly"
+# 686 "parser_cocci_menhir.mly"
     ( Ast0.wrap
        (Ast0.BaseType
           (Ast.LongIntType,[P.clt2mcode "long" ty1;P.clt2mcode "int" ty2])) )
@@ -12857,7 +12857,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             
           in
           
-# 723 "parser_cocci_menhir.mly"
+# 749 "parser_cocci_menhir.mly"
                     ( ty )
 # 12863 "parser_cocci_menhir.ml"
           
@@ -12871,7 +12871,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 12877 "parser_cocci_menhir.ml"
          in
@@ -12908,12 +12908,12 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty200 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 12914 "parser_cocci_menhir.ml"
         ) = Obj.magic ty200 in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 12919 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
@@ -12927,7 +12927,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let ty2 = ty20 in
             let ty1 = ty10 in
             
-# 664 "parser_cocci_menhir.mly"
+# 690 "parser_cocci_menhir.mly"
     ( Ast0.wrap
        (Ast0.BaseType
           (Ast.LongLongType,
@@ -12936,7 +12936,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             
           in
           
-# 723 "parser_cocci_menhir.mly"
+# 749 "parser_cocci_menhir.mly"
                     ( ty )
 # 12942 "parser_cocci_menhir.ml"
           
@@ -12950,7 +12950,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 12956 "parser_cocci_menhir.ml"
          in
@@ -12992,17 +12992,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty300 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 12998 "parser_cocci_menhir.ml"
         ) = Obj.magic ty300 in
         let ty200 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 13003 "parser_cocci_menhir.ml"
         ) = Obj.magic ty200 in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 13008 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
@@ -13018,7 +13018,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let ty2 = ty20 in
             let ty1 = ty10 in
             
-# 669 "parser_cocci_menhir.mly"
+# 695 "parser_cocci_menhir.mly"
     ( Ast0.wrap
        (Ast0.BaseType
           (Ast.LongLongIntType,
@@ -13028,7 +13028,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             
           in
           
-# 723 "parser_cocci_menhir.mly"
+# 749 "parser_cocci_menhir.mly"
                     ( ty )
 # 13034 "parser_cocci_menhir.ml"
           
@@ -13042,7 +13042,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 13048 "parser_cocci_menhir.ml"
          in
@@ -13074,7 +13074,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty00 : (
-# 118 "parser_cocci_menhir.mly"
+# 144 "parser_cocci_menhir.mly"
       (Data.clt)
 # 13080 "parser_cocci_menhir.ml"
         ) = Obj.magic ty00 in
@@ -13086,13 +13086,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty = ty0 in
             
-# 678 "parser_cocci_menhir.mly"
+# 704 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.VoidType,[P.clt2mcode "void" ty])) )
 # 13092 "parser_cocci_menhir.ml"
             
           in
           
-# 724 "parser_cocci_menhir.mly"
+# 750 "parser_cocci_menhir.mly"
                         ( ty )
 # 13098 "parser_cocci_menhir.ml"
           
@@ -13106,7 +13106,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 13112 "parser_cocci_menhir.ml"
          in
@@ -13143,12 +13143,12 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty200 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 13149 "parser_cocci_menhir.ml"
         ) = Obj.magic ty200 in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 13154 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
@@ -13162,7 +13162,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let ty2 = ty20 in
             let ty1 = ty10 in
             
-# 680 "parser_cocci_menhir.mly"
+# 706 "parser_cocci_menhir.mly"
     ( Ast0.wrap
        (Ast0.BaseType
           (Ast.LongDoubleType,
@@ -13171,7 +13171,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             
           in
           
-# 724 "parser_cocci_menhir.mly"
+# 750 "parser_cocci_menhir.mly"
                         ( ty )
 # 13177 "parser_cocci_menhir.ml"
           
@@ -13185,7 +13185,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 13191 "parser_cocci_menhir.ml"
          in
@@ -13217,7 +13217,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty00 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 13223 "parser_cocci_menhir.ml"
         ) = Obj.magic ty00 in
@@ -13229,13 +13229,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty = ty0 in
             
-# 685 "parser_cocci_menhir.mly"
+# 711 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.DoubleType,[P.clt2mcode "double" ty])) )
 # 13235 "parser_cocci_menhir.ml"
             
           in
           
-# 724 "parser_cocci_menhir.mly"
+# 750 "parser_cocci_menhir.mly"
                         ( ty )
 # 13241 "parser_cocci_menhir.ml"
           
@@ -13249,7 +13249,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 13255 "parser_cocci_menhir.ml"
          in
@@ -13281,7 +13281,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty00 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
 # 13287 "parser_cocci_menhir.ml"
         ) = Obj.magic ty00 in
@@ -13293,13 +13293,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty = ty0 in
             
-# 687 "parser_cocci_menhir.mly"
+# 713 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.FloatType,[P.clt2mcode "float" ty])) )
 # 13299 "parser_cocci_menhir.ml"
             
           in
           
-# 724 "parser_cocci_menhir.mly"
+# 750 "parser_cocci_menhir.mly"
                         ( ty )
 # 13305 "parser_cocci_menhir.ml"
           
@@ -13313,7 +13313,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 13319 "parser_cocci_menhir.ml"
          in
@@ -13345,7 +13345,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty00 : (
-# 117 "parser_cocci_menhir.mly"
+# 143 "parser_cocci_menhir.mly"
       (Data.clt)
 # 13351 "parser_cocci_menhir.ml"
         ) = Obj.magic ty00 in
@@ -13357,13 +13357,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty = ty0 in
             
-# 689 "parser_cocci_menhir.mly"
+# 715 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.SizeType,[P.clt2mcode "size_t" ty])) )
 # 13363 "parser_cocci_menhir.ml"
             
           in
           
-# 724 "parser_cocci_menhir.mly"
+# 750 "parser_cocci_menhir.mly"
                         ( ty )
 # 13369 "parser_cocci_menhir.ml"
           
@@ -13377,7 +13377,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 13383 "parser_cocci_menhir.ml"
          in
@@ -13409,7 +13409,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty00 : (
-# 117 "parser_cocci_menhir.mly"
+# 143 "parser_cocci_menhir.mly"
       (Data.clt)
 # 13415 "parser_cocci_menhir.ml"
         ) = Obj.magic ty00 in
@@ -13421,13 +13421,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty = ty0 in
             
-# 691 "parser_cocci_menhir.mly"
+# 717 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.SSizeType,[P.clt2mcode "ssize_t" ty])) )
 # 13427 "parser_cocci_menhir.ml"
             
           in
           
-# 724 "parser_cocci_menhir.mly"
+# 750 "parser_cocci_menhir.mly"
                         ( ty )
 # 13433 "parser_cocci_menhir.ml"
           
@@ -13441,7 +13441,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 13447 "parser_cocci_menhir.ml"
          in
@@ -13473,7 +13473,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty00 : (
-# 117 "parser_cocci_menhir.mly"
+# 143 "parser_cocci_menhir.mly"
       (Data.clt)
 # 13479 "parser_cocci_menhir.ml"
         ) = Obj.magic ty00 in
@@ -13485,13 +13485,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty = ty0 in
             
-# 693 "parser_cocci_menhir.mly"
+# 719 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.PtrDiffType,[P.clt2mcode "ptrdiff_t" ty])) )
 # 13491 "parser_cocci_menhir.ml"
             
           in
           
-# 724 "parser_cocci_menhir.mly"
+# 750 "parser_cocci_menhir.mly"
                         ( ty )
 # 13497 "parser_cocci_menhir.ml"
           
@@ -13505,7 +13505,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 13511 "parser_cocci_menhir.ml"
          in
@@ -13543,7 +13543,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let m : 'tv_list_TMul_ = Obj.magic m in
         let i00 : 'tv_ident = Obj.magic i00 in
         let s00 : (
-# 118 "parser_cocci_menhir.mly"
+# 144 "parser_cocci_menhir.mly"
       (Data.clt)
 # 13549 "parser_cocci_menhir.ml"
         ) = Obj.magic s00 in
@@ -13557,13 +13557,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let i = i0 in
             let s = s0 in
             
-# 695 "parser_cocci_menhir.mly"
+# 721 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.EnumName(P.clt2mcode "enum" s, Some i)) )
 # 13563 "parser_cocci_menhir.ml"
             
           in
           
-# 724 "parser_cocci_menhir.mly"
+# 750 "parser_cocci_menhir.mly"
                         ( ty )
 # 13569 "parser_cocci_menhir.ml"
           
@@ -13577,7 +13577,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 13583 "parser_cocci_menhir.ml"
          in
@@ -13624,18 +13624,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let r00 : (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
 # 13630 "parser_cocci_menhir.ml"
         ) = Obj.magic r00 in
         let ids00 : 'tv_enum_decl_list = Obj.magic ids00 in
         let l00 : (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
 # 13636 "parser_cocci_menhir.ml"
         ) = Obj.magic l00 in
         let s00 : (
-# 118 "parser_cocci_menhir.mly"
+# 144 "parser_cocci_menhir.mly"
       (Data.clt)
 # 13641 "parser_cocci_menhir.ml"
         ) = Obj.magic s00 in
@@ -13660,7 +13660,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
               
             in
             
-# 697 "parser_cocci_menhir.mly"
+# 723 "parser_cocci_menhir.mly"
     ( (if i = None && !Data.in_iso
     then failwith "enums must be named in the iso file");
       Ast0.wrap(Ast0.EnumDef(Ast0.wrap(Ast0.EnumName(P.clt2mcode "enum" s, i)),
@@ -13669,7 +13669,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             
           in
           
-# 724 "parser_cocci_menhir.mly"
+# 750 "parser_cocci_menhir.mly"
                         ( ty )
 # 13675 "parser_cocci_menhir.ml"
           
@@ -13683,7 +13683,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 13689 "parser_cocci_menhir.ml"
          in
@@ -13735,19 +13735,19 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let r00 : (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
 # 13741 "parser_cocci_menhir.ml"
         ) = Obj.magic r00 in
         let ids00 : 'tv_enum_decl_list = Obj.magic ids00 in
         let l00 : (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
 # 13747 "parser_cocci_menhir.ml"
         ) = Obj.magic l00 in
         let x000 : 'tv_ident = Obj.magic x000 in
         let s00 : (
-# 118 "parser_cocci_menhir.mly"
+# 144 "parser_cocci_menhir.mly"
       (Data.clt)
 # 13753 "parser_cocci_menhir.ml"
         ) = Obj.magic s00 in
@@ -13775,7 +13775,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
               
             in
             
-# 697 "parser_cocci_menhir.mly"
+# 723 "parser_cocci_menhir.mly"
     ( (if i = None && !Data.in_iso
     then failwith "enums must be named in the iso file");
       Ast0.wrap(Ast0.EnumDef(Ast0.wrap(Ast0.EnumName(P.clt2mcode "enum" s, i)),
@@ -13784,7 +13784,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             
           in
           
-# 724 "parser_cocci_menhir.mly"
+# 750 "parser_cocci_menhir.mly"
                         ( ty )
 # 13790 "parser_cocci_menhir.ml"
           
@@ -13798,7 +13798,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 13804 "parser_cocci_menhir.ml"
          in
@@ -13846,13 +13846,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let i = i0 in
             let s = s0 in
             
-# 702 "parser_cocci_menhir.mly"
+# 728 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.StructUnionName(s, Some i)) )
 # 13852 "parser_cocci_menhir.ml"
             
           in
           
-# 724 "parser_cocci_menhir.mly"
+# 750 "parser_cocci_menhir.mly"
                         ( ty )
 # 13858 "parser_cocci_menhir.ml"
           
@@ -13866,7 +13866,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 13872 "parser_cocci_menhir.ml"
          in
@@ -13913,13 +13913,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let r00 : (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
 # 13919 "parser_cocci_menhir.ml"
         ) = Obj.magic r00 in
         let d00 : 'tv_struct_decl_list = Obj.magic d00 in
         let l00 : (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
 # 13925 "parser_cocci_menhir.ml"
         ) = Obj.magic l00 in
@@ -13945,7 +13945,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
               
             in
             
-# 705 "parser_cocci_menhir.mly"
+# 731 "parser_cocci_menhir.mly"
     ( (if i = None && !Data.in_iso
     then failwith "structures must be named in the iso file");
       Ast0.wrap(Ast0.StructUnionDef(Ast0.wrap(Ast0.StructUnionName(s, i)),
@@ -13955,7 +13955,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             
           in
           
-# 724 "parser_cocci_menhir.mly"
+# 750 "parser_cocci_menhir.mly"
                         ( ty )
 # 13961 "parser_cocci_menhir.ml"
           
@@ -13969,7 +13969,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 13975 "parser_cocci_menhir.ml"
          in
@@ -14021,13 +14021,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let r00 : (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
 # 14027 "parser_cocci_menhir.ml"
         ) = Obj.magic r00 in
         let d00 : 'tv_struct_decl_list = Obj.magic d00 in
         let l00 : (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
 # 14033 "parser_cocci_menhir.ml"
         ) = Obj.magic l00 in
@@ -14057,7 +14057,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
               
             in
             
-# 705 "parser_cocci_menhir.mly"
+# 731 "parser_cocci_menhir.mly"
     ( (if i = None && !Data.in_iso
     then failwith "structures must be named in the iso file");
       Ast0.wrap(Ast0.StructUnionDef(Ast0.wrap(Ast0.StructUnionName(s, i)),
@@ -14067,7 +14067,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             
           in
           
-# 724 "parser_cocci_menhir.mly"
+# 750 "parser_cocci_menhir.mly"
                         ( ty )
 # 14073 "parser_cocci_menhir.ml"
           
@@ -14081,7 +14081,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 14087 "parser_cocci_menhir.ml"
          in
@@ -14128,18 +14128,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let r00 : (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
 # 14134 "parser_cocci_menhir.ml"
         ) = Obj.magic r00 in
         let d00 : 'tv_struct_decl_list = Obj.magic d00 in
         let l00 : (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
 # 14140 "parser_cocci_menhir.ml"
         ) = Obj.magic l00 in
         let s00 : (
-# 134 "parser_cocci_menhir.mly"
+# 160 "parser_cocci_menhir.mly"
        (Parse_aux.info)
 # 14145 "parser_cocci_menhir.ml"
         ) = Obj.magic s00 in
@@ -14157,7 +14157,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let l = l0 in
             let s = s0 in
             
-# 711 "parser_cocci_menhir.mly"
+# 737 "parser_cocci_menhir.mly"
     ( let (nm,pure,clt) = s in
     let ty = Ast0.wrap(Ast0.MetaType(P.clt2mcode nm clt,pure)) in
     Ast0.wrap(Ast0.StructUnionDef(ty,P.clt2mcode "{" l,d,P.clt2mcode "}" r)) )
@@ -14165,7 +14165,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             
           in
           
-# 724 "parser_cocci_menhir.mly"
+# 750 "parser_cocci_menhir.mly"
                         ( ty )
 # 14171 "parser_cocci_menhir.ml"
           
@@ -14179,7 +14179,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 14185 "parser_cocci_menhir.ml"
          in
@@ -14211,7 +14211,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let p00 : (
-# 127 "parser_cocci_menhir.mly"
+# 153 "parser_cocci_menhir.mly"
        (string * Data.clt)
 # 14217 "parser_cocci_menhir.ml"
         ) = Obj.magic p00 in
@@ -14223,13 +14223,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let p = p0 in
             
-# 715 "parser_cocci_menhir.mly"
+# 741 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.TypeName(P.id2mcode p)) )
 # 14229 "parser_cocci_menhir.ml"
             
           in
           
-# 724 "parser_cocci_menhir.mly"
+# 750 "parser_cocci_menhir.mly"
                         ( ty )
 # 14235 "parser_cocci_menhir.ml"
           
@@ -14243,7 +14243,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 728 "parser_cocci_menhir.mly"
+# 754 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
 # 14249 "parser_cocci_menhir.ml"
          in
@@ -14264,14 +14264,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let r : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
 # 14270 "parser_cocci_menhir.ml"
         ) = Obj.magic r in
         let _startpos = _startpos_r_ in
         let _endpos = _endpos_r_ in
         let _v : 'tv_ctype = 
-# 730 "parser_cocci_menhir.mly"
+# 756 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Signed r,None)) )
 # 14277 "parser_cocci_menhir.ml"
          in
@@ -14292,14 +14292,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let r : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
 # 14298 "parser_cocci_menhir.ml"
         ) = Obj.magic r in
         let _startpos = _startpos_r_ in
         let _endpos = _endpos_r_ in
         let _v : 'tv_ctype = 
-# 732 "parser_cocci_menhir.mly"
+# 758 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Unsigned r,None)) )
 # 14305 "parser_cocci_menhir.ml"
          in
@@ -14330,20 +14330,20 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let rp : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
 # 14336 "parser_cocci_menhir.ml"
         ) = Obj.magic rp in
         let t : 'tv_midzero_list_ctype_ctype_ = Obj.magic t in
         let lp : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
 # 14342 "parser_cocci_menhir.ml"
         ) = Obj.magic lp in
         let _startpos = _startpos_lp_ in
         let _endpos = _endpos_rp_ in
         let _v : 'tv_ctype = 
-# 734 "parser_cocci_menhir.mly"
+# 760 "parser_cocci_menhir.mly"
     ( let (mids,code) = t in
       Ast0.wrap
        (Ast0.DisjType(P.clt2mcode "(" lp,code,mids, P.clt2mcode ")" rp)) )
@@ -14375,7 +14375,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_d_ident = 
-# 1339 "parser_cocci_menhir.mly"
+# 1365 "parser_cocci_menhir.mly"
       ( (_1, function t -> P.arrayify t _2) )
 # 14381 "parser_cocci_menhir.ml"
          in
@@ -14399,7 +14399,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_dargexpr = 
-# 1476 "parser_cocci_menhir.mly"
+# 1503 "parser_cocci_menhir.mly"
                                              ( _1 )
 # 14405 "parser_cocci_menhir.ml"
          in
@@ -14435,7 +14435,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_t_ in
         let _endpos = _endpos_a_ in
         let _v : 'tv_decl = 
-# 1070 "parser_cocci_menhir.mly"
+# 1096 "parser_cocci_menhir.mly"
  ( let t = P.arrayify t a in Ast0.wrap(Ast0.Param(t, Some i)) )
 # 14441 "parser_cocci_menhir.ml"
          in
@@ -14459,7 +14459,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_t_ in
         let _endpos = _endpos_t_ in
         let _v : 'tv_decl = 
-# 1071 "parser_cocci_menhir.mly"
+# 1097 "parser_cocci_menhir.mly"
               ( (*verify in FunDecl*) Ast0.wrap(Ast0.Param(t, None)) )
 # 14465 "parser_cocci_menhir.ml"
          in
@@ -14515,29 +14515,29 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let rp1 : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
 # 14521 "parser_cocci_menhir.ml"
         ) = Obj.magic rp1 in
         let d : 'tv_decl_list_name_opt_decl_ = Obj.magic d in
         let lp1 : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
 # 14527 "parser_cocci_menhir.ml"
         ) = Obj.magic lp1 in
         let rp : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
 # 14532 "parser_cocci_menhir.ml"
         ) = Obj.magic rp in
         let i : 'tv_disj_ident = Obj.magic i in
         let s : (
-# 171 "parser_cocci_menhir.mly"
+# 197 "parser_cocci_menhir.mly"
        (Data.clt)
 # 14538 "parser_cocci_menhir.ml"
         ) = Obj.magic s in
         let lp : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
 # 14543 "parser_cocci_menhir.ml"
         ) = Obj.magic lp in
@@ -14545,7 +14545,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_t_ in
         let _endpos = _endpos_rp1_ in
         let _v : 'tv_decl = 
-# 1074 "parser_cocci_menhir.mly"
+# 1100 "parser_cocci_menhir.mly"
         ( let fnptr =
          Ast0.wrap
            (Ast0.FunctionPointer
@@ -14571,14 +14571,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 134 "parser_cocci_menhir.mly"
+# 160 "parser_cocci_menhir.mly"
        (Parse_aux.info)
 # 14577 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_decl = 
-# 1081 "parser_cocci_menhir.mly"
+# 1107 "parser_cocci_menhir.mly"
  ( let (nm,pure,clt) = _1 in
        Ast0.wrap(Ast0.MetaParam(P.clt2mcode nm clt,pure)) )
 # 14585 "parser_cocci_menhir.ml"
@@ -14600,14 +14600,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 135 "parser_cocci_menhir.mly"
+# 161 "parser_cocci_menhir.mly"
        (Parse_aux.info)
 # 14606 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_decl = 
-# 1083 "parser_cocci_menhir.mly"
+# 1109 "parser_cocci_menhir.mly"
             ( tmeta_to_param _1 )
 # 14613 "parser_cocci_menhir.ml"
          in
@@ -14628,14 +14628,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 127 "parser_cocci_menhir.mly"
+# 153 "parser_cocci_menhir.mly"
        (string * Data.clt)
 # 14634 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_decl_ident = 
-# 2045 "parser_cocci_menhir.mly"
+# 2082 "parser_cocci_menhir.mly"
          ( Ast0.wrap(Ast0.Id(P.id2mcode _1)) )
 # 14641 "parser_cocci_menhir.ml"
          in
@@ -14656,14 +14656,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 132 "parser_cocci_menhir.mly"
+# 158 "parser_cocci_menhir.mly"
        (Parse_aux.idinfo)
 # 14662 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_decl_ident = 
-# 2047 "parser_cocci_menhir.mly"
+# 2084 "parser_cocci_menhir.mly"
          ( let (nm,constraints,pure,clt) = _1 in
          Ast0.wrap(Ast0.MetaId(P.clt2mcode nm clt,constraints,Ast.NoVal,pure)) )
 # 14670 "parser_cocci_menhir.ml"
@@ -14688,7 +14688,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_decl_list_decl_ = 
-# 2069 "parser_cocci_menhir.mly"
+# 2106 "parser_cocci_menhir.mly"
      ( Ast0.wrap
         (Ast0.DOTS
            (_1
@@ -14716,7 +14716,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_decl_list_name_opt_decl_ = 
-# 2069 "parser_cocci_menhir.mly"
+# 2106 "parser_cocci_menhir.mly"
      ( Ast0.wrap
         (Ast0.DOTS
            (_1
@@ -14741,14 +14741,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 134 "parser_cocci_menhir.mly"
+# 160 "parser_cocci_menhir.mly"
        (Parse_aux.info)
 # 14747 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_decl_statement = 
-# 1402 "parser_cocci_menhir.mly"
+# 1429 "parser_cocci_menhir.mly"
       ( let (nm,pure,clt) = _1 in
       [Ast0.wrap(Ast0.MetaStmt(P.clt2mcode nm clt,pure))] )
 # 14755 "parser_cocci_menhir.ml"
@@ -14773,7 +14773,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_decl_statement = 
-# 1405 "parser_cocci_menhir.mly"
+# 1432 "parser_cocci_menhir.mly"
       ( List.map
          (function x ->
            Ast0.wrap
@@ -14801,7 +14801,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_decl_statement = 
-# 1410 "parser_cocci_menhir.mly"
+# 1437 "parser_cocci_menhir.mly"
               ( [_1] )
 # 14807 "parser_cocci_menhir.ml"
          in
@@ -14832,20 +14832,20 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _3 : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
 # 14838 "parser_cocci_menhir.ml"
         ) = Obj.magic _3 in
         let t : 'tv_midzero_list_fun_start_fun_start_ = Obj.magic t in
         let _1 : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
 # 14844 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_decl_statement = 
-# 1419 "parser_cocci_menhir.mly"
+# 1446 "parser_cocci_menhir.mly"
       ( let (mids,code) = t in
        if List.for_all
            (function x ->
@@ -14874,14 +14874,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 134 "parser_cocci_menhir.mly"
+# 160 "parser_cocci_menhir.mly"
        (Parse_aux.info)
 # 14880 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_decl_statement_expr = 
-# 1432 "parser_cocci_menhir.mly"
+# 1459 "parser_cocci_menhir.mly"
       ( let (nm,pure,clt) = _1 in
       [Ast0.wrap(Ast0.MetaStmt(P.clt2mcode nm clt,pure))] )
 # 14888 "parser_cocci_menhir.ml"
@@ -14906,7 +14906,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_decl_statement_expr = 
-# 1435 "parser_cocci_menhir.mly"
+# 1462 "parser_cocci_menhir.mly"
       ( List.map
          (function x ->
            Ast0.wrap
@@ -14934,7 +14934,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_decl_statement_expr = 
-# 1440 "parser_cocci_menhir.mly"
+# 1467 "parser_cocci_menhir.mly"
               ( [_1] )
 # 14940 "parser_cocci_menhir.ml"
          in
@@ -14965,20 +14965,20 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _3 : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
 # 14971 "parser_cocci_menhir.ml"
         ) = Obj.magic _3 in
         let t : 'tv_midzero_list_fun_after_stm_fun_after_dots_or_ = Obj.magic t in
         let _1 : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
 # 14977 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_decl_statement_expr = 
-# 1449 "parser_cocci_menhir.mly"
+# 1476 "parser_cocci_menhir.mly"
       ( let (mids,code) = t in
        if List.for_all (function [] -> true | _ -> false) code
       then []
@@ -15011,7 +15011,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let pv : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
 # 15017 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
@@ -15019,7 +15019,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_t_ in
         let _endpos = _endpos_pv_ in
         let _v : 'tv_decl_var = 
-# 1213 "parser_cocci_menhir.mly"
+# 1239 "parser_cocci_menhir.mly"
       ( [Ast0.wrap(Ast0.TyDecl(t,P.clt2mcode ";" pv))] )
 # 15025 "parser_cocci_menhir.ml"
          in
@@ -15040,14 +15040,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 135 "parser_cocci_menhir.mly"
+# 161 "parser_cocci_menhir.mly"
        (Parse_aux.info)
 # 15046 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_decl_var = 
-# 1214 "parser_cocci_menhir.mly"
+# 1240 "parser_cocci_menhir.mly"
               ( [P.meta_decl _1] )
 # 15053 "parser_cocci_menhir.ml"
          in
@@ -15078,7 +15078,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let pv : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
 # 15084 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
@@ -15094,7 +15094,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 1216 "parser_cocci_menhir.mly"
+# 1242 "parser_cocci_menhir.mly"
       ( List.map
          (function (id,fn) ->
            Ast0.wrap(Ast0.UnInit(s,fn t,id,P.clt2mcode ";" pv)))
@@ -15133,7 +15133,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let pv : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
 # 15139 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
@@ -15151,7 +15151,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 1216 "parser_cocci_menhir.mly"
+# 1242 "parser_cocci_menhir.mly"
       ( List.map
          (function (id,fn) ->
            Ast0.wrap(Ast0.UnInit(s,fn t,id,P.clt2mcode ";" pv)))
@@ -15178,7 +15178,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_f_ in
         let _endpos = _endpos_f_ in
         let _v : 'tv_decl_var = 
-# 1220 "parser_cocci_menhir.mly"
+# 1246 "parser_cocci_menhir.mly"
                ( [f] )
 # 15184 "parser_cocci_menhir.ml"
          in
@@ -15219,13 +15219,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let pv : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
 # 15225 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let e : 'tv_initialize = Obj.magic e in
         let q : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
 # 15231 "parser_cocci_menhir.ml"
         ) = Obj.magic q in
@@ -15241,7 +15241,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 1222 "parser_cocci_menhir.mly"
+# 1248 "parser_cocci_menhir.mly"
       (let (id,fn) = d in
       [Ast0.wrap(Ast0.Init(s,fn t,id,P.clt2mcode "=" q,e,P.clt2mcode ";" pv))])
 # 15248 "parser_cocci_menhir.ml"
@@ -15288,13 +15288,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let pv : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
 # 15294 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let e : 'tv_initialize = Obj.magic e in
         let q : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
 # 15300 "parser_cocci_menhir.ml"
         ) = Obj.magic q in
@@ -15312,7 +15312,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 1222 "parser_cocci_menhir.mly"
+# 1248 "parser_cocci_menhir.mly"
       (let (id,fn) = d in
       [Ast0.wrap(Ast0.Init(s,fn t,id,P.clt2mcode "=" q,e,P.clt2mcode ";" pv))])
 # 15319 "parser_cocci_menhir.ml"
@@ -15344,7 +15344,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let pv : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
 # 15350 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
@@ -15367,7 +15367,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 1227 "parser_cocci_menhir.mly"
+# 1253 "parser_cocci_menhir.mly"
       ( List.map
          (function (id,fn) ->
            let idtype =
@@ -15408,7 +15408,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let pv : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
 # 15414 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
@@ -15433,7 +15433,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 1227 "parser_cocci_menhir.mly"
+# 1253 "parser_cocci_menhir.mly"
       ( List.map
          (function (id,fn) ->
            let idtype =
@@ -15474,7 +15474,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let pv : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
 # 15480 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
@@ -15499,7 +15499,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 1227 "parser_cocci_menhir.mly"
+# 1253 "parser_cocci_menhir.mly"
       ( List.map
          (function (id,fn) ->
            let idtype =
@@ -15545,7 +15545,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let pv : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
 # 15551 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
@@ -15572,7 +15572,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 1227 "parser_cocci_menhir.mly"
+# 1253 "parser_cocci_menhir.mly"
       ( List.map
          (function (id,fn) ->
            let idtype =
@@ -15618,13 +15618,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let pv : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
 # 15624 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let e : 'tv_initialize = Obj.magic e in
         let q : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
 # 15630 "parser_cocci_menhir.ml"
         ) = Obj.magic q in
@@ -15647,7 +15647,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 1235 "parser_cocci_menhir.mly"
+# 1261 "parser_cocci_menhir.mly"
       ( let (id,fn) = d in
       !Data.add_type_name (P.id2name i);
       let idtype = P.make_cv cv (Ast0.wrap (Ast0.TypeName(P.id2mcode i))) in
@@ -15697,13 +15697,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let pv : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
 # 15703 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let e : 'tv_initialize = Obj.magic e in
         let q : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
 # 15709 "parser_cocci_menhir.ml"
         ) = Obj.magic q in
@@ -15728,7 +15728,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 1235 "parser_cocci_menhir.mly"
+# 1261 "parser_cocci_menhir.mly"
       ( let (id,fn) = d in
       !Data.add_type_name (P.id2name i);
       let idtype = P.make_cv cv (Ast0.wrap (Ast0.TypeName(P.id2mcode i))) in
@@ -15778,13 +15778,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let pv : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
 # 15784 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let e : 'tv_initialize = Obj.magic e in
         let q : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
 # 15790 "parser_cocci_menhir.ml"
         ) = Obj.magic q in
@@ -15809,7 +15809,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 1235 "parser_cocci_menhir.mly"
+# 1261 "parser_cocci_menhir.mly"
       ( let (id,fn) = d in
       !Data.add_type_name (P.id2name i);
       let idtype = P.make_cv cv (Ast0.wrap (Ast0.TypeName(P.id2mcode i))) in
@@ -15864,13 +15864,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let pv : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
 # 15870 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let e : 'tv_initialize = Obj.magic e in
         let q : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
 # 15876 "parser_cocci_menhir.ml"
         ) = Obj.magic q in
@@ -15897,7 +15897,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 1235 "parser_cocci_menhir.mly"
+# 1261 "parser_cocci_menhir.mly"
       ( let (id,fn) = d in
       !Data.add_type_name (P.id2name i);
       let idtype = P.make_cv cv (Ast0.wrap (Ast0.TypeName(P.id2mcode i))) in
@@ -15962,34 +15962,34 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let pv : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
 # 15968 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let rp2 : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
 # 15973 "parser_cocci_menhir.ml"
         ) = Obj.magic rp2 in
         let p : 'tv_decl_list_name_opt_decl_ = Obj.magic p in
         let lp2 : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
 # 15979 "parser_cocci_menhir.ml"
         ) = Obj.magic lp2 in
         let rp1 : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
 # 15984 "parser_cocci_menhir.ml"
         ) = Obj.magic rp1 in
         let d : 'tv_d_ident = Obj.magic d in
         let st : (
-# 171 "parser_cocci_menhir.mly"
+# 197 "parser_cocci_menhir.mly"
        (Data.clt)
 # 15990 "parser_cocci_menhir.ml"
         ) = Obj.magic st in
         let lp1 : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
 # 15995 "parser_cocci_menhir.ml"
         ) = Obj.magic lp1 in
@@ -16004,7 +16004,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 1245 "parser_cocci_menhir.mly"
+# 1271 "parser_cocci_menhir.mly"
       ( let (id,fn) = d in
         let t =
          Ast0.wrap
@@ -16076,34 +16076,34 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let pv : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
 # 16082 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let rp2 : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
 # 16087 "parser_cocci_menhir.ml"
         ) = Obj.magic rp2 in
         let p : 'tv_decl_list_name_opt_decl_ = Obj.magic p in
         let lp2 : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
 # 16093 "parser_cocci_menhir.ml"
         ) = Obj.magic lp2 in
         let rp1 : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
 # 16098 "parser_cocci_menhir.ml"
         ) = Obj.magic rp1 in
         let d : 'tv_d_ident = Obj.magic d in
         let st : (
-# 171 "parser_cocci_menhir.mly"
+# 197 "parser_cocci_menhir.mly"
        (Data.clt)
 # 16104 "parser_cocci_menhir.ml"
         ) = Obj.magic st in
         let lp1 : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
 # 16109 "parser_cocci_menhir.ml"
         ) = Obj.magic lp1 in
@@ -16120,7 +16120,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 1245 "parser_cocci_menhir.mly"
+# 1271 "parser_cocci_menhir.mly"
       ( let (id,fn) = d in
         let t =
          Ast0.wrap
@@ -16167,18 +16167,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _5 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
 # 16173 "parser_cocci_menhir.ml"
         ) = Obj.magic _5 in
         let _4 : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
 # 16178 "parser_cocci_menhir.ml"
         ) = Obj.magic _4 in
         let _3 : 'tv_eexpr_list_option = Obj.magic _3 in
         let _2 : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
 # 16184 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -16186,7 +16186,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__5_ in
         let _v : 'tv_decl_var = 
-# 1253 "parser_cocci_menhir.mly"
+# 1279 "parser_cocci_menhir.mly"
       ( [Ast0.wrap(Ast0.MacroDecl(_1,P.clt2mcode "(" _2,_3,
                                  P.clt2mcode ")" _4,P.clt2mcode ";" _5))] )
 # 16193 "parser_cocci_menhir.ml"
@@ -16238,24 +16238,24 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _7 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
 # 16244 "parser_cocci_menhir.ml"
         ) = Obj.magic _7 in
         let e : 'tv_initialize = Obj.magic e in
         let q : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
 # 16250 "parser_cocci_menhir.ml"
         ) = Obj.magic q in
         let _4 : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
 # 16255 "parser_cocci_menhir.ml"
         ) = Obj.magic _4 in
         let _3 : 'tv_eexpr_list_option = Obj.magic _3 in
         let _2 : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
 # 16261 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -16263,7 +16263,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__7_ in
         let _v : 'tv_decl_var = 
-# 1256 "parser_cocci_menhir.mly"
+# 1282 "parser_cocci_menhir.mly"
       ( [Ast0.wrap
            (Ast0.MacroDeclInit
               (_1,P.clt2mcode "(" _2,_3,
@@ -16338,40 +16338,40 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let pv : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
 # 16344 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let e : 'tv_initialize = Obj.magic e in
         let q : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
 # 16350 "parser_cocci_menhir.ml"
         ) = Obj.magic q in
         let rp2 : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
 # 16355 "parser_cocci_menhir.ml"
         ) = Obj.magic rp2 in
         let p : 'tv_decl_list_name_opt_decl_ = Obj.magic p in
         let lp2 : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
 # 16361 "parser_cocci_menhir.ml"
         ) = Obj.magic lp2 in
         let rp1 : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
 # 16366 "parser_cocci_menhir.ml"
         ) = Obj.magic rp1 in
         let d : 'tv_d_ident = Obj.magic d in
         let st : (
-# 171 "parser_cocci_menhir.mly"
+# 197 "parser_cocci_menhir.mly"
        (Data.clt)
 # 16372 "parser_cocci_menhir.ml"
         ) = Obj.magic st in
         let lp1 : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
 # 16377 "parser_cocci_menhir.ml"
         ) = Obj.magic lp1 in
@@ -16386,7 +16386,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 1265 "parser_cocci_menhir.mly"
+# 1291 "parser_cocci_menhir.mly"
       ( let (id,fn) = d in
         let t =
          Ast0.wrap
@@ -16468,40 +16468,40 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let pv : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
 # 16474 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let e : 'tv_initialize = Obj.magic e in
         let q : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
 # 16480 "parser_cocci_menhir.ml"
         ) = Obj.magic q in
         let rp2 : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
 # 16485 "parser_cocci_menhir.ml"
         ) = Obj.magic rp2 in
         let p : 'tv_decl_list_name_opt_decl_ = Obj.magic p in
         let lp2 : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
 # 16491 "parser_cocci_menhir.ml"
         ) = Obj.magic lp2 in
         let rp1 : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
 # 16496 "parser_cocci_menhir.ml"
         ) = Obj.magic rp1 in
         let d : 'tv_d_ident = Obj.magic d in
         let st : (
-# 171 "parser_cocci_menhir.mly"
+# 197 "parser_cocci_menhir.mly"
        (Data.clt)
 # 16502 "parser_cocci_menhir.ml"
         ) = Obj.magic st in
         let lp1 : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
 # 16507 "parser_cocci_menhir.ml"
         ) = Obj.magic lp1 in
@@ -16518,7 +16518,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 1265 "parser_cocci_menhir.mly"
+# 1291 "parser_cocci_menhir.mly"
       ( let (id,fn) = d in
         let t =
          Ast0.wrap
@@ -16560,21 +16560,21 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let pv : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
 # 16566 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let id : 'tv_comma_list_typedef_ident_ = Obj.magic id in
         let t : 'tv_typedef_ctype = Obj.magic t in
         let s : (
-# 121 "parser_cocci_menhir.mly"
+# 147 "parser_cocci_menhir.mly"
       (Data.clt)
 # 16573 "parser_cocci_menhir.ml"
         ) = Obj.magic s in
         let _startpos = _startpos_s_ in
         let _endpos = _endpos_pv_ in
         let _v : 'tv_decl_var = 
-# 1273 "parser_cocci_menhir.mly"
+# 1299 "parser_cocci_menhir.mly"
       ( let s = P.clt2mcode "typedef" s in
         List.map
          (function id ->
@@ -16602,7 +16602,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_define_param_list_option = 
-# 993 "parser_cocci_menhir.mly"
+# 1019 "parser_cocci_menhir.mly"
       ( Ast0.wrap
          (Ast0.DOTS
             (_1
@@ -16627,14 +16627,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 153 "parser_cocci_menhir.mly"
+# 179 "parser_cocci_menhir.mly"
        (Data.clt * token)
 # 16633 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_defineop = 
-# 937 "parser_cocci_menhir.mly"
+# 963 "parser_cocci_menhir.mly"
     ( let (clt,ident) = _1 in
       let aft = P.get_aft clt in (* move stuff after the define to the ident *)
       function body ->
@@ -16687,20 +16687,20 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _3 : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
 # 16693 "parser_cocci_menhir.ml"
         ) = Obj.magic _3 in
         let _2 : 'tv_define_param_list_option = Obj.magic _2 in
         let _1 : (
-# 154 "parser_cocci_menhir.mly"
+# 180 "parser_cocci_menhir.mly"
        (Data.clt * token * int * int)
 # 16699 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_defineop = 
-# 961 "parser_cocci_menhir.mly"
+# 987 "parser_cocci_menhir.mly"
     ( let (clt,ident,parenoff,parencol) = _1 in
       let aft = P.get_aft clt in (* move stuff after the define to the ( *)
       (* clt is the start of the #define itself *)
@@ -16745,14 +16745,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 114 "parser_cocci_menhir.mly"
+# 140 "parser_cocci_menhir.mly"
       (string)
 # 16751 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_dep = 
-# 299 "parser_cocci_menhir.mly"
+# 325 "parser_cocci_menhir.mly"
                    ( Ast0.Dep _1 )
 # 16758 "parser_cocci_menhir.ml"
          in
@@ -16777,14 +16777,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _2 : (
-# 114 "parser_cocci_menhir.mly"
+# 140 "parser_cocci_menhir.mly"
       (string)
 # 16783 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_dep = 
-# 300 "parser_cocci_menhir.mly"
+# 326 "parser_cocci_menhir.mly"
                    ( Ast0.AntiDep (Ast0.Dep _2) )
 # 16790 "parser_cocci_menhir.ml"
          in
@@ -16820,7 +16820,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__4_ in
         let _v : 'tv_dep = 
-# 302 "parser_cocci_menhir.mly"
+# 328 "parser_cocci_menhir.mly"
                    ( Ast0.AntiDep _3 )
 # 16826 "parser_cocci_menhir.ml"
          in
@@ -16845,14 +16845,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _2 : (
-# 114 "parser_cocci_menhir.mly"
+# 140 "parser_cocci_menhir.mly"
       (string)
 # 16851 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_dep = 
-# 303 "parser_cocci_menhir.mly"
+# 329 "parser_cocci_menhir.mly"
                    ( Ast0.EverDep _2 )
 # 16858 "parser_cocci_menhir.ml"
          in
@@ -16877,14 +16877,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _2 : (
-# 114 "parser_cocci_menhir.mly"
+# 140 "parser_cocci_menhir.mly"
       (string)
 # 16883 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_dep = 
-# 304 "parser_cocci_menhir.mly"
+# 330 "parser_cocci_menhir.mly"
                    ( Ast0.NeverDep _2 )
 # 16890 "parser_cocci_menhir.ml"
          in
@@ -16918,7 +16918,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_dep = 
-# 305 "parser_cocci_menhir.mly"
+# 331 "parser_cocci_menhir.mly"
                    ( Ast0.AndDep(_1, _3) )
 # 16924 "parser_cocci_menhir.ml"
          in
@@ -16952,7 +16952,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_dep = 
-# 306 "parser_cocci_menhir.mly"
+# 332 "parser_cocci_menhir.mly"
                    ( Ast0.OrDep (_1, _3) )
 # 16958 "parser_cocci_menhir.ml"
          in
@@ -16984,7 +16984,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_dep = 
-# 307 "parser_cocci_menhir.mly"
+# 333 "parser_cocci_menhir.mly"
                    ( _2 )
 # 16990 "parser_cocci_menhir.ml"
          in
@@ -17001,7 +17001,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in
         let _endpos = _startpos in
         let _v : 'tv_depends = 
-# 295 "parser_cocci_menhir.mly"
+# 321 "parser_cocci_menhir.mly"
                            ( Ast0.NoDep )
 # 17007 "parser_cocci_menhir.ml"
          in
@@ -17033,7 +17033,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos_parents_ in
         let _v : 'tv_depends = 
-# 296 "parser_cocci_menhir.mly"
+# 322 "parser_cocci_menhir.mly"
                            ( parents )
 # 17039 "parser_cocci_menhir.ml"
          in
@@ -17060,14 +17060,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _2 : 'tv_disj_ident = Obj.magic _2 in
         let _1 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
 # 17066 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_designator = 
-# 1388 "parser_cocci_menhir.mly"
+# 1415 "parser_cocci_menhir.mly"
      ( Ast0.DesignatorField (P.clt2mcode "." _1,_2) )
 # 17073 "parser_cocci_menhir.ml"
          in
@@ -17098,20 +17098,20 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _3 : (
-# 174 "parser_cocci_menhir.mly"
+# 200 "parser_cocci_menhir.mly"
        (Data.clt)
 # 17104 "parser_cocci_menhir.ml"
         ) = Obj.magic _3 in
         let _2 : 'tv_eexpr = Obj.magic _2 in
         let _1 : (
-# 174 "parser_cocci_menhir.mly"
+# 200 "parser_cocci_menhir.mly"
        (Data.clt)
 # 17110 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_designator = 
-# 1390 "parser_cocci_menhir.mly"
+# 1417 "parser_cocci_menhir.mly"
      ( Ast0.DesignatorIndex (P.clt2mcode "[" _1,_2,P.clt2mcode "]" _3) )
 # 17117 "parser_cocci_menhir.ml"
          in
@@ -17152,26 +17152,26 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _5 : (
-# 174 "parser_cocci_menhir.mly"
+# 200 "parser_cocci_menhir.mly"
        (Data.clt)
 # 17158 "parser_cocci_menhir.ml"
         ) = Obj.magic _5 in
         let _4 : 'tv_eexpr = Obj.magic _4 in
         let _3 : (
-# 145 "parser_cocci_menhir.mly"
+# 171 "parser_cocci_menhir.mly"
        (Data.clt)
 # 17164 "parser_cocci_menhir.ml"
         ) = Obj.magic _3 in
         let _2 : 'tv_eexpr = Obj.magic _2 in
         let _1 : (
-# 174 "parser_cocci_menhir.mly"
+# 200 "parser_cocci_menhir.mly"
        (Data.clt)
 # 17170 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__5_ in
         let _v : 'tv_designator = 
-# 1392 "parser_cocci_menhir.mly"
+# 1419 "parser_cocci_menhir.mly"
      ( Ast0.DesignatorRange (P.clt2mcode "[" _1,_2,P.clt2mcode "..." _3,
                             _4,P.clt2mcode "]" _5) )
 # 17178 "parser_cocci_menhir.ml"
@@ -17196,7 +17196,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_dexpr = 
-# 1475 "parser_cocci_menhir.mly"
+# 1502 "parser_cocci_menhir.mly"
                                               ( _1 )
 # 17202 "parser_cocci_menhir.ml"
          in
@@ -17224,7 +17224,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_disable = 
-# 313 "parser_cocci_menhir.mly"
+# 339 "parser_cocci_menhir.mly"
                                                       ( List.map P.id2name _2 )
 # 17230 "parser_cocci_menhir.ml"
          in
@@ -17248,7 +17248,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_disj_ident = 
-# 2033 "parser_cocci_menhir.mly"
+# 2070 "parser_cocci_menhir.mly"
               ( _1 )
 # 17254 "parser_cocci_menhir.ml"
          in
@@ -17279,20 +17279,20 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let rp : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
 # 17285 "parser_cocci_menhir.ml"
         ) = Obj.magic rp in
         let t : 'tv_midzero_list_disj_ident_disj_ident_ = Obj.magic t in
         let lp : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
 # 17291 "parser_cocci_menhir.ml"
         ) = Obj.magic lp in
         let _startpos = _startpos_lp_ in
         let _endpos = _endpos_rp_ in
         let _v : 'tv_disj_ident = 
-# 2035 "parser_cocci_menhir.mly"
+# 2072 "parser_cocci_menhir.mly"
   ( let (mids,code) = t in
         Ast0.wrap
           (Ast0.DisjId(P.clt2mcode "(" lp,code,mids, P.clt2mcode ")" rp)) )
@@ -17315,14 +17315,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 145 "parser_cocci_menhir.mly"
+# 171 "parser_cocci_menhir.mly"
        (Data.clt)
 # 17321 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_dot_expressions = 
-# 1485 "parser_cocci_menhir.mly"
+# 1512 "parser_cocci_menhir.mly"
             ( Ast0.wrap(Ast0.Edots(P.clt2mcode "..." _1,None)) )
 # 17328 "parser_cocci_menhir.ml"
          in
@@ -17346,7 +17346,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_dot_expressions = 
-# 1486 "parser_cocci_menhir.mly"
+# 1513 "parser_cocci_menhir.mly"
                    ( _1 )
 # 17352 "parser_cocci_menhir.ml"
          in
@@ -17370,7 +17370,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_dparam = 
-# 989 "parser_cocci_menhir.mly"
+# 1015 "parser_cocci_menhir.mly"
                ( Ast0.wrap(Ast0.DParam _1) )
 # 17376 "parser_cocci_menhir.ml"
          in
@@ -17394,7 +17394,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_eargexpr = 
-# 1473 "parser_cocci_menhir.mly"
+# 1500 "parser_cocci_menhir.mly"
                                             ( _1 )
 # 17400 "parser_cocci_menhir.ml"
          in
@@ -17415,14 +17415,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let d : (
-# 145 "parser_cocci_menhir.mly"
+# 171 "parser_cocci_menhir.mly"
        (Data.clt)
 # 17421 "parser_cocci_menhir.ml"
         ) = Obj.magic d in
         let _startpos = _startpos_d_ in
         let _endpos = _endpos_d_ in
         let _v : 'tv_edots_when_TEllipsis_eexpr_ = 
-# 2355 "parser_cocci_menhir.mly"
+# 2392 "parser_cocci_menhir.mly"
                                                   ( (d,None) )
 # 17428 "parser_cocci_menhir.ml"
          in
@@ -17461,14 +17461,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let w : 'tv_eexpr = Obj.magic w in
         let d : (
-# 145 "parser_cocci_menhir.mly"
+# 171 "parser_cocci_menhir.mly"
        (Data.clt)
 # 17467 "parser_cocci_menhir.ml"
         ) = Obj.magic d in
         let _startpos = _startpos_d_ in
         let _endpos = _endpos__5_ in
         let _v : 'tv_edots_when_TEllipsis_eexpr_ = 
-# 2356 "parser_cocci_menhir.mly"
+# 2393 "parser_cocci_menhir.mly"
                                                   ( (d,Some w) )
 # 17474 "parser_cocci_menhir.ml"
          in
@@ -17489,14 +17489,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let d : (
-# 145 "parser_cocci_menhir.mly"
+# 171 "parser_cocci_menhir.mly"
        (Data.clt)
 # 17495 "parser_cocci_menhir.ml"
         ) = Obj.magic d in
         let _startpos = _startpos_d_ in
         let _endpos = _endpos_d_ in
         let _v : 'tv_edots_when_TEllipsis_enum_decl_one_ = 
-# 2355 "parser_cocci_menhir.mly"
+# 2392 "parser_cocci_menhir.mly"
                                                   ( (d,None) )
 # 17502 "parser_cocci_menhir.ml"
          in
@@ -17535,14 +17535,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let w : 'tv_enum_decl_one = Obj.magic w in
         let d : (
-# 145 "parser_cocci_menhir.mly"
+# 171 "parser_cocci_menhir.mly"
        (Data.clt)
 # 17541 "parser_cocci_menhir.ml"
         ) = Obj.magic d in
         let _startpos = _startpos_d_ in
         let _endpos = _endpos__5_ in
         let _v : 'tv_edots_when_TEllipsis_enum_decl_one_ = 
-# 2356 "parser_cocci_menhir.mly"
+# 2393 "parser_cocci_menhir.mly"
                                                   ( (d,Some w) )
 # 17548 "parser_cocci_menhir.ml"
          in
@@ -17563,14 +17563,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let d : (
-# 145 "parser_cocci_menhir.mly"
+# 171 "parser_cocci_menhir.mly"
        (Data.clt)
 # 17569 "parser_cocci_menhir.ml"
         ) = Obj.magic d in
         let _startpos = _startpos_d_ in
         let _endpos = _endpos_d_ in
         let _v : 'tv_edots_when_TEllipsis_initialize_ = 
-# 2355 "parser_cocci_menhir.mly"
+# 2392 "parser_cocci_menhir.mly"
                                                   ( (d,None) )
 # 17576 "parser_cocci_menhir.ml"
          in
@@ -17609,14 +17609,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let w : 'tv_initialize = Obj.magic w in
         let d : (
-# 145 "parser_cocci_menhir.mly"
+# 171 "parser_cocci_menhir.mly"
        (Data.clt)
 # 17615 "parser_cocci_menhir.ml"
         ) = Obj.magic d in
         let _startpos = _startpos_d_ in
         let _endpos = _endpos__5_ in
         let _v : 'tv_edots_when_TEllipsis_initialize_ = 
-# 2356 "parser_cocci_menhir.mly"
+# 2393 "parser_cocci_menhir.mly"
                                                   ( (d,Some w) )
 # 17622 "parser_cocci_menhir.ml"
          in
@@ -17637,14 +17637,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let d : (
-# 145 "parser_cocci_menhir.mly"
+# 171 "parser_cocci_menhir.mly"
        (Data.clt)
 # 17643 "parser_cocci_menhir.ml"
         ) = Obj.magic d in
         let _startpos = _startpos_d_ in
         let _endpos = _endpos_d_ in
         let _v : 'tv_edots_when_TEllipsis_struct_decl_one_ = 
-# 2355 "parser_cocci_menhir.mly"
+# 2392 "parser_cocci_menhir.mly"
                                                   ( (d,None) )
 # 17650 "parser_cocci_menhir.ml"
          in
@@ -17683,14 +17683,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let w : 'tv_struct_decl_one = Obj.magic w in
         let d : (
-# 145 "parser_cocci_menhir.mly"
+# 171 "parser_cocci_menhir.mly"
        (Data.clt)
 # 17689 "parser_cocci_menhir.ml"
         ) = Obj.magic d in
         let _startpos = _startpos_d_ in
         let _endpos = _endpos__5_ in
         let _v : 'tv_edots_when_TEllipsis_struct_decl_one_ = 
-# 2356 "parser_cocci_menhir.mly"
+# 2393 "parser_cocci_menhir.mly"
                                                   ( (d,Some w) )
 # 17696 "parser_cocci_menhir.ml"
          in
@@ -17714,7 +17714,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_eexpr = 
-# 1472 "parser_cocci_menhir.mly"
+# 1499 "parser_cocci_menhir.mly"
                                              ( _1 )
 # 17720 "parser_cocci_menhir.ml"
          in
@@ -17738,7 +17738,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_eexpr_list_option = 
-# 2335 "parser_cocci_menhir.mly"
+# 2372 "parser_cocci_menhir.mly"
       ( Ast0.wrap
          (Ast0.DOTS
             (_1
@@ -17759,7 +17759,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in
         let _endpos = _startpos in
         let _v : 'tv_empty_list_start_aexpr_TEllipsis_ = 
-# 2097 "parser_cocci_menhir.mly"
+# 2134 "parser_cocci_menhir.mly"
               ( fun build_dots build_comma -> [] )
 # 17765 "parser_cocci_menhir.ml"
          in
@@ -17783,7 +17783,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_empty_list_start_aexpr_TEllipsis_ = 
-# 2098 "parser_cocci_menhir.mly"
+# 2135 "parser_cocci_menhir.mly"
                                    ( _1 )
 # 17789 "parser_cocci_menhir.ml"
          in
@@ -17800,7 +17800,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in
         let _endpos = _startpos in
         let _v : 'tv_empty_list_start_dparam_TEllipsis_ = 
-# 2097 "parser_cocci_menhir.mly"
+# 2134 "parser_cocci_menhir.mly"
               ( fun build_dots build_comma -> [] )
 # 17806 "parser_cocci_menhir.ml"
          in
@@ -17824,7 +17824,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_empty_list_start_dparam_TEllipsis_ = 
-# 2098 "parser_cocci_menhir.mly"
+# 2135 "parser_cocci_menhir.mly"
                                    ( _1 )
 # 17830 "parser_cocci_menhir.ml"
          in
@@ -17841,7 +17841,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in
         let _endpos = _startpos in
         let _v : 'tv_empty_list_start_initialize2_edots_when_TEllipsis_initialize__ = 
-# 2097 "parser_cocci_menhir.mly"
+# 2134 "parser_cocci_menhir.mly"
               ( fun build_dots build_comma -> [] )
 # 17847 "parser_cocci_menhir.ml"
          in
@@ -17865,7 +17865,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_empty_list_start_initialize2_edots_when_TEllipsis_initialize__ = 
-# 2098 "parser_cocci_menhir.mly"
+# 2135 "parser_cocci_menhir.mly"
                                    ( _1 )
 # 17871 "parser_cocci_menhir.ml"
          in
@@ -17882,7 +17882,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in
         let _endpos = _startpos in
         let _v : 'tv_empty_list_start_one_dec_decl__TEllipsis_ = 
-# 2097 "parser_cocci_menhir.mly"
+# 2134 "parser_cocci_menhir.mly"
               ( fun build_dots build_comma -> [] )
 # 17888 "parser_cocci_menhir.ml"
          in
@@ -17906,7 +17906,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_empty_list_start_one_dec_decl__TEllipsis_ = 
-# 2098 "parser_cocci_menhir.mly"
+# 2135 "parser_cocci_menhir.mly"
                                    ( _1 )
 # 17912 "parser_cocci_menhir.ml"
          in
@@ -17923,7 +17923,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in
         let _endpos = _startpos in
         let _v : 'tv_empty_list_start_one_dec_name_opt_decl__TEllipsis_ = 
-# 2097 "parser_cocci_menhir.mly"
+# 2134 "parser_cocci_menhir.mly"
               ( fun build_dots build_comma -> [] )
 # 17929 "parser_cocci_menhir.ml"
          in
@@ -17947,7 +17947,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_empty_list_start_one_dec_name_opt_decl__TEllipsis_ = 
-# 2098 "parser_cocci_menhir.mly"
+# 2135 "parser_cocci_menhir.mly"
                                    ( _1 )
 # 17953 "parser_cocci_menhir.ml"
          in
@@ -17971,7 +17971,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_enum_decl_list = 
-# 835 "parser_cocci_menhir.mly"
+# 861 "parser_cocci_menhir.mly"
      ( Ast0.wrap(Ast0.DOTS(_1 P.mkedots (fun c -> Ast0.EComma c))) )
 # 17977 "parser_cocci_menhir.ml"
          in
@@ -17995,7 +17995,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_enum_decl_one = 
-# 806 "parser_cocci_menhir.mly"
+# 832 "parser_cocci_menhir.mly"
                     ( Ast0.wrap(Ast0.Ident(_1)) )
 # 18001 "parser_cocci_menhir.ml"
          in
@@ -18027,7 +18027,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_enum_val = Obj.magic _3 in
         let _2 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
 # 18033 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
@@ -18035,7 +18035,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_enum_decl_one = 
-# 808 "parser_cocci_menhir.mly"
+# 834 "parser_cocci_menhir.mly"
  ( let id = Ast0.wrap(Ast0.Ident(_1)) in
        Ast0.wrap
          (Ast0.Assignment
@@ -18063,7 +18063,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_enum_val = 
-# 815 "parser_cocci_menhir.mly"
+# 841 "parser_cocci_menhir.mly"
             ( Ast0.wrap(Ast0.Ident(_1)) )
 # 18069 "parser_cocci_menhir.ml"
          in
@@ -18084,14 +18084,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 159 "parser_cocci_menhir.mly"
+# 185 "parser_cocci_menhir.mly"
        (string * Data.clt)
 # 18090 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_enum_val = 
-# 817 "parser_cocci_menhir.mly"
+# 843 "parser_cocci_menhir.mly"
      ( let (x,clt) = _1 in
      Ast0.wrap(Ast0.Constant (P.clt2mcode (Ast.Int x) clt)) )
 # 18098 "parser_cocci_menhir.ml"
@@ -18113,14 +18113,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 135 "parser_cocci_menhir.mly"
+# 161 "parser_cocci_menhir.mly"
        (Parse_aux.info)
 # 18119 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_enum_val = 
-# 819 "parser_cocci_menhir.mly"
+# 845 "parser_cocci_menhir.mly"
          ( tmeta_to_exp _1 )
 # 18126 "parser_cocci_menhir.ml"
          in
@@ -18141,14 +18141,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 138 "parser_cocci_menhir.mly"
+# 164 "parser_cocci_menhir.mly"
        (Parse_aux.typed_expinfo)
 # 18147 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_enum_val = 
-# 821 "parser_cocci_menhir.mly"
+# 847 "parser_cocci_menhir.mly"
      ( let (nm,constraints,pure,ty,clt) = _1 in
      Ast0.wrap
        (Ast0.MetaExpr(P.clt2mcode nm clt,constraints,ty,Ast.CONST,pure)) )
@@ -18171,14 +18171,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 138 "parser_cocci_menhir.mly"
+# 164 "parser_cocci_menhir.mly"
        (Parse_aux.typed_expinfo)
 # 18177 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_enum_val = 
-# 825 "parser_cocci_menhir.mly"
+# 851 "parser_cocci_menhir.mly"
      ( let (nm,constraints,pure,ty,clt) = _1 in
      Ast0.wrap
        (Ast0.MetaExpr(P.clt2mcode nm clt,constraints,ty,Ast.ANY,pure)) )
@@ -18201,14 +18201,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 138 "parser_cocci_menhir.mly"
+# 164 "parser_cocci_menhir.mly"
        (Parse_aux.typed_expinfo)
 # 18207 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_enum_val = 
-# 829 "parser_cocci_menhir.mly"
+# 855 "parser_cocci_menhir.mly"
      ( let (nm,constraints,pure,ty,clt) = _1 in
      Ast0.wrap
        (Ast0.MetaExpr(P.clt2mcode nm clt,constraints,ty,Ast.ID,pure)) )
@@ -18232,7 +18232,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_exists = 
-# 316 "parser_cocci_menhir.mly"
+# 342 "parser_cocci_menhir.mly"
           ( Ast.Exists )
 # 18238 "parser_cocci_menhir.ml"
          in
@@ -18254,7 +18254,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_exists = 
-# 317 "parser_cocci_menhir.mly"
+# 343 "parser_cocci_menhir.mly"
           ( Ast.Forall )
 # 18260 "parser_cocci_menhir.ml"
          in
@@ -18271,7 +18271,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in
         let _endpos = _startpos in
         let _v : 'tv_exists = 
-# 318 "parser_cocci_menhir.mly"
+# 344 "parser_cocci_menhir.mly"
           ( Ast.Undetermined )
 # 18277 "parser_cocci_menhir.ml"
          in
@@ -18295,7 +18295,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_expr = 
-# 1470 "parser_cocci_menhir.mly"
+# 1497 "parser_cocci_menhir.mly"
                                 ( _1 )
 # 18301 "parser_cocci_menhir.ml"
          in
@@ -18319,7 +18319,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_r_ in
         let _endpos = _endpos_r_ in
         let _v : 'tv_expr_dots_TEllipsis_ = 
-# 1733 "parser_cocci_menhir.mly"
+# 1770 "parser_cocci_menhir.mly"
                                                        ( r )
 # 18325 "parser_cocci_menhir.ml"
          in
@@ -18343,7 +18343,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_m_ in
         let _endpos = _endpos_m_ in
         let _v : 'tv_expression_type = 
-# 577 "parser_cocci_menhir.mly"
+# 603 "parser_cocci_menhir.mly"
                         ( P.ty_pointerify Type_cocci.Unknown m )
 # 18349 "parser_cocci_menhir.ml"
          in
@@ -18371,7 +18371,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos_m_ in
         let _v : 'tv_expression_type = 
-# 579 "parser_cocci_menhir.mly"
+# 605 "parser_cocci_menhir.mly"
     ( P.ty_pointerify (Type_cocci.EnumName Type_cocci.NoName) m )
 # 18377 "parser_cocci_menhir.ml"
          in
@@ -18399,7 +18399,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos_m_ in
         let _v : 'tv_expression_type = 
-# 581 "parser_cocci_menhir.mly"
+# 607 "parser_cocci_menhir.mly"
     ( P.ty_pointerify
        (Type_cocci.StructUnionName (Type_cocci.Struct,Type_cocci.NoName)) m )
 # 18406 "parser_cocci_menhir.ml"
@@ -18428,7 +18428,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos_m_ in
         let _v : 'tv_expression_type = 
-# 584 "parser_cocci_menhir.mly"
+# 610 "parser_cocci_menhir.mly"
     ( P.ty_pointerify
        (Type_cocci.StructUnionName (Type_cocci.Union,Type_cocci.NoName)) m )
 # 18435 "parser_cocci_menhir.ml"
@@ -18446,7 +18446,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in
         let _endpos = _startpos in
         let _v : 'tv_extends = 
-# 290 "parser_cocci_menhir.mly"
+# 316 "parser_cocci_menhir.mly"
                                                   ( () )
 # 18452 "parser_cocci_menhir.ml"
          in
@@ -18471,14 +18471,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let parent : (
-# 114 "parser_cocci_menhir.mly"
+# 140 "parser_cocci_menhir.mly"
       (string)
 # 18477 "parser_cocci_menhir.ml"
         ) = Obj.magic parent in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos_parent_ in
         let _v : 'tv_extends = 
-# 292 "parser_cocci_menhir.mly"
+# 318 "parser_cocci_menhir.mly"
     ( !Data.install_bindings (parent) )
 # 18484 "parser_cocci_menhir.ml"
          in
@@ -18504,19 +18504,19 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _2 : (
-# 155 "parser_cocci_menhir.mly"
+# 181 "parser_cocci_menhir.mly"
        (string * Data.clt)
 # 18510 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : (
-# 155 "parser_cocci_menhir.mly"
+# 181 "parser_cocci_menhir.mly"
        (string * Data.clt)
 # 18515 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_filespec = 
-# 872 "parser_cocci_menhir.mly"
+# 898 "parser_cocci_menhir.mly"
     ( [Ast0.wrap
          (Ast0.FILEINFO(P.id2mcode _1,
                         P.id2mcode _2))] )
@@ -18542,7 +18542,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_fn_ident = 
-# 2008 "parser_cocci_menhir.mly"
+# 2045 "parser_cocci_menhir.mly"
                      ( _1 )
 # 18548 "parser_cocci_menhir.ml"
          in
@@ -18563,14 +18563,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 131 "parser_cocci_menhir.mly"
+# 157 "parser_cocci_menhir.mly"
        (Parse_aux.idinfo)
 # 18569 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_fn_ident = 
-# 2010 "parser_cocci_menhir.mly"
+# 2047 "parser_cocci_menhir.mly"
          ( let (nm,constraints,pure,clt) = _1 in
         Ast0.wrap(Ast0.MetaFunc(P.clt2mcode nm clt,constraints,pure)) )
 # 18577 "parser_cocci_menhir.ml"
@@ -18592,14 +18592,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 131 "parser_cocci_menhir.mly"
+# 157 "parser_cocci_menhir.mly"
        (Parse_aux.idinfo)
 # 18598 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_fn_ident = 
-# 2013 "parser_cocci_menhir.mly"
+# 2050 "parser_cocci_menhir.mly"
   ( let (nm,constraints,pure,clt) = _1 in
         Ast0.wrap
           (Ast0.MetaLocalFunc(P.clt2mcode nm clt,constraints,pure)) )
@@ -18618,7 +18618,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in
         let _endpos = _startpos in
         let _v : 'tv_fninfo = 
-# 1025 "parser_cocci_menhir.mly"
+# 1051 "parser_cocci_menhir.mly"
                 ( [] )
 # 18624 "parser_cocci_menhir.ml"
          in
@@ -18648,7 +18648,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_fninfo = 
-# 1027 "parser_cocci_menhir.mly"
+# 1053 "parser_cocci_menhir.mly"
       ( try
        let _ =
          List.find (function Ast0.FStorage(_) -> true | _ -> false) _2 in
@@ -18682,7 +18682,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_t_ in
         let _endpos = _endpos_r_ in
         let _v : 'tv_fninfo = 
-# 1032 "parser_cocci_menhir.mly"
+# 1058 "parser_cocci_menhir.mly"
                         ( (Ast0.FType(t))::r )
 # 18688 "parser_cocci_menhir.ml"
          in
@@ -18709,14 +18709,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _2 : 'tv_fninfo = Obj.magic _2 in
         let _1 : (
-# 121 "parser_cocci_menhir.mly"
+# 147 "parser_cocci_menhir.mly"
       (Data.clt)
 # 18715 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_fninfo = 
-# 1034 "parser_cocci_menhir.mly"
+# 1060 "parser_cocci_menhir.mly"
       ( try
        let _ = List.find (function Ast0.FInline(_) -> true | _ -> false) _2 in
        raise (Semantic_cocci.Semantic "duplicate inline")
@@ -18746,14 +18746,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _2 : 'tv_fninfo = Obj.magic _2 in
         let _1 : (
-# 123 "parser_cocci_menhir.mly"
+# 149 "parser_cocci_menhir.mly"
       (string * Data.clt)
 # 18752 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_fninfo = 
-# 1039 "parser_cocci_menhir.mly"
+# 1065 "parser_cocci_menhir.mly"
       ( try
        let _ = List.find (function Ast0.FAttr(_) -> true | _ -> false) _2 in
        raise (Semantic_cocci.Semantic "multiple attributes")
@@ -18773,7 +18773,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in
         let _endpos = _startpos in
         let _v : 'tv_fninfo_nt = 
-# 1045 "parser_cocci_menhir.mly"
+# 1071 "parser_cocci_menhir.mly"
                 ( [] )
 # 18779 "parser_cocci_menhir.ml"
          in
@@ -18803,7 +18803,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_fninfo_nt = 
-# 1047 "parser_cocci_menhir.mly"
+# 1073 "parser_cocci_menhir.mly"
       ( try
        let _ =
          List.find (function Ast0.FStorage(_) -> true | _ -> false) _2 in
@@ -18834,14 +18834,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _2 : 'tv_fninfo_nt = Obj.magic _2 in
         let _1 : (
-# 121 "parser_cocci_menhir.mly"
+# 147 "parser_cocci_menhir.mly"
       (Data.clt)
 # 18840 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_fninfo_nt = 
-# 1053 "parser_cocci_menhir.mly"
+# 1079 "parser_cocci_menhir.mly"
       ( try
        let _ = List.find (function Ast0.FInline(_) -> true | _ -> false) _2 in
        raise (Semantic_cocci.Semantic "duplicate inline")
@@ -18871,14 +18871,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _2 : 'tv_fninfo_nt = Obj.magic _2 in
         let _1 : (
-# 123 "parser_cocci_menhir.mly"
+# 149 "parser_cocci_menhir.mly"
       (string * Data.clt)
 # 18877 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_fninfo_nt = 
-# 1058 "parser_cocci_menhir.mly"
+# 1084 "parser_cocci_menhir.mly"
       ( try
        let _ = List.find (function Ast0.FAttr(_) -> true | _ -> false) _2 in
        raise (Semantic_cocci.Semantic "duplicate init")
@@ -18898,7 +18898,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in
         let _endpos = _startpos in
         let _v : 'tv_fun_after_dots = 
-# 2268 "parser_cocci_menhir.mly"
+# 2305 "parser_cocci_menhir.mly"
                                ([])
 # 18904 "parser_cocci_menhir.ml"
          in
@@ -18926,7 +18926,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_fun_after_dots = 
-# 2269 "parser_cocci_menhir.mly"
+# 2306 "parser_cocci_menhir.mly"
                                (_2)
 # 18932 "parser_cocci_menhir.ml"
          in
@@ -18956,7 +18956,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_fun_after_dots = 
-# 2270 "parser_cocci_menhir.mly"
+# 2307 "parser_cocci_menhir.mly"
                                (Ast0.wrap(Ast0.Exp(_1))::_2)
 # 18962 "parser_cocci_menhir.ml"
          in
@@ -18986,7 +18986,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_fun_after_dots = 
-# 2271 "parser_cocci_menhir.mly"
+# 2308 "parser_cocci_menhir.mly"
                                     (_1@_2)
 # 18992 "parser_cocci_menhir.ml"
          in
@@ -19003,7 +19003,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in
         let _endpos = _startpos in
         let _v : 'tv_fun_after_dots_or = 
-# 2278 "parser_cocci_menhir.mly"
+# 2315 "parser_cocci_menhir.mly"
                                ([])
 # 19009 "parser_cocci_menhir.ml"
          in
@@ -19031,7 +19031,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_fun_after_dots_or = 
-# 2279 "parser_cocci_menhir.mly"
+# 2316 "parser_cocci_menhir.mly"
                                (_2)
 # 19037 "parser_cocci_menhir.ml"
          in
@@ -19061,7 +19061,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_fun_after_dots_or = 
-# 2280 "parser_cocci_menhir.mly"
+# 2317 "parser_cocci_menhir.mly"
                                (Ast0.wrap(Ast0.Exp(_1))::_2)
 # 19067 "parser_cocci_menhir.ml"
          in
@@ -19091,7 +19091,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_fun_after_dots_or = 
-# 2281 "parser_cocci_menhir.mly"
+# 2318 "parser_cocci_menhir.mly"
                                     (_1@_2)
 # 19097 "parser_cocci_menhir.ml"
          in
@@ -19121,7 +19121,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_fun_after_exp = 
-# 2274 "parser_cocci_menhir.mly"
+# 2311 "parser_cocci_menhir.mly"
                                (_1::_2)
 # 19127 "parser_cocci_menhir.ml"
          in
@@ -19138,7 +19138,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in
         let _endpos = _startpos in
         let _v : 'tv_fun_after_exp_or = 
-# 2284 "parser_cocci_menhir.mly"
+# 2321 "parser_cocci_menhir.mly"
                                ([])
 # 19144 "parser_cocci_menhir.ml"
          in
@@ -19168,7 +19168,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_fun_after_exp_or = 
-# 2285 "parser_cocci_menhir.mly"
+# 2322 "parser_cocci_menhir.mly"
                                (_1::_2)
 # 19174 "parser_cocci_menhir.ml"
          in
@@ -19185,7 +19185,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in
         let _endpos = _startpos in
         let _v : 'tv_fun_after_stm = 
-# 2263 "parser_cocci_menhir.mly"
+# 2300 "parser_cocci_menhir.mly"
                                ([])
 # 19191 "parser_cocci_menhir.ml"
          in
@@ -19215,7 +19215,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_fun_after_stm = 
-# 2264 "parser_cocci_menhir.mly"
+# 2301 "parser_cocci_menhir.mly"
                                (_1::_2)
 # 19221 "parser_cocci_menhir.ml"
          in
@@ -19245,7 +19245,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_fun_after_stm = 
-# 2265 "parser_cocci_menhir.mly"
+# 2302 "parser_cocci_menhir.mly"
                                (_1@_2)
 # 19251 "parser_cocci_menhir.ml"
          in
@@ -19269,7 +19269,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_fun_start = 
-# 2260 "parser_cocci_menhir.mly"
+# 2297 "parser_cocci_menhir.mly"
                  ( Ast0.wrap(Ast0.DOTS(_1)) )
 # 19275 "parser_cocci_menhir.ml"
          in
@@ -19293,7 +19293,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_func_ident = 
-# 1999 "parser_cocci_menhir.mly"
+# 2036 "parser_cocci_menhir.mly"
              ( _1 )
 # 19299 "parser_cocci_menhir.ml"
          in
@@ -19314,14 +19314,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 131 "parser_cocci_menhir.mly"
+# 157 "parser_cocci_menhir.mly"
        (Parse_aux.idinfo)
 # 19320 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_func_ident = 
-# 2001 "parser_cocci_menhir.mly"
+# 2038 "parser_cocci_menhir.mly"
          ( let (nm,constraints,pure,clt) = _1 in
         Ast0.wrap(Ast0.MetaFunc(P.clt2mcode nm clt,constraints,pure)) )
 # 19328 "parser_cocci_menhir.ml"
@@ -19343,14 +19343,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 131 "parser_cocci_menhir.mly"
+# 157 "parser_cocci_menhir.mly"
        (Parse_aux.idinfo)
 # 19349 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_func_ident = 
-# 2004 "parser_cocci_menhir.mly"
+# 2041 "parser_cocci_menhir.mly"
   ( let (nm,constraints,pure,clt) = _1 in
         Ast0.wrap
           (Ast0.MetaLocalFunc(P.clt2mcode nm clt,constraints,pure)) )
@@ -19412,24 +19412,24 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let rb : (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
 # 19418 "parser_cocci_menhir.ml"
         ) = Obj.magic rb in
         let b : 'tv_fun_start = Obj.magic b in
         let lb : (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
 # 19424 "parser_cocci_menhir.ml"
         ) = Obj.magic lb in
         let rp : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
 # 19429 "parser_cocci_menhir.ml"
         ) = Obj.magic rp in
         let d : 'tv_decl_list_decl_ = Obj.magic d in
         let lp : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
 # 19435 "parser_cocci_menhir.ml"
         ) = Obj.magic lp in
@@ -19438,7 +19438,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_f_ in
         let _endpos = _endpos_rb_ in
         let _v : 'tv_fundecl = 
-# 1016 "parser_cocci_menhir.mly"
+# 1042 "parser_cocci_menhir.mly"
       ( P.verify_parameter_declarations (Ast0.undots d);
        Ast0.wrap(Ast0.FunDecl((Ast0.default_info(),Ast0.context_befaft()),
                               f, i,
@@ -19490,18 +19490,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let pt : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
 # 19496 "parser_cocci_menhir.ml"
         ) = Obj.magic pt in
         let rp : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
 # 19501 "parser_cocci_menhir.ml"
         ) = Obj.magic rp in
         let d : 'tv_decl_list_name_opt_decl_ = Obj.magic d in
         let lp : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
 # 19507 "parser_cocci_menhir.ml"
         ) = Obj.magic lp in
@@ -19517,7 +19517,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 1004 "parser_cocci_menhir.mly"
+# 1030 "parser_cocci_menhir.mly"
       ( Ast0.wrap
          (Ast0.UnInit
             (s,
@@ -19574,18 +19574,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let pt : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
 # 19580 "parser_cocci_menhir.ml"
         ) = Obj.magic pt in
         let rp : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
 # 19585 "parser_cocci_menhir.ml"
         ) = Obj.magic rp in
         let d : 'tv_decl_list_name_opt_decl_ = Obj.magic d in
         let lp : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
 # 19591 "parser_cocci_menhir.ml"
         ) = Obj.magic lp in
@@ -19603,7 +19603,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
         in
         
-# 1004 "parser_cocci_menhir.mly"
+# 1030 "parser_cocci_menhir.mly"
       ( Ast0.wrap
          (Ast0.UnInit
             (s,
@@ -19633,7 +19633,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_ident = 
-# 2018 "parser_cocci_menhir.mly"
+# 2055 "parser_cocci_menhir.mly"
          ( Ast0.wrap(Ast0.Id(P.id2mcode _1)) )
 # 19639 "parser_cocci_menhir.ml"
          in
@@ -19657,7 +19657,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_ident = 
-# 2019 "parser_cocci_menhir.mly"
+# 2056 "parser_cocci_menhir.mly"
                          ( _1 )
 # 19663 "parser_cocci_menhir.ml"
          in
@@ -19678,14 +19678,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 130 "parser_cocci_menhir.mly"
+# 156 "parser_cocci_menhir.mly"
        (Parse_aux.midinfo)
 # 19684 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_ident = 
-# 2021 "parser_cocci_menhir.mly"
+# 2058 "parser_cocci_menhir.mly"
          ( let (nm,constraints,seed,pure,clt) = _1 in
          Ast0.wrap(Ast0.MetaId(P.clt2mcode nm clt,constraints,seed,pure)) )
 # 19692 "parser_cocci_menhir.ml"
@@ -19710,7 +19710,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_i_ in
         let _endpos = _endpos_i_ in
         let _v : 'tv_ident_or_const = 
-# 1971 "parser_cocci_menhir.mly"
+# 2008 "parser_cocci_menhir.mly"
                     ( Ast0.wrap(Ast0.Ident(Ast0.wrap(Ast0.Id(P.id2mcode i)))) )
 # 19716 "parser_cocci_menhir.ml"
          in
@@ -19734,7 +19734,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_ident_or_const = 
-# 1972 "parser_cocci_menhir.mly"
+# 2009 "parser_cocci_menhir.mly"
                          ( Ast0.wrap(Ast0.Ident(_1)) )
 # 19740 "parser_cocci_menhir.ml"
          in
@@ -19755,14 +19755,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 159 "parser_cocci_menhir.mly"
+# 185 "parser_cocci_menhir.mly"
        (string * Data.clt)
 # 19761 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_ident_or_const = 
-# 1974 "parser_cocci_menhir.mly"
+# 2011 "parser_cocci_menhir.mly"
   ( let (x,clt) = _1 in
         Ast0.wrap(Ast0.Constant (P.clt2mcode (Ast.Int x) clt)) )
 # 19769 "parser_cocci_menhir.ml"
@@ -19784,14 +19784,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 152 "parser_cocci_menhir.mly"
+# 178 "parser_cocci_menhir.mly"
        (string * Data.clt)
 # 19790 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_incl = 
-# 329 "parser_cocci_menhir.mly"
+# 355 "parser_cocci_menhir.mly"
                       ( let (x,_) = _1 in Data.Include(x) )
 # 19797 "parser_cocci_menhir.ml"
          in
@@ -19816,14 +19816,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _2 : (
-# 159 "parser_cocci_menhir.mly"
+# 185 "parser_cocci_menhir.mly"
        (string * Data.clt)
 # 19822 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_incl = 
-# 330 "parser_cocci_menhir.mly"
+# 356 "parser_cocci_menhir.mly"
                       ( Data.Iso(Common.Left(P.id2name _2)) )
 # 19829 "parser_cocci_menhir.ml"
          in
@@ -19848,14 +19848,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _2 : (
-# 151 "parser_cocci_menhir.mly"
+# 177 "parser_cocci_menhir.mly"
        (string)
 # 19854 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_incl = 
-# 331 "parser_cocci_menhir.mly"
+# 357 "parser_cocci_menhir.mly"
                       ( Data.Iso(Common.Right _2) )
 # 19861 "parser_cocci_menhir.ml"
          in
@@ -19883,7 +19883,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_incl = 
-# 333 "parser_cocci_menhir.mly"
+# 359 "parser_cocci_menhir.mly"
     ( let names = List.map P.id2name _2 in
       Iteration.parsed_virtual_rules :=
        Common.union_set names !Iteration.parsed_virtual_rules;
@@ -19918,11 +19918,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : (
-# 220 "parser_cocci_menhir.mly"
+# 246 "parser_cocci_menhir.mly"
       (Data.incl_iso list)
 # 19924 "parser_cocci_menhir.ml"
         ) = 
-# 325 "parser_cocci_menhir.mly"
+# 351 "parser_cocci_menhir.mly"
                        ( _1 )
 # 19928 "parser_cocci_menhir.ml"
          in
@@ -19950,11 +19950,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : (
-# 220 "parser_cocci_menhir.mly"
+# 246 "parser_cocci_menhir.mly"
       (Data.incl_iso list)
 # 19956 "parser_cocci_menhir.ml"
         ) = 
-# 326 "parser_cocci_menhir.mly"
+# 352 "parser_cocci_menhir.mly"
                        ( _1 )
 # 19960 "parser_cocci_menhir.ml"
          in
@@ -19975,14 +19975,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 152 "parser_cocci_menhir.mly"
+# 178 "parser_cocci_menhir.mly"
        (string * Data.clt)
 # 19981 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_includes = 
-# 878 "parser_cocci_menhir.mly"
+# 904 "parser_cocci_menhir.mly"
     ( Ast0.wrap
              (Ast0.Include(P.clt2mcode "#include"
                              (P.drop_pos (P.drop_aft (P.id2clt _1))),
@@ -20012,14 +20012,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 152 "parser_cocci_menhir.mly"
+# 178 "parser_cocci_menhir.mly"
        (string * Data.clt)
 # 20018 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_includes = 
-# 889 "parser_cocci_menhir.mly"
+# 915 "parser_cocci_menhir.mly"
     ( Ast0.wrap
              (Ast0.Include(P.clt2mcode "#include"
                              (P.drop_pos (P.drop_aft (P.id2clt _1))),
@@ -20053,14 +20053,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _1 : (
-# 153 "parser_cocci_menhir.mly"
+# 179 "parser_cocci_menhir.mly"
        (Data.clt * token)
 # 20059 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_includes = 
-# 900 "parser_cocci_menhir.mly"
+# 926 "parser_cocci_menhir.mly"
     ( let (clt,ident) = _1 in
       let aft = P.get_aft clt in (* move stuff after the define to the ident *)
       Ast0.wrap
@@ -20106,7 +20106,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_d_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_includes = 
-# 920 "parser_cocci_menhir.mly"
+# 946 "parser_cocci_menhir.mly"
     ( d (Ast0.wrap(Ast0.DOTS([]))) )
 # 20112 "parser_cocci_menhir.ml"
          in
@@ -20140,7 +20140,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_d_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_includes = 
-# 922 "parser_cocci_menhir.mly"
+# 948 "parser_cocci_menhir.mly"
     ( let ty = Ast0.wrap(Ast0.TopExp(Ast0.wrap(Ast0.TypeExp(t)))) in
       d (Ast0.wrap(Ast0.DOTS([ty]))) )
 # 20147 "parser_cocci_menhir.ml"
@@ -20175,7 +20175,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_includes = 
-# 925 "parser_cocci_menhir.mly"
+# 951 "parser_cocci_menhir.mly"
     ( let body =
        match b with
          [e] ->
@@ -20207,7 +20207,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_initialize = 
-# 1345 "parser_cocci_menhir.mly"
+# 1371 "parser_cocci_menhir.mly"
       ( Ast0.wrap(Ast0.InitExpr(_1)) )
 # 20213 "parser_cocci_menhir.ml"
          in
@@ -20238,20 +20238,20 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _3 : (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
 # 20244 "parser_cocci_menhir.ml"
         ) = Obj.magic _3 in
         let _2 : 'tv_initialize_list = Obj.magic _2 in
         let _1 : (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
 # 20250 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_initialize = 
-# 1347 "parser_cocci_menhir.mly"
+# 1373 "parser_cocci_menhir.mly"
     ( if P.struct_initializer _2
     then
       let il = P.drop_dot_commas _2 in
@@ -20277,14 +20277,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 135 "parser_cocci_menhir.mly"
+# 161 "parser_cocci_menhir.mly"
        (Parse_aux.info)
 # 20283 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_initialize = 
-# 1354 "parser_cocci_menhir.mly"
+# 1380 "parser_cocci_menhir.mly"
       (let (nm,pure,clt) = _1 in
       Ast0.wrap(Ast0.MetaInit(P.clt2mcode nm clt,pure)) )
 # 20291 "parser_cocci_menhir.ml"
@@ -20309,7 +20309,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_initialize2 = 
-# 1360 "parser_cocci_menhir.mly"
+# 1386 "parser_cocci_menhir.mly"
                             ( Ast0.wrap(Ast0.InitExpr(_1)) )
 # 20315 "parser_cocci_menhir.ml"
          in
@@ -20320,6 +20320,30 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.endp = _endpos;
           MenhirLib.EngineTypes.next = _menhir_stack;
           });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = _1;
+          MenhirLib.EngineTypes.startp = _startpos__1_;
+          MenhirLib.EngineTypes.endp = _endpos__1_;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+          } = _menhir_stack in
+        let _1 : 'tv_nest_expressions_only = Obj.magic _1 in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos__1_ in
+        let _v : 'tv_initialize2 = 
+# 1387 "parser_cocci_menhir.mly"
+                            ( Ast0.wrap(Ast0.InitExpr(_1)) )
+# 20339 "parser_cocci_menhir.ml"
+         in
+        _menhir_env.MenhirLib.EngineTypes.stack <- {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+          });
       (fun _menhir_env ->
         let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
         let {
@@ -20340,27 +20364,27 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _3 : (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
-# 20346 "parser_cocci_menhir.ml"
+# 20370 "parser_cocci_menhir.ml"
         ) = Obj.magic _3 in
         let _2 : 'tv_initialize_list = Obj.magic _2 in
         let _1 : (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
-# 20352 "parser_cocci_menhir.ml"
+# 20376 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_initialize2 = 
-# 1362 "parser_cocci_menhir.mly"
+# 1389 "parser_cocci_menhir.mly"
     ( if P.struct_initializer _2
     then
       let il = P.drop_dot_commas _2 in
       Ast0.wrap(Ast0.InitList(P.clt2mcode "{" _1,il,P.clt2mcode "}" _3,false))
     else
       Ast0.wrap(Ast0.InitList(P.clt2mcode "{" _1,_2,P.clt2mcode "}" _3,true)) )
-# 20364 "parser_cocci_menhir.ml"
+# 20388 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -20390,17 +20414,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_initialize2 = Obj.magic _3 in
         let _2 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 20396 "parser_cocci_menhir.ml"
+# 20420 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_list_designator_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_initialize2 = 
-# 1370 "parser_cocci_menhir.mly"
+# 1397 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.InitGccExt(_1,P.clt2mcode "=" _2,_3)) )
-# 20404 "parser_cocci_menhir.ml"
+# 20428 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -20430,17 +20454,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_initialize2 = Obj.magic _3 in
         let _2 : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
-# 20436 "parser_cocci_menhir.ml"
+# 20460 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_mident = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_initialize2 = 
-# 1372 "parser_cocci_menhir.mly"
+# 1399 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.InitGccName(_1,P.clt2mcode ":" _2,_3)) )
-# 20444 "parser_cocci_menhir.ml"
+# 20468 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -20459,17 +20483,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 135 "parser_cocci_menhir.mly"
+# 161 "parser_cocci_menhir.mly"
        (Parse_aux.info)
-# 20465 "parser_cocci_menhir.ml"
+# 20489 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_initialize2 = 
-# 1374 "parser_cocci_menhir.mly"
+# 1401 "parser_cocci_menhir.mly"
       (let (nm,pure,clt) = _1 in
       Ast0.wrap(Ast0.MetaInit(P.clt2mcode nm clt,pure)) )
-# 20473 "parser_cocci_menhir.ml"
+# 20497 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -20488,14 +20512,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 136 "parser_cocci_menhir.mly"
+# 162 "parser_cocci_menhir.mly"
        (Parse_aux.list_info)
-# 20494 "parser_cocci_menhir.ml"
+# 20518 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_initialize2 = 
-# 1377 "parser_cocci_menhir.mly"
+# 1404 "parser_cocci_menhir.mly"
       (let (nm,lenname,pure,clt) = _1 in
       let nm = P.clt2mcode nm clt in
       let lenname =
@@ -20504,7 +20528,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
        | Ast.MetaLen nm -> Ast0.MetaListLen(P.clt2mcode nm clt)
        | Ast.CstLen n -> Ast0.CstListLen n in
       Ast0.wrap(Ast0.MetaInitList(nm,lenname,pure)) )
-# 20508 "parser_cocci_menhir.ml"
+# 20532 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -20526,9 +20550,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_initialize_list = 
-# 1397 "parser_cocci_menhir.mly"
+# 1424 "parser_cocci_menhir.mly"
      ( Ast0.wrap(Ast0.DOTS(_1 P.mkidots (fun c -> Ast0.IComma c))) )
-# 20532 "parser_cocci_menhir.ml"
+# 20556 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -20548,9 +20572,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_invalid = 
-# 1482 "parser_cocci_menhir.mly"
+# 1509 "parser_cocci_menhir.mly"
            ( raise (Semantic_cocci.Semantic "not matchable") )
-# 20554 "parser_cocci_menhir.ml"
+# 20578 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -20565,9 +20589,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in
         let _endpos = _startpos in
         let _v : 'tv_is_expression = 
-# 321 "parser_cocci_menhir.mly"
+# 347 "parser_cocci_menhir.mly"
               ( false )
-# 20571 "parser_cocci_menhir.ml"
+# 20595 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -20587,9 +20611,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_is_expression = 
-# 322 "parser_cocci_menhir.mly"
+# 348 "parser_cocci_menhir.mly"
               ( true )
-# 20593 "parser_cocci_menhir.ml"
+# 20617 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -20615,9 +20639,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos_t_ in
         let _v : 'tv_iso_ctype_ = 
-# 2411 "parser_cocci_menhir.mly"
+# 2448 "parser_cocci_menhir.mly"
                 ( Common.Left t )
-# 20621 "parser_cocci_menhir.ml"
+# 20645 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -20643,9 +20667,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos_t_ in
         let _v : 'tv_iso_ctype_ = 
-# 2412 "parser_cocci_menhir.mly"
+# 2449 "parser_cocci_menhir.mly"
                      ( Common.Right t )
-# 20649 "parser_cocci_menhir.ml"
+# 20673 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -20671,9 +20695,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos_t_ in
         let _v : 'tv_iso_decl_var_ = 
-# 2411 "parser_cocci_menhir.mly"
+# 2448 "parser_cocci_menhir.mly"
                 ( Common.Left t )
-# 20677 "parser_cocci_menhir.ml"
+# 20701 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -20699,9 +20723,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos_t_ in
         let _v : 'tv_iso_decl_var_ = 
-# 2412 "parser_cocci_menhir.mly"
+# 2449 "parser_cocci_menhir.mly"
                      ( Common.Right t )
-# 20705 "parser_cocci_menhir.ml"
+# 20729 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -20727,9 +20751,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos_t_ in
         let _v : 'tv_iso_eexpr_ = 
-# 2411 "parser_cocci_menhir.mly"
+# 2448 "parser_cocci_menhir.mly"
                 ( Common.Left t )
-# 20733 "parser_cocci_menhir.ml"
+# 20757 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -20755,9 +20779,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos_t_ in
         let _v : 'tv_iso_eexpr_ = 
-# 2412 "parser_cocci_menhir.mly"
+# 2449 "parser_cocci_menhir.mly"
                      ( Common.Right t )
-# 20761 "parser_cocci_menhir.ml"
+# 20785 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -20783,9 +20807,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos_t_ in
         let _v : 'tv_iso_iso_statement_ = 
-# 2411 "parser_cocci_menhir.mly"
+# 2448 "parser_cocci_menhir.mly"
                 ( Common.Left t )
-# 20789 "parser_cocci_menhir.ml"
+# 20813 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -20811,9 +20835,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos_t_ in
         let _v : 'tv_iso_iso_statement_ = 
-# 2412 "parser_cocci_menhir.mly"
+# 2449 "parser_cocci_menhir.mly"
                      ( Common.Right t )
-# 20817 "parser_cocci_menhir.ml"
+# 20841 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -20839,9 +20863,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos_t_ in
         let _v : 'tv_iso_nest_start_ = 
-# 2411 "parser_cocci_menhir.mly"
+# 2448 "parser_cocci_menhir.mly"
                 ( Common.Left t )
-# 20845 "parser_cocci_menhir.ml"
+# 20869 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -20867,9 +20891,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos_t_ in
         let _v : 'tv_iso_nest_start_ = 
-# 2412 "parser_cocci_menhir.mly"
+# 2449 "parser_cocci_menhir.mly"
                      ( Common.Right t )
-# 20873 "parser_cocci_menhir.ml"
+# 20897 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -20905,13 +20929,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__4_ in
         let _v : (
-# 236 "parser_cocci_menhir.mly"
+# 262 "parser_cocci_menhir.mly"
       (Ast0_cocci.anything list list)
-# 20911 "parser_cocci_menhir.ml"
+# 20935 "parser_cocci_menhir.ml"
         ) = 
-# 2379 "parser_cocci_menhir.mly"
+# 2416 "parser_cocci_menhir.mly"
     ( let fn x = Ast0.ExprTag x in P.iso_adjust fn fn e1 el )
-# 20915 "parser_cocci_menhir.ml"
+# 20939 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -20947,13 +20971,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__4_ in
         let _v : (
-# 236 "parser_cocci_menhir.mly"
+# 262 "parser_cocci_menhir.mly"
       (Ast0_cocci.anything list list)
-# 20953 "parser_cocci_menhir.ml"
+# 20977 "parser_cocci_menhir.ml"
         ) = 
-# 2381 "parser_cocci_menhir.mly"
+# 2418 "parser_cocci_menhir.mly"
     ( let fn x = Ast0.ArgExprTag x in P.iso_adjust fn fn e1 el )
-# 20957 "parser_cocci_menhir.ml"
+# 20981 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -20989,13 +21013,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__4_ in
         let _v : (
-# 236 "parser_cocci_menhir.mly"
+# 262 "parser_cocci_menhir.mly"
       (Ast0_cocci.anything list list)
-# 20995 "parser_cocci_menhir.ml"
+# 21019 "parser_cocci_menhir.ml"
         ) = 
-# 2383 "parser_cocci_menhir.mly"
+# 2420 "parser_cocci_menhir.mly"
     ( let fn x = Ast0.TestExprTag x in P.iso_adjust fn fn e1 el )
-# 20999 "parser_cocci_menhir.ml"
+# 21023 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21031,15 +21055,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__4_ in
         let _v : (
-# 236 "parser_cocci_menhir.mly"
+# 262 "parser_cocci_menhir.mly"
       (Ast0_cocci.anything list list)
-# 21037 "parser_cocci_menhir.ml"
+# 21061 "parser_cocci_menhir.ml"
         ) = 
-# 2385 "parser_cocci_menhir.mly"
+# 2422 "parser_cocci_menhir.mly"
     ( let ffn x = Ast0.ExprTag x in
       let fn x =  Ast0.TestExprTag x in
       P.iso_adjust ffn fn e1 el )
-# 21043 "parser_cocci_menhir.ml"
+# 21067 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21075,13 +21099,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__4_ in
         let _v : (
-# 236 "parser_cocci_menhir.mly"
+# 262 "parser_cocci_menhir.mly"
       (Ast0_cocci.anything list list)
-# 21081 "parser_cocci_menhir.ml"
+# 21105 "parser_cocci_menhir.ml"
         ) = 
-# 2389 "parser_cocci_menhir.mly"
+# 2426 "parser_cocci_menhir.mly"
     ( let fn x = Ast0.StmtTag x in P.iso_adjust fn fn s1 sl )
-# 21085 "parser_cocci_menhir.ml"
+# 21109 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21117,13 +21141,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__4_ in
         let _v : (
-# 236 "parser_cocci_menhir.mly"
+# 262 "parser_cocci_menhir.mly"
       (Ast0_cocci.anything list list)
-# 21123 "parser_cocci_menhir.ml"
+# 21147 "parser_cocci_menhir.ml"
         ) = 
-# 2391 "parser_cocci_menhir.mly"
+# 2428 "parser_cocci_menhir.mly"
     ( let fn x = Ast0.TypeCTag x in P.iso_adjust fn fn t1 tl )
-# 21127 "parser_cocci_menhir.ml"
+# 21151 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21159,13 +21183,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__4_ in
         let _v : (
-# 236 "parser_cocci_menhir.mly"
+# 262 "parser_cocci_menhir.mly"
       (Ast0_cocci.anything list list)
-# 21165 "parser_cocci_menhir.ml"
+# 21189 "parser_cocci_menhir.ml"
         ) = 
-# 2393 "parser_cocci_menhir.mly"
+# 2430 "parser_cocci_menhir.mly"
     ( let fn x = Ast0.DotsStmtTag x in P.iso_adjust fn fn e1 el )
-# 21169 "parser_cocci_menhir.ml"
+# 21193 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21201,11 +21225,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__4_ in
         let _v : (
-# 236 "parser_cocci_menhir.mly"
+# 262 "parser_cocci_menhir.mly"
       (Ast0_cocci.anything list list)
-# 21207 "parser_cocci_menhir.ml"
+# 21231 "parser_cocci_menhir.ml"
         ) = 
-# 2395 "parser_cocci_menhir.mly"
+# 2432 "parser_cocci_menhir.mly"
     ( let check_one = function
        [x] -> x
       | _ ->
@@ -21220,7 +21244,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
          | Common.Right x -> Common.Right(check_one x))
        dl in
     let fn x = Ast0.DeclTag x in P.iso_adjust fn fn d1 dl )
-# 21224 "parser_cocci_menhir.ml"
+# 21248 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21242,13 +21266,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_m_ in
         let _endpos = _endpos_m_ in
         let _v : (
-# 239 "parser_cocci_menhir.mly"
+# 265 "parser_cocci_menhir.mly"
       ((Ast_cocci.metavar,Ast_cocci.metavar) Common.either list)
-# 21248 "parser_cocci_menhir.ml"
+# 21272 "parser_cocci_menhir.ml"
         ) = 
-# 256 "parser_cocci_menhir.mly"
+# 282 "parser_cocci_menhir.mly"
                          ( m "" )
-# 21252 "parser_cocci_menhir.ml"
+# 21276 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21274,13 +21298,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_nm_ in
         let _endpos = _endpos__2_ in
         let _v : (
-# 223 "parser_cocci_menhir.mly"
+# 249 "parser_cocci_menhir.mly"
       (Ast_cocci.rulename)
-# 21280 "parser_cocci_menhir.ml"
+# 21304 "parser_cocci_menhir.ml"
         ) = 
-# 271 "parser_cocci_menhir.mly"
+# 297 "parser_cocci_menhir.mly"
                       ( P.make_iso_rule_name_result (P.id2name nm) )
-# 21284 "parser_cocci_menhir.ml"
+# 21308 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21302,9 +21326,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_iso_statement = 
-# 1188 "parser_cocci_menhir.mly"
+# 1214 "parser_cocci_menhir.mly"
                                       ( _1 )
-# 21308 "parser_cocci_menhir.ml"
+# 21332 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21326,13 +21350,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_iso_statement = 
-# 1190 "parser_cocci_menhir.mly"
+# 1216 "parser_cocci_menhir.mly"
       ( match _1 with
        [decl] ->
          Ast0.wrap
            (Ast0.Decl((Ast0.default_info(),Ast0.context_befaft()),decl))
       |        _ -> failwith "exactly one decl allowed in statement iso" )
-# 21336 "parser_cocci_menhir.ml"
+# 21360 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21351,16 +21375,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 127 "parser_cocci_menhir.mly"
+# 153 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 21357 "parser_cocci_menhir.ml"
+# 21381 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_iter_ident = 
-# 2052 "parser_cocci_menhir.mly"
+# 2089 "parser_cocci_menhir.mly"
          ( Ast0.wrap(Ast0.Id(P.id2mcode _1)) )
-# 21364 "parser_cocci_menhir.ml"
+# 21388 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21379,17 +21403,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 132 "parser_cocci_menhir.mly"
+# 158 "parser_cocci_menhir.mly"
        (Parse_aux.idinfo)
-# 21385 "parser_cocci_menhir.ml"
+# 21409 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_iter_ident = 
-# 2054 "parser_cocci_menhir.mly"
+# 2091 "parser_cocci_menhir.mly"
          ( let (nm,constraints,pure,clt) = _1 in
          Ast0.wrap(Ast0.MetaId(P.clt2mcode nm clt,constraints,Ast.NoVal,pure)) )
-# 21393 "parser_cocci_menhir.ml"
+# 21417 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21406,7 +21430,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_TMul_ = 
 # 114 "standard.mly"
     ( [] )
-# 21410 "parser_cocci_menhir.ml"
+# 21434 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21431,16 +21455,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let xs : 'tv_list_TMul_ = Obj.magic xs in
         let x : (
-# 171 "parser_cocci_menhir.mly"
+# 197 "parser_cocci_menhir.mly"
        (Data.clt)
-# 21437 "parser_cocci_menhir.ml"
+# 21461 "parser_cocci_menhir.ml"
         ) = Obj.magic x in
         let _startpos = _startpos_x_ in
         let _endpos = _endpos_xs_ in
         let _v : 'tv_list_TMul_ = 
 # 116 "standard.mly"
     ( x :: xs )
-# 21444 "parser_cocci_menhir.ml"
+# 21468 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21457,7 +21481,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_array_dec_ = 
 # 114 "standard.mly"
     ( [] )
-# 21461 "parser_cocci_menhir.ml"
+# 21485 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21487,7 +21511,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_array_dec_ = 
 # 116 "standard.mly"
     ( x :: xs )
-# 21491 "parser_cocci_menhir.ml"
+# 21515 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21504,7 +21528,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_case_line_ = 
 # 114 "standard.mly"
     ( [] )
-# 21508 "parser_cocci_menhir.ml"
+# 21532 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21534,7 +21558,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_case_line_ = 
 # 116 "standard.mly"
     ( x :: xs )
-# 21538 "parser_cocci_menhir.ml"
+# 21562 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21551,7 +21575,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_decl_var_ = 
 # 114 "standard.mly"
     ( [] )
-# 21555 "parser_cocci_menhir.ml"
+# 21579 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21581,7 +21605,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_decl_var_ = 
 # 116 "standard.mly"
     ( x :: xs )
-# 21585 "parser_cocci_menhir.ml"
+# 21609 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21598,7 +21622,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_designator_ = 
 # 114 "standard.mly"
     ( [] )
-# 21602 "parser_cocci_menhir.ml"
+# 21626 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21628,7 +21652,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_designator_ = 
 # 116 "standard.mly"
     ( x :: xs )
-# 21632 "parser_cocci_menhir.ml"
+# 21656 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21645,7 +21669,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_incl_ = 
 # 114 "standard.mly"
     ( [] )
-# 21649 "parser_cocci_menhir.ml"
+# 21673 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21675,7 +21699,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_incl_ = 
 # 116 "standard.mly"
     ( x :: xs )
-# 21679 "parser_cocci_menhir.ml"
+# 21703 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21692,7 +21716,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_iso_ctype__ = 
 # 114 "standard.mly"
     ( [] )
-# 21696 "parser_cocci_menhir.ml"
+# 21720 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21722,7 +21746,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_iso_ctype__ = 
 # 116 "standard.mly"
     ( x :: xs )
-# 21726 "parser_cocci_menhir.ml"
+# 21750 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21739,7 +21763,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_iso_decl_var__ = 
 # 114 "standard.mly"
     ( [] )
-# 21743 "parser_cocci_menhir.ml"
+# 21767 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21769,7 +21793,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_iso_decl_var__ = 
 # 116 "standard.mly"
     ( x :: xs )
-# 21773 "parser_cocci_menhir.ml"
+# 21797 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21786,7 +21810,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_iso_eexpr__ = 
 # 114 "standard.mly"
     ( [] )
-# 21790 "parser_cocci_menhir.ml"
+# 21814 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21816,7 +21840,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_iso_eexpr__ = 
 # 116 "standard.mly"
     ( x :: xs )
-# 21820 "parser_cocci_menhir.ml"
+# 21844 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21833,7 +21857,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_iso_iso_statement__ = 
 # 114 "standard.mly"
     ( [] )
-# 21837 "parser_cocci_menhir.ml"
+# 21861 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21863,7 +21887,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_iso_iso_statement__ = 
 # 116 "standard.mly"
     ( x :: xs )
-# 21867 "parser_cocci_menhir.ml"
+# 21891 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21880,7 +21904,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_iso_nest_start__ = 
 # 114 "standard.mly"
     ( [] )
-# 21884 "parser_cocci_menhir.ml"
+# 21908 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21910,7 +21934,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_iso_nest_start__ = 
 # 116 "standard.mly"
     ( x :: xs )
-# 21914 "parser_cocci_menhir.ml"
+# 21938 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21927,7 +21951,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_mzl_ctype__ = 
 # 114 "standard.mly"
     ( [] )
-# 21931 "parser_cocci_menhir.ml"
+# 21955 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21957,7 +21981,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_mzl_ctype__ = 
 # 116 "standard.mly"
     ( x :: xs )
-# 21961 "parser_cocci_menhir.ml"
+# 21985 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -21974,7 +21998,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_mzl_disj_ident__ = 
 # 114 "standard.mly"
     ( [] )
-# 21978 "parser_cocci_menhir.ml"
+# 22002 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22004,7 +22028,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_mzl_disj_ident__ = 
 # 116 "standard.mly"
     ( x :: xs )
-# 22008 "parser_cocci_menhir.ml"
+# 22032 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22021,7 +22045,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_mzl_eexpr__ = 
 # 114 "standard.mly"
     ( [] )
-# 22025 "parser_cocci_menhir.ml"
+# 22049 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22051,7 +22075,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_mzl_eexpr__ = 
 # 116 "standard.mly"
     ( x :: xs )
-# 22055 "parser_cocci_menhir.ml"
+# 22079 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22068,7 +22092,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_mzl_fun_after_dots_or__ = 
 # 114 "standard.mly"
     ( [] )
-# 22072 "parser_cocci_menhir.ml"
+# 22096 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22098,7 +22122,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_mzl_fun_after_dots_or__ = 
 # 116 "standard.mly"
     ( x :: xs )
-# 22102 "parser_cocci_menhir.ml"
+# 22126 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22115,7 +22139,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_mzl_fun_start__ = 
 # 114 "standard.mly"
     ( [] )
-# 22119 "parser_cocci_menhir.ml"
+# 22143 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22145,7 +22169,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_mzl_fun_start__ = 
 # 116 "standard.mly"
     ( x :: xs )
-# 22149 "parser_cocci_menhir.ml"
+# 22173 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22162,7 +22186,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_mzl_mctype__ = 
 # 114 "standard.mly"
     ( [] )
-# 22166 "parser_cocci_menhir.ml"
+# 22190 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22192,7 +22216,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_mzl_mctype__ = 
 # 116 "standard.mly"
     ( x :: xs )
-# 22196 "parser_cocci_menhir.ml"
+# 22220 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22209,7 +22233,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_mzl_rule_elem_statement__ = 
 # 114 "standard.mly"
     ( [] )
-# 22213 "parser_cocci_menhir.ml"
+# 22237 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22239,7 +22263,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_mzl_rule_elem_statement__ = 
 # 116 "standard.mly"
     ( x :: xs )
-# 22243 "parser_cocci_menhir.ml"
+# 22267 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22256,7 +22280,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_mzl_statement__ = 
 # 114 "standard.mly"
     ( [] )
-# 22260 "parser_cocci_menhir.ml"
+# 22284 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22286,7 +22310,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_mzl_statement__ = 
 # 116 "standard.mly"
     ( x :: xs )
-# 22290 "parser_cocci_menhir.ml"
+# 22314 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22303,7 +22327,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_mzl_struct_decl_one__ = 
 # 114 "standard.mly"
     ( [] )
-# 22307 "parser_cocci_menhir.ml"
+# 22331 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22333,7 +22357,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_mzl_struct_decl_one__ = 
 # 116 "standard.mly"
     ( x :: xs )
-# 22337 "parser_cocci_menhir.ml"
+# 22361 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22350,7 +22374,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_pair_edots_when_TEllipsis_eexpr__dexpr__ = 
 # 114 "standard.mly"
     ( [] )
-# 22354 "parser_cocci_menhir.ml"
+# 22378 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22389,13 +22413,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 70 "standard.mly"
     ( (x, y) )
-# 22393 "parser_cocci_menhir.ml"
+# 22417 "parser_cocci_menhir.ml"
           
         in
         
 # 116 "standard.mly"
     ( x :: xs )
-# 22399 "parser_cocci_menhir.ml"
+# 22423 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22412,7 +22436,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_whenppdecs_ = 
 # 114 "standard.mly"
     ( [] )
-# 22416 "parser_cocci_menhir.ml"
+# 22440 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22442,7 +22466,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_list_whenppdecs_ = 
 # 116 "standard.mly"
     ( x :: xs )
-# 22446 "parser_cocci_menhir.ml"
+# 22470 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22464,9 +22488,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_list_len = 
-# 425 "parser_cocci_menhir.mly"
+# 451 "parser_cocci_menhir.mly"
                            ( Common.Left _1 )
-# 22470 "parser_cocci_menhir.ml"
+# 22494 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22485,16 +22509,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 159 "parser_cocci_menhir.mly"
+# 185 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 22491 "parser_cocci_menhir.ml"
+# 22515 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_list_len = 
-# 426 "parser_cocci_menhir.mly"
+# 452 "parser_cocci_menhir.mly"
        ( let (x,clt) = _1 in Common.Right (int_of_string x) )
-# 22498 "parser_cocci_menhir.ml"
+# 22522 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22511,7 +22535,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_loption_choose_iso_ = 
 # 57 "standard.mly"
     ( [] )
-# 22515 "parser_cocci_menhir.ml"
+# 22539 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22535,7 +22559,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_loption_choose_iso_ = 
 # 59 "standard.mly"
     ( x )
-# 22539 "parser_cocci_menhir.ml"
+# 22563 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22552,7 +22576,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_loption_disable_ = 
 # 57 "standard.mly"
     ( [] )
-# 22556 "parser_cocci_menhir.ml"
+# 22580 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22576,7 +22600,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_loption_disable_ = 
 # 59 "standard.mly"
     ( x )
-# 22580 "parser_cocci_menhir.ml"
+# 22604 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22593,7 +22617,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_loption_filespec_ = 
 # 57 "standard.mly"
     ( [] )
-# 22597 "parser_cocci_menhir.ml"
+# 22621 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22617,7 +22641,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_loption_filespec_ = 
 # 59 "standard.mly"
     ( x )
-# 22621 "parser_cocci_menhir.ml"
+# 22645 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22634,7 +22658,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_loption_minus_start_ = 
 # 57 "standard.mly"
     ( [] )
-# 22638 "parser_cocci_menhir.ml"
+# 22662 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22658,7 +22682,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_loption_minus_start_ = 
 # 59 "standard.mly"
     ( x )
-# 22662 "parser_cocci_menhir.ml"
+# 22686 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22675,7 +22699,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_loption_not_pos_ = 
 # 57 "standard.mly"
     ( [] )
-# 22679 "parser_cocci_menhir.ml"
+# 22703 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22699,7 +22723,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_loption_not_pos_ = 
 # 59 "standard.mly"
     ( x )
-# 22703 "parser_cocci_menhir.ml"
+# 22727 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22716,7 +22740,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_loption_plus_start_ = 
 # 57 "standard.mly"
     ( [] )
-# 22720 "parser_cocci_menhir.ml"
+# 22744 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22740,7 +22764,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_loption_plus_start_ = 
 # 59 "standard.mly"
     ( x )
-# 22744 "parser_cocci_menhir.ml"
+# 22768 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22759,16 +22783,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 135 "parser_cocci_menhir.mly"
+# 161 "parser_cocci_menhir.mly"
        (Parse_aux.info)
-# 22765 "parser_cocci_menhir.ml"
+# 22789 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_mctype = 
-# 739 "parser_cocci_menhir.mly"
+# 765 "parser_cocci_menhir.mly"
         ( tmeta_to_type _1 )
-# 22772 "parser_cocci_menhir.ml"
+# 22796 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22790,9 +22814,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_mctype = 
-# 740 "parser_cocci_menhir.mly"
+# 766 "parser_cocci_menhir.mly"
         (_1)
-# 22796 "parser_cocci_menhir.ml"
+# 22820 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22814,9 +22838,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_t_ in
         let _endpos = _endpos_t_ in
         let _v : 'tv_meta_exp_type = 
-# 620 "parser_cocci_menhir.mly"
+# 646 "parser_cocci_menhir.mly"
     ( [Ast0_cocci.ast0_type_to_type t] )
-# 22820 "parser_cocci_menhir.ml"
+# 22844 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22846,9 +22870,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_t_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_meta_exp_type = 
-# 622 "parser_cocci_menhir.mly"
+# 648 "parser_cocci_menhir.mly"
     ( [Type_cocci.Array (Ast0_cocci.ast0_type_to_type t)] )
-# 22852 "parser_cocci_menhir.ml"
+# 22876 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22884,11 +22908,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos_m_ in
         let _v : 'tv_meta_exp_type = 
-# 624 "parser_cocci_menhir.mly"
+# 650 "parser_cocci_menhir.mly"
     ( List.map
        (function x -> P.ty_pointerify (Ast0_cocci.ast0_type_to_type x) m)
        t )
-# 22892 "parser_cocci_menhir.ml"
+# 22916 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22917,16 +22941,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_pure_ident = Obj.magic _3 in
         let _1 : (
-# 114 "parser_cocci_menhir.mly"
+# 140 "parser_cocci_menhir.mly"
       (string)
-# 22923 "parser_cocci_menhir.ml"
+# 22947 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_meta_ident = 
-# 1776 "parser_cocci_menhir.mly"
+# 1813 "parser_cocci_menhir.mly"
                                    ( (Some _1,P.id2name _3) )
-# 22930 "parser_cocci_menhir.ml"
+# 22954 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22955,16 +22979,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_pure_ident_kwd = Obj.magic _3 in
         let _1 : (
-# 114 "parser_cocci_menhir.mly"
+# 140 "parser_cocci_menhir.mly"
       (string)
-# 22961 "parser_cocci_menhir.ml"
+# 22985 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_meta_ident = 
-# 1777 "parser_cocci_menhir.mly"
+# 1814 "parser_cocci_menhir.mly"
                                    ( (Some _1,_3) )
-# 22968 "parser_cocci_menhir.ml"
+# 22992 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -22986,13 +23010,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_m_ in
         let _endpos = _endpos_m_ in
         let _v : (
-# 231 "parser_cocci_menhir.mly"
+# 257 "parser_cocci_menhir.mly"
       ((Ast_cocci.metavar,Ast_cocci.metavar) Common.either list)
-# 22992 "parser_cocci_menhir.ml"
+# 23016 "parser_cocci_menhir.ml"
         ) = 
-# 255 "parser_cocci_menhir.mly"
+# 281 "parser_cocci_menhir.mly"
                        ( m (!Ast0.rule_name) )
-# 22996 "parser_cocci_menhir.ml"
+# 23020 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -23035,17 +23059,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _endpos = _endpos__5_ in
         let _v : 'tv_metadec = let kindfn =
           
-# 437 "parser_cocci_menhir.mly"
+# 463 "parser_cocci_menhir.mly"
     ( (fun arity name pure check_meta ->
       let tok = check_meta(Ast.MetaMetaDecl(arity,name)) in
       !Data.add_meta_meta name pure; tok) )
-# 23043 "parser_cocci_menhir.ml"
+# 23067 "parser_cocci_menhir.ml"
           
         in
         
-# 345 "parser_cocci_menhir.mly"
+# 371 "parser_cocci_menhir.mly"
     ( P.create_metadec ar ispure kindfn ids )
-# 23049 "parser_cocci_menhir.ml"
+# 23073 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -23088,17 +23112,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _endpos = _endpos__5_ in
         let _v : 'tv_metadec = let kindfn =
           
-# 441 "parser_cocci_menhir.mly"
+# 467 "parser_cocci_menhir.mly"
     ( (fun arity name pure check_meta ->
       let tok = check_meta(Ast.MetaParamDecl(arity,name)) in
       !Data.add_param_meta name pure; tok) )
-# 23096 "parser_cocci_menhir.ml"
+# 23120 "parser_cocci_menhir.ml"
           
         in
         
-# 345 "parser_cocci_menhir.mly"
+# 371 "parser_cocci_menhir.mly"
     ( P.create_metadec ar ispure kindfn ids )
-# 23102 "parser_cocci_menhir.ml"
+# 23126 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -23145,18 +23169,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _endpos = _endpos__6_ in
         let _v : 'tv_metadec = let kindfn =
           
-# 445 "parser_cocci_menhir.mly"
+# 471 "parser_cocci_menhir.mly"
     ( (fun arity name pure check_meta ->
       let len = Ast.AnyLen in
       let tok = check_meta(Ast.MetaParamListDecl(arity,name,len)) in
       !Data.add_paramlist_meta name len pure; tok) )
-# 23154 "parser_cocci_menhir.ml"
+# 23178 "parser_cocci_menhir.ml"
           
         in
         
-# 345 "parser_cocci_menhir.mly"
+# 371 "parser_cocci_menhir.mly"
     ( P.create_metadec ar ispure kindfn ids )
-# 23160 "parser_cocci_menhir.ml"
+# 23184 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -23203,18 +23227,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _endpos = _endpos__6_ in
         let _v : 'tv_metadec = let kindfn =
           
-# 450 "parser_cocci_menhir.mly"
+# 476 "parser_cocci_menhir.mly"
     ( (fun arity name pure check_meta ->
       let len = Ast.AnyLen in
       let tok = check_meta(Ast.MetaExpListDecl(arity,name,len)) in
       !Data.add_explist_meta name len pure; tok) )
-# 23212 "parser_cocci_menhir.ml"
+# 23236 "parser_cocci_menhir.ml"
           
         in
         
-# 345 "parser_cocci_menhir.mly"
+# 371 "parser_cocci_menhir.mly"
     ( P.create_metadec ar ispure kindfn ids )
-# 23218 "parser_cocci_menhir.ml"
+# 23242 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -23257,17 +23281,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _endpos = _endpos__5_ in
         let _v : 'tv_metadec = let kindfn =
           
-# 455 "parser_cocci_menhir.mly"
+# 481 "parser_cocci_menhir.mly"
     ( (fun arity name pure check_meta ->
       let tok = check_meta(Ast.MetaTypeDecl(arity,name)) in
       !Data.add_type_meta name pure; tok) )
-# 23265 "parser_cocci_menhir.ml"
+# 23289 "parser_cocci_menhir.ml"
           
         in
         
-# 345 "parser_cocci_menhir.mly"
+# 371 "parser_cocci_menhir.mly"
     ( P.create_metadec ar ispure kindfn ids )
-# 23271 "parser_cocci_menhir.ml"
+# 23295 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -23310,17 +23334,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _endpos = _endpos__5_ in
         let _v : 'tv_metadec = let kindfn =
           
-# 459 "parser_cocci_menhir.mly"
+# 485 "parser_cocci_menhir.mly"
     ( (fun arity name pure check_meta ->
       let tok = check_meta(Ast.MetaInitDecl(arity,name)) in
       !Data.add_init_meta name pure; tok) )
-# 23318 "parser_cocci_menhir.ml"
+# 23342 "parser_cocci_menhir.ml"
           
         in
         
-# 345 "parser_cocci_menhir.mly"
+# 371 "parser_cocci_menhir.mly"
     ( P.create_metadec ar ispure kindfn ids )
-# 23324 "parser_cocci_menhir.ml"
+# 23348 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -23367,18 +23391,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _endpos = _endpos__6_ in
         let _v : 'tv_metadec = let kindfn =
           
-# 463 "parser_cocci_menhir.mly"
+# 489 "parser_cocci_menhir.mly"
     ( (fun arity name pure check_meta ->
       let len = Ast.AnyLen in
       let tok = check_meta(Ast.MetaInitListDecl(arity,name,len)) in
       !Data.add_initlist_meta name len pure; tok) )
-# 23376 "parser_cocci_menhir.ml"
+# 23400 "parser_cocci_menhir.ml"
           
         in
         
-# 345 "parser_cocci_menhir.mly"
+# 371 "parser_cocci_menhir.mly"
     ( P.create_metadec ar ispure kindfn ids )
-# 23382 "parser_cocci_menhir.ml"
+# 23406 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -23421,17 +23445,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _endpos = _endpos__5_ in
         let _v : 'tv_metadec = let kindfn =
           
-# 468 "parser_cocci_menhir.mly"
+# 494 "parser_cocci_menhir.mly"
     ( (fun arity name pure check_meta ->
       let tok = check_meta(Ast.MetaStmDecl(arity,name)) in
       !Data.add_stm_meta name pure; tok) )
-# 23429 "parser_cocci_menhir.ml"
+# 23453 "parser_cocci_menhir.ml"
           
         in
         
-# 345 "parser_cocci_menhir.mly"
+# 371 "parser_cocci_menhir.mly"
     ( P.create_metadec ar ispure kindfn ids )
-# 23435 "parser_cocci_menhir.ml"
+# 23459 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -23474,17 +23498,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _endpos = _endpos__5_ in
         let _v : 'tv_metadec = let kindfn =
           
-# 472 "parser_cocci_menhir.mly"
+# 498 "parser_cocci_menhir.mly"
     ( (fun arity name pure check_meta ->
       let tok = check_meta(Ast.MetaDeclDecl(arity,name)) in
       !Data.add_decl_meta name pure; tok) )
-# 23482 "parser_cocci_menhir.ml"
+# 23506 "parser_cocci_menhir.ml"
           
         in
         
-# 345 "parser_cocci_menhir.mly"
+# 371 "parser_cocci_menhir.mly"
     ( P.create_metadec ar ispure kindfn ids )
-# 23488 "parser_cocci_menhir.ml"
+# 23512 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -23527,17 +23551,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _endpos = _endpos__5_ in
         let _v : 'tv_metadec = let kindfn =
           
-# 476 "parser_cocci_menhir.mly"
+# 502 "parser_cocci_menhir.mly"
     ( (fun arity name pure check_meta ->
       let tok = check_meta(Ast.MetaFieldDecl(arity,name)) in
       !Data.add_field_meta name pure; tok) )
-# 23535 "parser_cocci_menhir.ml"
+# 23559 "parser_cocci_menhir.ml"
           
         in
         
-# 345 "parser_cocci_menhir.mly"
+# 371 "parser_cocci_menhir.mly"
     ( P.create_metadec ar ispure kindfn ids )
-# 23541 "parser_cocci_menhir.ml"
+# 23565 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -23584,18 +23608,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _endpos = _endpos__6_ in
         let _v : 'tv_metadec = let kindfn =
           
-# 480 "parser_cocci_menhir.mly"
+# 506 "parser_cocci_menhir.mly"
     ( (fun arity name pure check_meta ->
       let len = Ast.AnyLen in
       let tok = check_meta(Ast.MetaFieldListDecl(arity,name,len)) in
       !Data.add_field_list_meta name len pure; tok) )
-# 23593 "parser_cocci_menhir.ml"
+# 23617 "parser_cocci_menhir.ml"
           
         in
         
-# 345 "parser_cocci_menhir.mly"
+# 371 "parser_cocci_menhir.mly"
     ( P.create_metadec ar ispure kindfn ids )
-# 23599 "parser_cocci_menhir.ml"
+# 23623 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -23642,17 +23666,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _endpos = _endpos__6_ in
         let _v : 'tv_metadec = let kindfn =
           
-# 485 "parser_cocci_menhir.mly"
+# 511 "parser_cocci_menhir.mly"
     ( (fun arity name pure check_meta ->
       let tok = check_meta(Ast.MetaStmListDecl(arity,name)) in
       !Data.add_stmlist_meta name pure; tok) )
-# 23650 "parser_cocci_menhir.ml"
+# 23674 "parser_cocci_menhir.ml"
           
         in
         
-# 345 "parser_cocci_menhir.mly"
+# 371 "parser_cocci_menhir.mly"
     ( P.create_metadec ar ispure kindfn ids )
-# 23656 "parser_cocci_menhir.ml"
+# 23680 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -23695,18 +23719,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _endpos = _endpos__5_ in
         let _v : 'tv_metadec = let kindfn =
           
-# 489 "parser_cocci_menhir.mly"
+# 515 "parser_cocci_menhir.mly"
     ( (fun arity (_,name) pure check_meta ->
       if arity = Ast.NONE && pure = Ast0.Impure
       then (!Data.add_type_name name; [])
       else raise (Semantic_cocci.Semantic "bad typedef")) )
-# 23704 "parser_cocci_menhir.ml"
+# 23728 "parser_cocci_menhir.ml"
           
         in
         
-# 345 "parser_cocci_menhir.mly"
+# 371 "parser_cocci_menhir.mly"
     ( P.create_metadec ar ispure kindfn ids )
-# 23710 "parser_cocci_menhir.ml"
+# 23734 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -23753,18 +23777,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _endpos = _endpos__6_ in
         let _v : 'tv_metadec = let kindfn =
           
-# 494 "parser_cocci_menhir.mly"
+# 520 "parser_cocci_menhir.mly"
     ( (fun arity (_,name) pure check_meta ->
       if arity = Ast.NONE && pure = Ast0.Impure
       then (!Data.add_declarer_name name; [])
       else raise (Semantic_cocci.Semantic "bad declarer")) )
-# 23762 "parser_cocci_menhir.ml"
+# 23786 "parser_cocci_menhir.ml"
           
         in
         
-# 345 "parser_cocci_menhir.mly"
+# 371 "parser_cocci_menhir.mly"
     ( P.create_metadec ar ispure kindfn ids )
-# 23768 "parser_cocci_menhir.ml"
+# 23792 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -23811,18 +23835,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _endpos = _endpos__6_ in
         let _v : 'tv_metadec = let kindfn =
           
-# 499 "parser_cocci_menhir.mly"
+# 525 "parser_cocci_menhir.mly"
     ( (fun arity (_,name) pure check_meta ->
       if arity = Ast.NONE && pure = Ast0.Impure
       then (!Data.add_iterator_name name; [])
       else raise (Semantic_cocci.Semantic "bad iterator")) )
-# 23820 "parser_cocci_menhir.ml"
+# 23844 "parser_cocci_menhir.ml"
           
         in
         
-# 345 "parser_cocci_menhir.mly"
+# 371 "parser_cocci_menhir.mly"
     ( P.create_metadec ar ispure kindfn ids )
-# 23826 "parser_cocci_menhir.ml"
+# 23850 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -23857,17 +23881,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _endpos = _endpos__4_ in
         let _v : 'tv_metadec = let kindfn =
           
-# 430 "parser_cocci_menhir.mly"
+# 456 "parser_cocci_menhir.mly"
     ( (fun name check_meta seed ->
       let tok = check_meta(Ast.MetaFreshIdDecl(name,seed)) in
       !Data.add_fresh_id_meta name seed; tok) )
-# 23865 "parser_cocci_menhir.ml"
+# 23889 "parser_cocci_menhir.ml"
           
         in
         
-# 348 "parser_cocci_menhir.mly"
+# 374 "parser_cocci_menhir.mly"
     ( P.create_fresh_metadec kindfn ids )
-# 23871 "parser_cocci_menhir.ml"
+# 23895 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -23910,7 +23934,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _endpos = _endpos__5_ in
         let _v : 'tv_metadec = let kindfn =
           
-# 506 "parser_cocci_menhir.mly"
+# 532 "parser_cocci_menhir.mly"
     (
      let idfn arity name pure check_meta constraints =
        let tok = check_meta(Ast.MetaIdDecl(arity,name)) in
@@ -23927,17 +23951,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let tok = check_meta(Ast.MetaIdDecl(arity,name)) in
         !Data.add_virt_id_meta_not_found name pure; tok in
      (idfn,virtfn) )
-# 23931 "parser_cocci_menhir.ml"
+# 23955 "parser_cocci_menhir.ml"
           
         in
         
-# 354 "parser_cocci_menhir.mly"
+# 380 "parser_cocci_menhir.mly"
     ( let (normal,virt) = Common.partition_either (fun x -> x) ids in
     let (idfn,virtfn) = kindfn in
     function cr ->
       (P.create_metadec_with_constraints ar ispure idfn normal cr) @
       (P.create_metadec_virt ar ispure virtfn virt cr) )
-# 23941 "parser_cocci_menhir.ml"
+# 23965 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -23980,17 +24004,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _endpos = _endpos__5_ in
         let _v : 'tv_metadec = let kindfn =
           
-# 525 "parser_cocci_menhir.mly"
+# 551 "parser_cocci_menhir.mly"
     ( (fun arity name pure check_meta constraints ->
       let tok = check_meta(Ast.MetaFuncDecl(arity,name)) in
       !Data.add_func_meta name constraints pure; tok) )
-# 23988 "parser_cocci_menhir.ml"
+# 24012 "parser_cocci_menhir.ml"
           
         in
         
-# 363 "parser_cocci_menhir.mly"
+# 389 "parser_cocci_menhir.mly"
     ( P.create_metadec_with_constraints ar ispure kindfn ids )
-# 23994 "parser_cocci_menhir.ml"
+# 24018 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -24037,18 +24061,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _endpos = _endpos__6_ in
         let _v : 'tv_metadec = let kindfn =
           
-# 529 "parser_cocci_menhir.mly"
+# 555 "parser_cocci_menhir.mly"
     ( (fun arity name pure check_meta constraints ->
       let tok = check_meta(Ast.MetaLocalFuncDecl(arity,name)) in
       !Data.add_local_func_meta name constraints pure;
       tok) )
-# 24046 "parser_cocci_menhir.ml"
+# 24070 "parser_cocci_menhir.ml"
           
         in
         
-# 363 "parser_cocci_menhir.mly"
+# 389 "parser_cocci_menhir.mly"
     ( P.create_metadec_with_constraints ar ispure kindfn ids )
-# 24052 "parser_cocci_menhir.ml"
+# 24076 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -24091,17 +24115,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _endpos = _endpos__5_ in
         let _v : 'tv_metadec = let kindfn =
           
-# 534 "parser_cocci_menhir.mly"
+# 560 "parser_cocci_menhir.mly"
     ( (fun arity name pure check_meta constraints ->
       let tok = check_meta(Ast.MetaDeclarerDecl(arity,name)) in
       !Data.add_declarer_meta name constraints pure; tok) )
-# 24099 "parser_cocci_menhir.ml"
+# 24123 "parser_cocci_menhir.ml"
           
         in
         
-# 363 "parser_cocci_menhir.mly"
+# 389 "parser_cocci_menhir.mly"
     ( P.create_metadec_with_constraints ar ispure kindfn ids )
-# 24105 "parser_cocci_menhir.ml"
+# 24129 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -24144,17 +24168,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _endpos = _endpos__5_ in
         let _v : 'tv_metadec = let kindfn =
           
-# 538 "parser_cocci_menhir.mly"
+# 564 "parser_cocci_menhir.mly"
     ( (fun arity name pure check_meta constraints ->
       let tok = check_meta(Ast.MetaIteratorDecl(arity,name)) in
       !Data.add_iterator_meta name constraints pure; tok) )
-# 24152 "parser_cocci_menhir.ml"
+# 24176 "parser_cocci_menhir.ml"
           
         in
         
-# 363 "parser_cocci_menhir.mly"
+# 389 "parser_cocci_menhir.mly"
     ( P.create_metadec_with_constraints ar ispure kindfn ids )
-# 24158 "parser_cocci_menhir.ml"
+# 24182 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -24197,17 +24221,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _endpos = _endpos__5_ in
         let _v : 'tv_metadec = let kindfn =
           
-# 544 "parser_cocci_menhir.mly"
+# 570 "parser_cocci_menhir.mly"
     ( (fun arity name pure check_meta constraints ->
       let tok = check_meta(Ast.MetaErrDecl(arity,name)) in
       !Data.add_err_meta name constraints pure; tok) )
-# 24205 "parser_cocci_menhir.ml"
+# 24229 "parser_cocci_menhir.ml"
           
         in
         
-# 368 "parser_cocci_menhir.mly"
+# 394 "parser_cocci_menhir.mly"
     ( P.create_metadec_with_constraints ar ispure kindfn ids )
-# 24211 "parser_cocci_menhir.ml"
+# 24235 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -24260,11 +24284,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             
 # 39 "standard.mly"
     ( None )
-# 24264 "parser_cocci_menhir.ml"
+# 24288 "parser_cocci_menhir.ml"
             
           in
           
-# 548 "parser_cocci_menhir.mly"
+# 574 "parser_cocci_menhir.mly"
     ( (fun arity name pure check_meta constraints ->
       match l with
        None ->
@@ -24273,13 +24297,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
       | Some _ ->
          !Data.add_local_idexp_meta ty name constraints pure;
          check_meta(Ast.MetaLocalIdExpDecl(arity,name,ty))) )
-# 24277 "parser_cocci_menhir.ml"
+# 24301 "parser_cocci_menhir.ml"
           
         in
         
-# 368 "parser_cocci_menhir.mly"
+# 394 "parser_cocci_menhir.mly"
     ( P.create_metadec_with_constraints ar ispure kindfn ids )
-# 24283 "parser_cocci_menhir.ml"
+# 24307 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -24340,11 +24364,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             
 # 41 "standard.mly"
     ( Some x )
-# 24344 "parser_cocci_menhir.ml"
+# 24368 "parser_cocci_menhir.ml"
             
           in
           
-# 548 "parser_cocci_menhir.mly"
+# 574 "parser_cocci_menhir.mly"
     ( (fun arity name pure check_meta constraints ->
       match l with
        None ->
@@ -24353,13 +24377,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
       | Some _ ->
          !Data.add_local_idexp_meta ty name constraints pure;
          check_meta(Ast.MetaLocalIdExpDecl(arity,name,ty))) )
-# 24357 "parser_cocci_menhir.ml"
+# 24381 "parser_cocci_menhir.ml"
           
         in
         
-# 368 "parser_cocci_menhir.mly"
+# 394 "parser_cocci_menhir.mly"
     ( P.create_metadec_with_constraints ar ispure kindfn ids )
-# 24363 "parser_cocci_menhir.ml"
+# 24387 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -24416,7 +24440,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let m = m0 in
           let l = l0 in
           
-# 557 "parser_cocci_menhir.mly"
+# 583 "parser_cocci_menhir.mly"
     ( (fun arity name pure check_meta constraints ->
       let ty = Some [P.ty_pointerify Type_cocci.Unknown m] in
       match l with
@@ -24426,13 +24450,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
       | Some _ ->
          !Data.add_local_idexp_meta ty name constraints pure;
          check_meta(Ast.MetaLocalIdExpDecl(arity,name,ty))) )
-# 24430 "parser_cocci_menhir.ml"
+# 24454 "parser_cocci_menhir.ml"
           
         in
         
-# 368 "parser_cocci_menhir.mly"
+# 394 "parser_cocci_menhir.mly"
     ( P.create_metadec_with_constraints ar ispure kindfn ids )
-# 24436 "parser_cocci_menhir.ml"
+# 24460 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -24482,18 +24506,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_metadec = let kindfn =
           let ty = ty0 in
           
-# 567 "parser_cocci_menhir.mly"
+# 593 "parser_cocci_menhir.mly"
     ( (fun arity name pure check_meta constraints ->
       let ty = Some [ty] in
       let tok = check_meta(Ast.MetaExpDecl(arity,name,ty)) in
       !Data.add_exp_meta ty name constraints pure; tok) )
-# 24491 "parser_cocci_menhir.ml"
+# 24515 "parser_cocci_menhir.ml"
           
         in
         
-# 368 "parser_cocci_menhir.mly"
+# 394 "parser_cocci_menhir.mly"
     ( P.create_metadec_with_constraints ar ispure kindfn ids )
-# 24497 "parser_cocci_menhir.ml"
+# 24521 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -24539,21 +24563,21 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             
 # 39 "standard.mly"
     ( None )
-# 24543 "parser_cocci_menhir.ml"
+# 24567 "parser_cocci_menhir.ml"
             
           in
           
-# 572 "parser_cocci_menhir.mly"
+# 598 "parser_cocci_menhir.mly"
     ( (fun arity name pure check_meta constraints ->
       let tok = check_meta(Ast.MetaConstDecl(arity,name,ty)) in
       !Data.add_const_meta ty name constraints pure; tok) )
-# 24551 "parser_cocci_menhir.ml"
+# 24575 "parser_cocci_menhir.ml"
           
         in
         
-# 368 "parser_cocci_menhir.mly"
+# 394 "parser_cocci_menhir.mly"
     ( P.create_metadec_with_constraints ar ispure kindfn ids )
-# 24557 "parser_cocci_menhir.ml"
+# 24581 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -24607,21 +24631,21 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             
 # 41 "standard.mly"
     ( Some x )
-# 24611 "parser_cocci_menhir.ml"
+# 24635 "parser_cocci_menhir.ml"
             
           in
           
-# 572 "parser_cocci_menhir.mly"
+# 598 "parser_cocci_menhir.mly"
     ( (fun arity name pure check_meta constraints ->
       let tok = check_meta(Ast.MetaConstDecl(arity,name,ty)) in
       !Data.add_const_meta ty name constraints pure; tok) )
-# 24619 "parser_cocci_menhir.ml"
+# 24643 "parser_cocci_menhir.ml"
           
         in
         
-# 368 "parser_cocci_menhir.mly"
+# 394 "parser_cocci_menhir.mly"
     ( P.create_metadec_with_constraints ar ispure kindfn ids )
-# 24625 "parser_cocci_menhir.ml"
+# 24649 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -24664,17 +24688,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _endpos = _endpos__5_ in
         let _v : 'tv_metadec = let kindfn =
           
-# 589 "parser_cocci_menhir.mly"
+# 615 "parser_cocci_menhir.mly"
     ( (fun arity name pure check_meta constraints ->
       let tok = check_meta(Ast.MetaExpDecl(arity,name,None)) in
       !Data.add_exp_meta None name constraints pure; tok) )
-# 24672 "parser_cocci_menhir.ml"
+# 24696 "parser_cocci_menhir.ml"
           
         in
         
-# 373 "parser_cocci_menhir.mly"
+# 399 "parser_cocci_menhir.mly"
     ( P.create_metadec_with_constraints ar ispure kindfn ids )
-# 24678 "parser_cocci_menhir.ml"
+# 24702 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -24720,7 +24744,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_metadec = let kindfn =
           let vl = vl0 in
           
-# 593 "parser_cocci_menhir.mly"
+# 619 "parser_cocci_menhir.mly"
     ( (fun arity name pure check_meta constraints ->
       let ty = Some vl in
       (match constraints with
@@ -24745,13 +24769,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
       let tok = check_meta(Ast.MetaExpDecl(arity,name,ty)) in
       !Data.add_exp_meta ty name constraints pure; tok)
     )
-# 24749 "parser_cocci_menhir.ml"
+# 24773 "parser_cocci_menhir.ml"
           
         in
         
-# 373 "parser_cocci_menhir.mly"
+# 399 "parser_cocci_menhir.mly"
     ( P.create_metadec_with_constraints ar ispure kindfn ids )
-# 24755 "parser_cocci_menhir.ml"
+# 24779 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -24793,7 +24817,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_ar_ in
         let _endpos = _endpos__5_ in
         let _v : 'tv_metadec = 
-# 379 "parser_cocci_menhir.mly"
+# 405 "parser_cocci_menhir.mly"
     ( (if !Data.in_generating
       then failwith "position variables not allowed in a generated rule file");
       let kindfn arity name pure check_meta constraints =
@@ -24801,7 +24825,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
       let any = match a with None -> Ast.PER | Some _ -> Ast.ALL in
       !Data.add_pos_meta name constraints any; tok in
     P.create_metadec_with_constraints ar false kindfn ids )
-# 24805 "parser_cocci_menhir.ml"
+# 24829 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -24861,13 +24885,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_ar_ in
         let _endpos = _endpos__9_ in
         let _v : 'tv_metadec = 
-# 389 "parser_cocci_menhir.mly"
+# 415 "parser_cocci_menhir.mly"
     ( P.create_len_metadec ar ispure
        (fun lenname arity name pure check_meta ->
          let tok = check_meta(Ast.MetaParamListDecl(arity,name,lenname)) in
          !Data.add_paramlist_meta name lenname pure; tok)
        len ids )
-# 24871 "parser_cocci_menhir.ml"
+# 24895 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -24927,13 +24951,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_ar_ in
         let _endpos = _endpos__9_ in
         let _v : 'tv_metadec = 
-# 397 "parser_cocci_menhir.mly"
+# 423 "parser_cocci_menhir.mly"
     ( P.create_len_metadec ar ispure
        (fun lenname arity name pure check_meta ->
          let tok = check_meta(Ast.MetaExpListDecl(arity,name,lenname)) in
          !Data.add_explist_meta name lenname pure; tok)
        len ids )
-# 24937 "parser_cocci_menhir.ml"
+# 24961 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -24993,13 +25017,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_ar_ in
         let _endpos = _endpos__9_ in
         let _v : 'tv_metadec = 
-# 405 "parser_cocci_menhir.mly"
+# 431 "parser_cocci_menhir.mly"
     ( P.create_len_metadec ar ispure
        (fun lenname arity name pure check_meta ->
          let tok = check_meta(Ast.MetaFieldListDecl(arity,name,lenname)) in
          !Data.add_field_list_meta name lenname pure; tok)
        len ids )
-# 25003 "parser_cocci_menhir.ml"
+# 25027 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -25059,13 +25083,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_ar_ in
         let _endpos = _endpos__9_ in
         let _v : 'tv_metadec = 
-# 413 "parser_cocci_menhir.mly"
+# 439 "parser_cocci_menhir.mly"
     ( P.create_len_metadec ar ispure
        (fun lenname arity name pure check_meta ->
          let tok = check_meta(Ast.MetaInitListDecl(arity,name,lenname)) in
          !Data.add_initlist_meta name lenname pure; tok)
        len ids )
-# 25069 "parser_cocci_menhir.ml"
+# 25093 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -25095,12 +25119,12 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_metadec = 
-# 419 "parser_cocci_menhir.mly"
+# 445 "parser_cocci_menhir.mly"
     ( (fun _ ->
         let add_sym = fun (nm,_) -> !Data.add_symbol_meta nm in
           List.iter add_sym ids; [])
     )
-# 25104 "parser_cocci_menhir.ml"
+# 25128 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -25122,9 +25146,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_mident = 
-# 2025 "parser_cocci_menhir.mly"
+# 2062 "parser_cocci_menhir.mly"
          ( Ast0.wrap(Ast0.Id(P.id2mcode _1)) )
-# 25128 "parser_cocci_menhir.ml"
+# 25152 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -25146,9 +25170,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_mident = 
-# 2026 "parser_cocci_menhir.mly"
+# 2063 "parser_cocci_menhir.mly"
                          ( _1 )
-# 25152 "parser_cocci_menhir.ml"
+# 25176 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -25167,16 +25191,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 135 "parser_cocci_menhir.mly"
+# 161 "parser_cocci_menhir.mly"
        (Parse_aux.info)
-# 25173 "parser_cocci_menhir.ml"
+# 25197 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_mident = 
-# 2027 "parser_cocci_menhir.mly"
+# 2064 "parser_cocci_menhir.mly"
              ( tmeta_to_ident _1 )
-# 25180 "parser_cocci_menhir.ml"
+# 25204 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -25195,17 +25219,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 130 "parser_cocci_menhir.mly"
+# 156 "parser_cocci_menhir.mly"
        (Parse_aux.midinfo)
-# 25201 "parser_cocci_menhir.ml"
+# 25225 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_mident = 
-# 2029 "parser_cocci_menhir.mly"
+# 2066 "parser_cocci_menhir.mly"
          ( let (nm,constraints,seed,pure,clt) = _1 in
          Ast0.wrap(Ast0.MetaId(P.clt2mcode nm clt,constraints,seed,pure)) )
-# 25209 "parser_cocci_menhir.ml"
+# 25233 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -25233,9 +25257,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_a_ in
         let _endpos = _endpos_b_ in
         let _v : 'tv_midzero_list_ctype_ctype_ = 
-# 2349 "parser_cocci_menhir.mly"
+# 2386 "parser_cocci_menhir.mly"
      ( let (mids,code) = List.split b in (mids,(a::code)) )
-# 25239 "parser_cocci_menhir.ml"
+# 25263 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -25263,9 +25287,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_a_ in
         let _endpos = _endpos_b_ in
         let _v : 'tv_midzero_list_disj_ident_disj_ident_ = 
-# 2349 "parser_cocci_menhir.mly"
+# 2386 "parser_cocci_menhir.mly"
      ( let (mids,code) = List.split b in (mids,(a::code)) )
-# 25269 "parser_cocci_menhir.ml"
+# 25293 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -25293,9 +25317,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_a_ in
         let _endpos = _endpos_b_ in
         let _v : 'tv_midzero_list_eexpr_eexpr_ = 
-# 2349 "parser_cocci_menhir.mly"
+# 2386 "parser_cocci_menhir.mly"
      ( let (mids,code) = List.split b in (mids,(a::code)) )
-# 25299 "parser_cocci_menhir.ml"
+# 25323 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -25323,9 +25347,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_a_ in
         let _endpos = _endpos_b_ in
         let _v : 'tv_midzero_list_expr_eexpr_ = 
-# 2349 "parser_cocci_menhir.mly"
+# 2386 "parser_cocci_menhir.mly"
      ( let (mids,code) = List.split b in (mids,(a::code)) )
-# 25329 "parser_cocci_menhir.ml"
+# 25353 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -25353,9 +25377,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_a_ in
         let _endpos = _endpos_b_ in
         let _v : 'tv_midzero_list_fun_after_stm_fun_after_dots_or_ = 
-# 2349 "parser_cocci_menhir.mly"
+# 2386 "parser_cocci_menhir.mly"
      ( let (mids,code) = List.split b in (mids,(a::code)) )
-# 25359 "parser_cocci_menhir.ml"
+# 25383 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -25383,9 +25407,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_a_ in
         let _endpos = _endpos_b_ in
         let _v : 'tv_midzero_list_fun_start_fun_start_ = 
-# 2349 "parser_cocci_menhir.mly"
+# 2386 "parser_cocci_menhir.mly"
      ( let (mids,code) = List.split b in (mids,(a::code)) )
-# 25389 "parser_cocci_menhir.ml"
+# 25413 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -25413,9 +25437,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_a_ in
         let _endpos = _endpos_b_ in
         let _v : 'tv_midzero_list_mctype_mctype_ = 
-# 2349 "parser_cocci_menhir.mly"
+# 2386 "parser_cocci_menhir.mly"
      ( let (mids,code) = List.split b in (mids,(a::code)) )
-# 25419 "parser_cocci_menhir.ml"
+# 25443 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -25443,9 +25467,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_a_ in
         let _endpos = _endpos_b_ in
         let _v : 'tv_midzero_list_rule_elem_statement_rule_elem_statement_ = 
-# 2349 "parser_cocci_menhir.mly"
+# 2386 "parser_cocci_menhir.mly"
      ( let (mids,code) = List.split b in (mids,(a::code)) )
-# 25449 "parser_cocci_menhir.ml"
+# 25473 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -25473,9 +25497,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_a_ in
         let _endpos = _endpos_b_ in
         let _v : 'tv_midzero_list_statement_statement_ = 
-# 2349 "parser_cocci_menhir.mly"
+# 2386 "parser_cocci_menhir.mly"
      ( let (mids,code) = List.split b in (mids,(a::code)) )
-# 25479 "parser_cocci_menhir.ml"
+# 25503 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -25503,9 +25527,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_a_ in
         let _endpos = _endpos_b_ in
         let _v : 'tv_midzero_list_struct_decl_one_struct_decl_one_ = 
-# 2349 "parser_cocci_menhir.mly"
+# 2386 "parser_cocci_menhir.mly"
      ( let (mids,code) = List.split b in (mids,(a::code)) )
-# 25509 "parser_cocci_menhir.ml"
+# 25533 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -25533,11 +25557,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_f_ in
         let _endpos = _endpos_b_ in
         let _v : 'tv_minus_body = 
-# 846 "parser_cocci_menhir.mly"
+# 872 "parser_cocci_menhir.mly"
     ( match f@b(*@ew*) with
       [] -> raise (Semantic_cocci.Semantic "minus slice can't be empty")
     | code -> code )
-# 25541 "parser_cocci_menhir.ml"
+# 25565 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -25565,11 +25589,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_f_ in
         let _endpos = _endpos_b_ in
         let _v : 'tv_minus_exp_body = 
-# 860 "parser_cocci_menhir.mly"
+# 886 "parser_cocci_menhir.mly"
     ( match f@[b](*@ew*) with
       [] -> raise (Semantic_cocci.Semantic "minus slice can't be empty")
     | code -> code )
-# 25573 "parser_cocci_menhir.ml"
+# 25597 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -25595,13 +25619,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : (
-# 211 "parser_cocci_menhir.mly"
+# 237 "parser_cocci_menhir.mly"
       (Ast0_cocci.rule)
-# 25601 "parser_cocci_menhir.ml"
+# 25625 "parser_cocci_menhir.ml"
         ) = 
-# 251 "parser_cocci_menhir.mly"
+# 277 "parser_cocci_menhir.mly"
                                    ( _1 )
-# 25605 "parser_cocci_menhir.ml"
+# 25629 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -25627,13 +25651,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_m_ in
         let _endpos = _endpos__2_ in
         let _v : (
-# 211 "parser_cocci_menhir.mly"
+# 237 "parser_cocci_menhir.mly"
       (Ast0_cocci.rule)
-# 25633 "parser_cocci_menhir.ml"
+# 25657 "parser_cocci_menhir.ml"
         ) = 
-# 251 "parser_cocci_menhir.mly"
+# 277 "parser_cocci_menhir.mly"
                                                                        ( m )
-# 25637 "parser_cocci_menhir.ml"
+# 25661 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -25659,13 +25683,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_m_ in
         let _endpos = _endpos__2_ in
         let _v : (
-# 211 "parser_cocci_menhir.mly"
+# 237 "parser_cocci_menhir.mly"
       (Ast0_cocci.rule)
-# 25665 "parser_cocci_menhir.ml"
+# 25689 "parser_cocci_menhir.ml"
         ) = 
-# 252 "parser_cocci_menhir.mly"
+# 278 "parser_cocci_menhir.mly"
                          ( m )
-# 25669 "parser_cocci_menhir.ml"
+# 25693 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -25691,13 +25715,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : (
-# 208 "parser_cocci_menhir.mly"
+# 234 "parser_cocci_menhir.mly"
       (Ast0_cocci.rule)
-# 25697 "parser_cocci_menhir.ml"
+# 25721 "parser_cocci_menhir.ml"
         ) = 
-# 247 "parser_cocci_menhir.mly"
+# 273 "parser_cocci_menhir.mly"
                            ( _1 )
-# 25701 "parser_cocci_menhir.ml"
+# 25725 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -25723,13 +25747,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_m_ in
         let _endpos = _endpos__2_ in
         let _v : (
-# 208 "parser_cocci_menhir.mly"
+# 234 "parser_cocci_menhir.mly"
       (Ast0_cocci.rule)
-# 25729 "parser_cocci_menhir.ml"
+# 25753 "parser_cocci_menhir.ml"
         ) = 
-# 247 "parser_cocci_menhir.mly"
+# 273 "parser_cocci_menhir.mly"
                                                            ( m )
-# 25733 "parser_cocci_menhir.ml"
+# 25757 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -25755,13 +25779,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_m_ in
         let _endpos = _endpos__2_ in
         let _v : (
-# 208 "parser_cocci_menhir.mly"
+# 234 "parser_cocci_menhir.mly"
       (Ast0_cocci.rule)
-# 25761 "parser_cocci_menhir.ml"
+# 25785 "parser_cocci_menhir.ml"
         ) = 
-# 248 "parser_cocci_menhir.mly"
+# 274 "parser_cocci_menhir.mly"
                      ( m )
-# 25765 "parser_cocci_menhir.ml"
+# 25789 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -25783,9 +25807,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_minus_start = 
-# 2174 "parser_cocci_menhir.mly"
+# 2211 "parser_cocci_menhir.mly"
                          ( [Ast0.wrap(Ast0.OTHER(_1))] )
-# 25789 "parser_cocci_menhir.ml"
+# 25813 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -25807,9 +25831,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_minus_start = 
-# 2175 "parser_cocci_menhir.mly"
+# 2212 "parser_cocci_menhir.mly"
                          ( [Ast0.wrap(Ast0.OTHER(Ast0.wrap(Ast0.Ty(_1))))] )
-# 25813 "parser_cocci_menhir.ml"
+# 25837 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -25831,9 +25855,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_minus_start = 
-# 2176 "parser_cocci_menhir.mly"
+# 2213 "parser_cocci_menhir.mly"
                     ( [Ast0.wrap(Ast0.OTHER(Ast0.wrap(Ast0.TopInit(_1))))] )
-# 25837 "parser_cocci_menhir.ml"
+# 25861 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -25855,9 +25879,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_minus_start = 
-# 2178 "parser_cocci_menhir.mly"
+# 2215 "parser_cocci_menhir.mly"
     ( List.map (function x -> Ast0.wrap(Ast0.OTHER(x))) _1 )
-# 25861 "parser_cocci_menhir.ml"
+# 25885 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -25882,16 +25906,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let b : 'tv_ctype = Obj.magic b in
         let a : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
-# 25888 "parser_cocci_menhir.ml"
+# 25912 "parser_cocci_menhir.ml"
         ) = Obj.magic a in
         let _startpos = _startpos_a_ in
         let _endpos = _endpos_b_ in
         let _v : 'tv_mzl_ctype_ = 
-# 2352 "parser_cocci_menhir.mly"
+# 2389 "parser_cocci_menhir.mly"
                  ( (P.clt2mcode "|" a, b) )
-# 25895 "parser_cocci_menhir.ml"
+# 25919 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -25916,16 +25940,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let b : 'tv_disj_ident = Obj.magic b in
         let a : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
-# 25922 "parser_cocci_menhir.ml"
+# 25946 "parser_cocci_menhir.ml"
         ) = Obj.magic a in
         let _startpos = _startpos_a_ in
         let _endpos = _endpos_b_ in
         let _v : 'tv_mzl_disj_ident_ = 
-# 2352 "parser_cocci_menhir.mly"
+# 2389 "parser_cocci_menhir.mly"
                  ( (P.clt2mcode "|" a, b) )
-# 25929 "parser_cocci_menhir.ml"
+# 25953 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -25950,16 +25974,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let b : 'tv_eexpr = Obj.magic b in
         let a : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
-# 25956 "parser_cocci_menhir.ml"
+# 25980 "parser_cocci_menhir.ml"
         ) = Obj.magic a in
         let _startpos = _startpos_a_ in
         let _endpos = _endpos_b_ in
         let _v : 'tv_mzl_eexpr_ = 
-# 2352 "parser_cocci_menhir.mly"
+# 2389 "parser_cocci_menhir.mly"
                  ( (P.clt2mcode "|" a, b) )
-# 25963 "parser_cocci_menhir.ml"
+# 25987 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -25984,16 +26008,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let b : 'tv_fun_after_dots_or = Obj.magic b in
         let a : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
-# 25990 "parser_cocci_menhir.ml"
+# 26014 "parser_cocci_menhir.ml"
         ) = Obj.magic a in
         let _startpos = _startpos_a_ in
         let _endpos = _endpos_b_ in
         let _v : 'tv_mzl_fun_after_dots_or_ = 
-# 2352 "parser_cocci_menhir.mly"
+# 2389 "parser_cocci_menhir.mly"
                  ( (P.clt2mcode "|" a, b) )
-# 25997 "parser_cocci_menhir.ml"
+# 26021 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -26018,16 +26042,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let b : 'tv_fun_start = Obj.magic b in
         let a : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
-# 26024 "parser_cocci_menhir.ml"
+# 26048 "parser_cocci_menhir.ml"
         ) = Obj.magic a in
         let _startpos = _startpos_a_ in
         let _endpos = _endpos_b_ in
         let _v : 'tv_mzl_fun_start_ = 
-# 2352 "parser_cocci_menhir.mly"
+# 2389 "parser_cocci_menhir.mly"
                  ( (P.clt2mcode "|" a, b) )
-# 26031 "parser_cocci_menhir.ml"
+# 26055 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -26052,16 +26076,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let b : 'tv_mctype = Obj.magic b in
         let a : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
-# 26058 "parser_cocci_menhir.ml"
+# 26082 "parser_cocci_menhir.ml"
         ) = Obj.magic a in
         let _startpos = _startpos_a_ in
         let _endpos = _endpos_b_ in
         let _v : 'tv_mzl_mctype_ = 
-# 2352 "parser_cocci_menhir.mly"
+# 2389 "parser_cocci_menhir.mly"
                  ( (P.clt2mcode "|" a, b) )
-# 26065 "parser_cocci_menhir.ml"
+# 26089 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -26086,16 +26110,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let b : 'tv_rule_elem_statement = Obj.magic b in
         let a : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
-# 26092 "parser_cocci_menhir.ml"
+# 26116 "parser_cocci_menhir.ml"
         ) = Obj.magic a in
         let _startpos = _startpos_a_ in
         let _endpos = _endpos_b_ in
         let _v : 'tv_mzl_rule_elem_statement_ = 
-# 2352 "parser_cocci_menhir.mly"
+# 2389 "parser_cocci_menhir.mly"
                  ( (P.clt2mcode "|" a, b) )
-# 26099 "parser_cocci_menhir.ml"
+# 26123 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -26120,16 +26144,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let b : 'tv_statement = Obj.magic b in
         let a : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
-# 26126 "parser_cocci_menhir.ml"
+# 26150 "parser_cocci_menhir.ml"
         ) = Obj.magic a in
         let _startpos = _startpos_a_ in
         let _endpos = _endpos_b_ in
         let _v : 'tv_mzl_statement_ = 
-# 2352 "parser_cocci_menhir.mly"
+# 2389 "parser_cocci_menhir.mly"
                  ( (P.clt2mcode "|" a, b) )
-# 26133 "parser_cocci_menhir.ml"
+# 26157 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -26154,16 +26178,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let b : 'tv_struct_decl_one = Obj.magic b in
         let a : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
-# 26160 "parser_cocci_menhir.ml"
+# 26184 "parser_cocci_menhir.ml"
         ) = Obj.magic a in
         let _startpos = _startpos_a_ in
         let _endpos = _endpos_b_ in
         let _v : 'tv_mzl_struct_decl_one_ = 
-# 2352 "parser_cocci_menhir.mly"
+# 2389 "parser_cocci_menhir.mly"
                  ( (P.clt2mcode "|" a, b) )
-# 26167 "parser_cocci_menhir.ml"
+# 26191 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -26185,9 +26209,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_name_opt_decl = 
-# 1086 "parser_cocci_menhir.mly"
+# 1112 "parser_cocci_menhir.mly"
             ( _1 )
-# 26191 "parser_cocci_menhir.ml"
+# 26215 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -26236,43 +26260,43 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let rp1 : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
-# 26242 "parser_cocci_menhir.ml"
+# 26266 "parser_cocci_menhir.ml"
         ) = Obj.magic rp1 in
         let d : 'tv_decl_list_name_opt_decl_ = Obj.magic d in
         let lp1 : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
-# 26248 "parser_cocci_menhir.ml"
+# 26272 "parser_cocci_menhir.ml"
         ) = Obj.magic lp1 in
         let rp : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
-# 26253 "parser_cocci_menhir.ml"
+# 26277 "parser_cocci_menhir.ml"
         ) = Obj.magic rp in
         let s : (
-# 171 "parser_cocci_menhir.mly"
+# 197 "parser_cocci_menhir.mly"
        (Data.clt)
-# 26258 "parser_cocci_menhir.ml"
+# 26282 "parser_cocci_menhir.ml"
         ) = Obj.magic s in
         let lp : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
-# 26263 "parser_cocci_menhir.ml"
+# 26287 "parser_cocci_menhir.ml"
         ) = Obj.magic lp in
         let t : 'tv_ctype = Obj.magic t in
         let _startpos = _startpos_t_ in
         let _endpos = _endpos_rp1_ in
         let _v : 'tv_name_opt_decl = 
-# 1089 "parser_cocci_menhir.mly"
+# 1115 "parser_cocci_menhir.mly"
         ( let fnptr =
          Ast0.wrap
            (Ast0.FunctionPointer
               (t,P.clt2mcode "(" lp,P.clt2mcode "*" s,P.clt2mcode ")" rp,
                P.clt2mcode "(" lp1,d,P.clt2mcode ")" rp1)) in
        Ast0.wrap(Ast0.Param(fnptr, None)) )
-# 26276 "parser_cocci_menhir.ml"
+# 26300 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -26300,9 +26324,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_nest_after_dots = 
-# 2294 "parser_cocci_menhir.mly"
+# 2331 "parser_cocci_menhir.mly"
                                      (_1@_2)
-# 26306 "parser_cocci_menhir.ml"
+# 26330 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -26328,9 +26352,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_nest_after_dots = 
-# 2295 "parser_cocci_menhir.mly"
+# 2332 "parser_cocci_menhir.mly"
                                 (_2)
-# 26334 "parser_cocci_menhir.ml"
+# 26358 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -26358,9 +26382,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_nest_after_dots = 
-# 2296 "parser_cocci_menhir.mly"
+# 2333 "parser_cocci_menhir.mly"
                                 ((Ast0.wrap(Ast0.Exp(_1)))::_2)
-# 26364 "parser_cocci_menhir.ml"
+# 26388 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -26375,9 +26399,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in
         let _endpos = _startpos in
         let _v : 'tv_nest_after_exp = 
-# 2304 "parser_cocci_menhir.mly"
+# 2341 "parser_cocci_menhir.mly"
                                 ([])
-# 26381 "parser_cocci_menhir.ml"
+# 26405 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -26405,9 +26429,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_nest_after_exp = 
-# 2305 "parser_cocci_menhir.mly"
+# 2342 "parser_cocci_menhir.mly"
                                 (_1::_2)
-# 26411 "parser_cocci_menhir.ml"
+# 26435 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -26422,9 +26446,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in
         let _endpos = _startpos in
         let _v : 'tv_nest_after_stm = 
-# 2299 "parser_cocci_menhir.mly"
+# 2336 "parser_cocci_menhir.mly"
                                 ([])
-# 26428 "parser_cocci_menhir.ml"
+# 26452 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -26452,9 +26476,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_nest_after_stm = 
-# 2300 "parser_cocci_menhir.mly"
+# 2337 "parser_cocci_menhir.mly"
                                 (_1::_2)
-# 26458 "parser_cocci_menhir.ml"
+# 26482 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -26482,9 +26506,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_nest_after_stm = 
-# 2301 "parser_cocci_menhir.mly"
+# 2338 "parser_cocci_menhir.mly"
                                 (_1@_2)
-# 26488 "parser_cocci_menhir.ml"
+# 26512 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -26513,24 +26537,24 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let c : (
-# 145 "parser_cocci_menhir.mly"
+# 171 "parser_cocci_menhir.mly"
        (Data.clt)
-# 26519 "parser_cocci_menhir.ml"
+# 26543 "parser_cocci_menhir.ml"
         ) = Obj.magic c in
         let e : 'tv_expr_dots_TEllipsis_ = Obj.magic e in
         let _1 : (
-# 145 "parser_cocci_menhir.mly"
+# 171 "parser_cocci_menhir.mly"
        (Data.clt)
-# 26525 "parser_cocci_menhir.ml"
+# 26549 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos_c_ in
         let _v : 'tv_nest_expressions = 
-# 1491 "parser_cocci_menhir.mly"
+# 1518 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.NestExpr(P.clt2mcode "<..." _1,
                              Ast0.wrap(Ast0.DOTS(e (P.mkedots "..."))),
                              P.clt2mcode "...>" c, None, false)) )
-# 26534 "parser_cocci_menhir.ml"
+# 26558 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -26559,24 +26583,24 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let c : (
-# 145 "parser_cocci_menhir.mly"
+# 171 "parser_cocci_menhir.mly"
        (Data.clt)
-# 26565 "parser_cocci_menhir.ml"
+# 26589 "parser_cocci_menhir.ml"
         ) = Obj.magic c in
         let e : 'tv_expr_dots_TEllipsis_ = Obj.magic e in
         let _1 : (
-# 145 "parser_cocci_menhir.mly"
+# 171 "parser_cocci_menhir.mly"
        (Data.clt)
-# 26571 "parser_cocci_menhir.ml"
+# 26595 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos_c_ in
         let _v : 'tv_nest_expressions = 
-# 1495 "parser_cocci_menhir.mly"
+# 1522 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.NestExpr(P.clt2mcode "<+..." _1,
                              Ast0.wrap(Ast0.DOTS(e (P.mkedots "..."))),
                              P.clt2mcode "...+>" c, None, true)) )
-# 26580 "parser_cocci_menhir.ml"
+# 26604 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -26595,16 +26619,108 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 135 "parser_cocci_menhir.mly"
+# 161 "parser_cocci_menhir.mly"
        (Parse_aux.info)
-# 26601 "parser_cocci_menhir.ml"
+# 26625 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_nest_expressions = 
-# 1498 "parser_cocci_menhir.mly"
+# 1525 "parser_cocci_menhir.mly"
         ( tmeta_to_exp _1 )
-# 26608 "parser_cocci_menhir.ml"
+# 26632 "parser_cocci_menhir.ml"
+         in
+        _menhir_env.MenhirLib.EngineTypes.stack <- {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+          });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.semv = c;
+          MenhirLib.EngineTypes.startp = _startpos_c_;
+          MenhirLib.EngineTypes.endp = _endpos_c_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.semv = e;
+            MenhirLib.EngineTypes.startp = _startpos_e_;
+            MenhirLib.EngineTypes.endp = _endpos_e_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          } = _menhir_stack in
+        let c : (
+# 171 "parser_cocci_menhir.mly"
+       (Data.clt)
+# 26663 "parser_cocci_menhir.ml"
+        ) = Obj.magic c in
+        let e : 'tv_expr_dots_TEllipsis_ = Obj.magic e in
+        let _1 : (
+# 171 "parser_cocci_menhir.mly"
+       (Data.clt)
+# 26669 "parser_cocci_menhir.ml"
+        ) = Obj.magic _1 in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_c_ in
+        let _v : 'tv_nest_expressions_only = 
+# 1529 "parser_cocci_menhir.mly"
+    ( Ast0.wrap(Ast0.NestExpr(P.clt2mcode "<..." _1,
+                             Ast0.wrap(Ast0.DOTS(e (P.mkedots "..."))),
+                             P.clt2mcode "...>" c, None, false)) )
+# 26678 "parser_cocci_menhir.ml"
+         in
+        _menhir_env.MenhirLib.EngineTypes.stack <- {
+          MenhirLib.EngineTypes.state = _menhir_s;
+          MenhirLib.EngineTypes.semv = Obj.repr _v;
+          MenhirLib.EngineTypes.startp = _startpos;
+          MenhirLib.EngineTypes.endp = _endpos;
+          MenhirLib.EngineTypes.next = _menhir_stack;
+          });
+      (fun _menhir_env ->
+        let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in
+        let {
+          MenhirLib.EngineTypes.semv = c;
+          MenhirLib.EngineTypes.startp = _startpos_c_;
+          MenhirLib.EngineTypes.endp = _endpos_c_;
+          MenhirLib.EngineTypes.next = {
+            MenhirLib.EngineTypes.semv = e;
+            MenhirLib.EngineTypes.startp = _startpos_e_;
+            MenhirLib.EngineTypes.endp = _endpos_e_;
+            MenhirLib.EngineTypes.next = {
+              MenhirLib.EngineTypes.state = _menhir_s;
+              MenhirLib.EngineTypes.semv = _1;
+              MenhirLib.EngineTypes.startp = _startpos__1_;
+              MenhirLib.EngineTypes.endp = _endpos__1_;
+              MenhirLib.EngineTypes.next = _menhir_stack;
+              };
+            };
+          } = _menhir_stack in
+        let c : (
+# 171 "parser_cocci_menhir.mly"
+       (Data.clt)
+# 26709 "parser_cocci_menhir.ml"
+        ) = Obj.magic c in
+        let e : 'tv_expr_dots_TEllipsis_ = Obj.magic e in
+        let _1 : (
+# 171 "parser_cocci_menhir.mly"
+       (Data.clt)
+# 26715 "parser_cocci_menhir.ml"
+        ) = Obj.magic _1 in
+        let _startpos = _startpos__1_ in
+        let _endpos = _endpos_c_ in
+        let _v : 'tv_nest_expressions_only = 
+# 1533 "parser_cocci_menhir.mly"
+    ( Ast0.wrap(Ast0.NestExpr(P.clt2mcode "<+..." _1,
+                             Ast0.wrap(Ast0.DOTS(e (P.mkedots "..."))),
+                             P.clt2mcode "...+>" c, None, true)) )
+# 26724 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -26626,9 +26742,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_nest_start = 
-# 2291 "parser_cocci_menhir.mly"
+# 2328 "parser_cocci_menhir.mly"
                    ( Ast0.wrap(Ast0.DOTS(_1)) )
-# 26632 "parser_cocci_menhir.ml"
+# 26748 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -26648,13 +26764,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : (
-# 242 "parser_cocci_menhir.mly"
+# 268 "parser_cocci_menhir.mly"
       (unit)
-# 26654 "parser_cocci_menhir.ml"
+# 26770 "parser_cocci_menhir.ml"
         ) = 
-# 2419 "parser_cocci_menhir.mly"
+# 2456 "parser_cocci_menhir.mly"
                     ( () )
-# 26658 "parser_cocci_menhir.ml"
+# 26774 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -26678,13 +26794,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : (
-# 242 "parser_cocci_menhir.mly"
+# 268 "parser_cocci_menhir.mly"
       (unit)
-# 26684 "parser_cocci_menhir.ml"
+# 26800 "parser_cocci_menhir.ml"
         ) = 
-# 2420 "parser_cocci_menhir.mly"
+# 2457 "parser_cocci_menhir.mly"
                     ( () )
-# 26688 "parser_cocci_menhir.ml"
+# 26804 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -26704,13 +26820,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : (
-# 242 "parser_cocci_menhir.mly"
+# 268 "parser_cocci_menhir.mly"
       (unit)
-# 26710 "parser_cocci_menhir.ml"
+# 26826 "parser_cocci_menhir.ml"
         ) = 
-# 2421 "parser_cocci_menhir.mly"
+# 2458 "parser_cocci_menhir.mly"
                     ( () )
-# 26714 "parser_cocci_menhir.ml"
+# 26830 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -26738,10 +26854,10 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_g_ in
         let _endpos = _endpos_dg_ in
         let _v : 'tv_no_dot_start_end_dexpr_edots_when_TEllipsis_eexpr__ = 
-# 1738 "parser_cocci_menhir.mly"
+# 1775 "parser_cocci_menhir.mly"
   ( function dot_builder ->
       g :: (List.concat(List.map (function (d,g) -> [dot_builder d;g]) dg)) )
-# 26745 "parser_cocci_menhir.ml"
+# 26861 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -26760,16 +26876,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let x : (
-# 171 "parser_cocci_menhir.mly"
+# 197 "parser_cocci_menhir.mly"
        (Data.clt)
-# 26766 "parser_cocci_menhir.ml"
+# 26882 "parser_cocci_menhir.ml"
         ) = Obj.magic x in
         let _startpos = _startpos_x_ in
         let _endpos = _endpos_x_ in
         let _v : 'tv_nonempty_list_TMul_ = 
 # 124 "standard.mly"
     ( [ x ] )
-# 26773 "parser_cocci_menhir.ml"
+# 26889 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -26794,16 +26910,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let xs : 'tv_nonempty_list_TMul_ = Obj.magic xs in
         let x : (
-# 171 "parser_cocci_menhir.mly"
+# 197 "parser_cocci_menhir.mly"
        (Data.clt)
-# 26800 "parser_cocci_menhir.ml"
+# 26916 "parser_cocci_menhir.ml"
         ) = Obj.magic x in
         let _startpos = _startpos_x_ in
         let _endpos = _endpos_xs_ in
         let _v : 'tv_nonempty_list_TMul_ = 
 # 126 "standard.mly"
     ( x :: xs )
-# 26807 "parser_cocci_menhir.ml"
+# 26923 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -26825,9 +26941,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_nonempty_list_start_aexpr_TEllipsis_ = 
-# 2101 "parser_cocci_menhir.mly"
+# 2138 "parser_cocci_menhir.mly"
        ( fun build_dots build_comma -> [_1] )
-# 26831 "parser_cocci_menhir.ml"
+# 26947 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -26851,18 +26967,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _2 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 26857 "parser_cocci_menhir.ml"
+# 26973 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_aexpr = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_nonempty_list_start_aexpr_TEllipsis_ = 
-# 2103 "parser_cocci_menhir.mly"
+# 2140 "parser_cocci_menhir.mly"
     ( fun build_dots build_comma ->
       _1::[Ast0.wrap(build_comma(P.clt2mcode "," _2))] )
-# 26866 "parser_cocci_menhir.ml"
+# 26982 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -26892,19 +27008,19 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_nonempty_list_start_aexpr_TEllipsis_ = Obj.magic _3 in
         let _2 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 26898 "parser_cocci_menhir.ml"
+# 27014 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_aexpr = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_nonempty_list_start_aexpr_TEllipsis_ = 
-# 2106 "parser_cocci_menhir.mly"
+# 2143 "parser_cocci_menhir.mly"
     ( fun build_dots build_comma ->
       _1::(Ast0.wrap(build_comma(P.clt2mcode "," _2)))::
       (_3 build_dots build_comma) )
-# 26908 "parser_cocci_menhir.ml"
+# 27024 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -26930,9 +27046,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_nonempty_list_start_aexpr_TEllipsis_ = 
-# 2109 "parser_cocci_menhir.mly"
+# 2146 "parser_cocci_menhir.mly"
                                             ( _2 )
-# 26936 "parser_cocci_menhir.ml"
+# 27052 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -26951,16 +27067,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let d : (
-# 145 "parser_cocci_menhir.mly"
+# 171 "parser_cocci_menhir.mly"
        (Data.clt)
-# 26957 "parser_cocci_menhir.ml"
+# 27073 "parser_cocci_menhir.ml"
         ) = Obj.magic d in
         let _startpos = _startpos_d_ in
         let _endpos = _endpos_d_ in
         let _v : 'tv_nonempty_list_start_aexpr_TEllipsis_ = 
-# 2110 "parser_cocci_menhir.mly"
+# 2147 "parser_cocci_menhir.mly"
            ( fun build_dots build_comma -> [(build_dots "..." d)] )
-# 26964 "parser_cocci_menhir.ml"
+# 27080 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -26984,22 +27100,22 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _2 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 26990 "parser_cocci_menhir.ml"
+# 27106 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let d : (
-# 145 "parser_cocci_menhir.mly"
+# 171 "parser_cocci_menhir.mly"
        (Data.clt)
-# 26995 "parser_cocci_menhir.ml"
+# 27111 "parser_cocci_menhir.ml"
         ) = Obj.magic d in
         let _startpos = _startpos_d_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_nonempty_list_start_aexpr_TEllipsis_ = 
-# 2112 "parser_cocci_menhir.mly"
+# 2149 "parser_cocci_menhir.mly"
       ( fun build_dots build_comma ->
        [(build_dots "..." d);Ast0.wrap(build_comma(P.clt2mcode "," _2))] )
-# 27003 "parser_cocci_menhir.ml"
+# 27119 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -27029,24 +27145,24 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let r : 'tv_continue_list_aexpr_TEllipsis_ = Obj.magic r in
         let _2 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 27035 "parser_cocci_menhir.ml"
+# 27151 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let d : (
-# 145 "parser_cocci_menhir.mly"
+# 171 "parser_cocci_menhir.mly"
        (Data.clt)
-# 27040 "parser_cocci_menhir.ml"
+# 27156 "parser_cocci_menhir.ml"
         ) = Obj.magic d in
         let _startpos = _startpos_d_ in
         let _endpos = _endpos_r_ in
         let _v : 'tv_nonempty_list_start_aexpr_TEllipsis_ = 
-# 2115 "parser_cocci_menhir.mly"
+# 2152 "parser_cocci_menhir.mly"
     ( fun build_dots build_comma ->
       (build_dots "..." d)::
       (Ast0.wrap(build_comma(P.clt2mcode "," _2)))::
       (r build_dots build_comma) )
-# 27050 "parser_cocci_menhir.ml"
+# 27166 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -27068,9 +27184,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_nonempty_list_start_dparam_TEllipsis_ = 
-# 2101 "parser_cocci_menhir.mly"
+# 2138 "parser_cocci_menhir.mly"
        ( fun build_dots build_comma -> [_1] )
-# 27074 "parser_cocci_menhir.ml"
+# 27190 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -27094,18 +27210,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _2 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 27100 "parser_cocci_menhir.ml"
+# 27216 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_dparam = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_nonempty_list_start_dparam_TEllipsis_ = 
-# 2103 "parser_cocci_menhir.mly"
+# 2140 "parser_cocci_menhir.mly"
     ( fun build_dots build_comma ->
       _1::[Ast0.wrap(build_comma(P.clt2mcode "," _2))] )
-# 27109 "parser_cocci_menhir.ml"
+# 27225 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -27135,19 +27251,19 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_nonempty_list_start_dparam_TEllipsis_ = Obj.magic _3 in
         let _2 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 27141 "parser_cocci_menhir.ml"
+# 27257 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_dparam = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_nonempty_list_start_dparam_TEllipsis_ = 
-# 2106 "parser_cocci_menhir.mly"
+# 2143 "parser_cocci_menhir.mly"
     ( fun build_dots build_comma ->
       _1::(Ast0.wrap(build_comma(P.clt2mcode "," _2)))::
       (_3 build_dots build_comma) )
-# 27151 "parser_cocci_menhir.ml"
+# 27267 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -27173,9 +27289,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_nonempty_list_start_dparam_TEllipsis_ = 
-# 2109 "parser_cocci_menhir.mly"
+# 2146 "parser_cocci_menhir.mly"
                                             ( _2 )
-# 27179 "parser_cocci_menhir.ml"
+# 27295 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -27194,16 +27310,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let d : (
-# 145 "parser_cocci_menhir.mly"
+# 171 "parser_cocci_menhir.mly"
        (Data.clt)
-# 27200 "parser_cocci_menhir.ml"
+# 27316 "parser_cocci_menhir.ml"
         ) = Obj.magic d in
         let _startpos = _startpos_d_ in
         let _endpos = _endpos_d_ in
         let _v : 'tv_nonempty_list_start_dparam_TEllipsis_ = 
-# 2110 "parser_cocci_menhir.mly"
+# 2147 "parser_cocci_menhir.mly"
            ( fun build_dots build_comma -> [(build_dots "..." d)] )
-# 27207 "parser_cocci_menhir.ml"
+# 27323 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -27227,22 +27343,22 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _2 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 27233 "parser_cocci_menhir.ml"
+# 27349 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let d : (
-# 145 "parser_cocci_menhir.mly"
+# 171 "parser_cocci_menhir.mly"
        (Data.clt)
-# 27238 "parser_cocci_menhir.ml"
+# 27354 "parser_cocci_menhir.ml"
         ) = Obj.magic d in
         let _startpos = _startpos_d_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_nonempty_list_start_dparam_TEllipsis_ = 
-# 2112 "parser_cocci_menhir.mly"
+# 2149 "parser_cocci_menhir.mly"
       ( fun build_dots build_comma ->
        [(build_dots "..." d);Ast0.wrap(build_comma(P.clt2mcode "," _2))] )
-# 27246 "parser_cocci_menhir.ml"
+# 27362 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -27272,24 +27388,24 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let r : 'tv_continue_list_dparam_TEllipsis_ = Obj.magic r in
         let _2 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 27278 "parser_cocci_menhir.ml"
+# 27394 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let d : (
-# 145 "parser_cocci_menhir.mly"
+# 171 "parser_cocci_menhir.mly"
        (Data.clt)
-# 27283 "parser_cocci_menhir.ml"
+# 27399 "parser_cocci_menhir.ml"
         ) = Obj.magic d in
         let _startpos = _startpos_d_ in
         let _endpos = _endpos_r_ in
         let _v : 'tv_nonempty_list_start_dparam_TEllipsis_ = 
-# 2115 "parser_cocci_menhir.mly"
+# 2152 "parser_cocci_menhir.mly"
     ( fun build_dots build_comma ->
       (build_dots "..." d)::
       (Ast0.wrap(build_comma(P.clt2mcode "," _2)))::
       (r build_dots build_comma) )
-# 27293 "parser_cocci_menhir.ml"
+# 27409 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -27311,9 +27427,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_nonempty_list_start_enum_decl_one_edots_when_TEllipsis_enum_decl_one__ = 
-# 2101 "parser_cocci_menhir.mly"
+# 2138 "parser_cocci_menhir.mly"
        ( fun build_dots build_comma -> [_1] )
-# 27317 "parser_cocci_menhir.ml"
+# 27433 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -27337,18 +27453,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _2 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 27343 "parser_cocci_menhir.ml"
+# 27459 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_enum_decl_one = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_nonempty_list_start_enum_decl_one_edots_when_TEllipsis_enum_decl_one__ = 
-# 2103 "parser_cocci_menhir.mly"
+# 2140 "parser_cocci_menhir.mly"
     ( fun build_dots build_comma ->
       _1::[Ast0.wrap(build_comma(P.clt2mcode "," _2))] )
-# 27352 "parser_cocci_menhir.ml"
+# 27468 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -27378,19 +27494,19 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_nonempty_list_start_enum_decl_one_edots_when_TEllipsis_enum_decl_one__ = Obj.magic _3 in
         let _2 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 27384 "parser_cocci_menhir.ml"
+# 27500 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_enum_decl_one = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_nonempty_list_start_enum_decl_one_edots_when_TEllipsis_enum_decl_one__ = 
-# 2106 "parser_cocci_menhir.mly"
+# 2143 "parser_cocci_menhir.mly"
     ( fun build_dots build_comma ->
       _1::(Ast0.wrap(build_comma(P.clt2mcode "," _2)))::
       (_3 build_dots build_comma) )
-# 27394 "parser_cocci_menhir.ml"
+# 27510 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -27416,9 +27532,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_nonempty_list_start_enum_decl_one_edots_when_TEllipsis_enum_decl_one__ = 
-# 2109 "parser_cocci_menhir.mly"
+# 2146 "parser_cocci_menhir.mly"
                                             ( _2 )
-# 27422 "parser_cocci_menhir.ml"
+# 27538 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -27440,9 +27556,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_d_ in
         let _endpos = _endpos_d_ in
         let _v : 'tv_nonempty_list_start_enum_decl_one_edots_when_TEllipsis_enum_decl_one__ = 
-# 2110 "parser_cocci_menhir.mly"
+# 2147 "parser_cocci_menhir.mly"
            ( fun build_dots build_comma -> [(build_dots "..." d)] )
-# 27446 "parser_cocci_menhir.ml"
+# 27562 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -27466,18 +27582,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _2 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 27472 "parser_cocci_menhir.ml"
+# 27588 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let d : 'tv_edots_when_TEllipsis_enum_decl_one_ = Obj.magic d in
         let _startpos = _startpos_d_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_nonempty_list_start_enum_decl_one_edots_when_TEllipsis_enum_decl_one__ = 
-# 2112 "parser_cocci_menhir.mly"
+# 2149 "parser_cocci_menhir.mly"
       ( fun build_dots build_comma ->
        [(build_dots "..." d);Ast0.wrap(build_comma(P.clt2mcode "," _2))] )
-# 27481 "parser_cocci_menhir.ml"
+# 27597 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -27507,20 +27623,20 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let r : 'tv_continue_list_enum_decl_one_edots_when_TEllipsis_enum_decl_one__ = Obj.magic r in
         let _2 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 27513 "parser_cocci_menhir.ml"
+# 27629 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let d : 'tv_edots_when_TEllipsis_enum_decl_one_ = Obj.magic d in
         let _startpos = _startpos_d_ in
         let _endpos = _endpos_r_ in
         let _v : 'tv_nonempty_list_start_enum_decl_one_edots_when_TEllipsis_enum_decl_one__ = 
-# 2115 "parser_cocci_menhir.mly"
+# 2152 "parser_cocci_menhir.mly"
     ( fun build_dots build_comma ->
       (build_dots "..." d)::
       (Ast0.wrap(build_comma(P.clt2mcode "," _2)))::
       (r build_dots build_comma) )
-# 27524 "parser_cocci_menhir.ml"
+# 27640 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -27542,9 +27658,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_nonempty_list_start_initialize2_edots_when_TEllipsis_initialize__ = 
-# 2101 "parser_cocci_menhir.mly"
+# 2138 "parser_cocci_menhir.mly"
        ( fun build_dots build_comma -> [_1] )
-# 27548 "parser_cocci_menhir.ml"
+# 27664 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -27568,18 +27684,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _2 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 27574 "parser_cocci_menhir.ml"
+# 27690 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_initialize2 = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_nonempty_list_start_initialize2_edots_when_TEllipsis_initialize__ = 
-# 2103 "parser_cocci_menhir.mly"
+# 2140 "parser_cocci_menhir.mly"
     ( fun build_dots build_comma ->
       _1::[Ast0.wrap(build_comma(P.clt2mcode "," _2))] )
-# 27583 "parser_cocci_menhir.ml"
+# 27699 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -27609,19 +27725,19 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_nonempty_list_start_initialize2_edots_when_TEllipsis_initialize__ = Obj.magic _3 in
         let _2 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 27615 "parser_cocci_menhir.ml"
+# 27731 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_initialize2 = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_nonempty_list_start_initialize2_edots_when_TEllipsis_initialize__ = 
-# 2106 "parser_cocci_menhir.mly"
+# 2143 "parser_cocci_menhir.mly"
     ( fun build_dots build_comma ->
       _1::(Ast0.wrap(build_comma(P.clt2mcode "," _2)))::
       (_3 build_dots build_comma) )
-# 27625 "parser_cocci_menhir.ml"
+# 27741 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -27647,9 +27763,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_nonempty_list_start_initialize2_edots_when_TEllipsis_initialize__ = 
-# 2109 "parser_cocci_menhir.mly"
+# 2146 "parser_cocci_menhir.mly"
                                             ( _2 )
-# 27653 "parser_cocci_menhir.ml"
+# 27769 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -27671,9 +27787,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_d_ in
         let _endpos = _endpos_d_ in
         let _v : 'tv_nonempty_list_start_initialize2_edots_when_TEllipsis_initialize__ = 
-# 2110 "parser_cocci_menhir.mly"
+# 2147 "parser_cocci_menhir.mly"
            ( fun build_dots build_comma -> [(build_dots "..." d)] )
-# 27677 "parser_cocci_menhir.ml"
+# 27793 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -27697,18 +27813,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _2 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 27703 "parser_cocci_menhir.ml"
+# 27819 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let d : 'tv_edots_when_TEllipsis_initialize_ = Obj.magic d in
         let _startpos = _startpos_d_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_nonempty_list_start_initialize2_edots_when_TEllipsis_initialize__ = 
-# 2112 "parser_cocci_menhir.mly"
+# 2149 "parser_cocci_menhir.mly"
       ( fun build_dots build_comma ->
        [(build_dots "..." d);Ast0.wrap(build_comma(P.clt2mcode "," _2))] )
-# 27712 "parser_cocci_menhir.ml"
+# 27828 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -27738,20 +27854,20 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let r : 'tv_continue_list_initialize2_edots_when_TEllipsis_initialize__ = Obj.magic r in
         let _2 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 27744 "parser_cocci_menhir.ml"
+# 27860 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let d : 'tv_edots_when_TEllipsis_initialize_ = Obj.magic d in
         let _startpos = _startpos_d_ in
         let _endpos = _endpos_r_ in
         let _v : 'tv_nonempty_list_start_initialize2_edots_when_TEllipsis_initialize__ = 
-# 2115 "parser_cocci_menhir.mly"
+# 2152 "parser_cocci_menhir.mly"
     ( fun build_dots build_comma ->
       (build_dots "..." d)::
       (Ast0.wrap(build_comma(P.clt2mcode "," _2)))::
       (r build_dots build_comma) )
-# 27755 "parser_cocci_menhir.ml"
+# 27871 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -27773,9 +27889,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_nonempty_list_start_one_dec_decl__TEllipsis_ = 
-# 2101 "parser_cocci_menhir.mly"
+# 2138 "parser_cocci_menhir.mly"
        ( fun build_dots build_comma -> [_1] )
-# 27779 "parser_cocci_menhir.ml"
+# 27895 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -27799,18 +27915,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _2 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 27805 "parser_cocci_menhir.ml"
+# 27921 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_one_dec_decl_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_nonempty_list_start_one_dec_decl__TEllipsis_ = 
-# 2103 "parser_cocci_menhir.mly"
+# 2140 "parser_cocci_menhir.mly"
     ( fun build_dots build_comma ->
       _1::[Ast0.wrap(build_comma(P.clt2mcode "," _2))] )
-# 27814 "parser_cocci_menhir.ml"
+# 27930 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -27840,19 +27956,19 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_nonempty_list_start_one_dec_decl__TEllipsis_ = Obj.magic _3 in
         let _2 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 27846 "parser_cocci_menhir.ml"
+# 27962 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_one_dec_decl_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_nonempty_list_start_one_dec_decl__TEllipsis_ = 
-# 2106 "parser_cocci_menhir.mly"
+# 2143 "parser_cocci_menhir.mly"
     ( fun build_dots build_comma ->
       _1::(Ast0.wrap(build_comma(P.clt2mcode "," _2)))::
       (_3 build_dots build_comma) )
-# 27856 "parser_cocci_menhir.ml"
+# 27972 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -27878,9 +27994,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_nonempty_list_start_one_dec_decl__TEllipsis_ = 
-# 2109 "parser_cocci_menhir.mly"
+# 2146 "parser_cocci_menhir.mly"
                                             ( _2 )
-# 27884 "parser_cocci_menhir.ml"
+# 28000 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -27899,16 +28015,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let d : (
-# 145 "parser_cocci_menhir.mly"
+# 171 "parser_cocci_menhir.mly"
        (Data.clt)
-# 27905 "parser_cocci_menhir.ml"
+# 28021 "parser_cocci_menhir.ml"
         ) = Obj.magic d in
         let _startpos = _startpos_d_ in
         let _endpos = _endpos_d_ in
         let _v : 'tv_nonempty_list_start_one_dec_decl__TEllipsis_ = 
-# 2110 "parser_cocci_menhir.mly"
+# 2147 "parser_cocci_menhir.mly"
            ( fun build_dots build_comma -> [(build_dots "..." d)] )
-# 27912 "parser_cocci_menhir.ml"
+# 28028 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -27932,22 +28048,22 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _2 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 27938 "parser_cocci_menhir.ml"
+# 28054 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let d : (
-# 145 "parser_cocci_menhir.mly"
+# 171 "parser_cocci_menhir.mly"
        (Data.clt)
-# 27943 "parser_cocci_menhir.ml"
+# 28059 "parser_cocci_menhir.ml"
         ) = Obj.magic d in
         let _startpos = _startpos_d_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_nonempty_list_start_one_dec_decl__TEllipsis_ = 
-# 2112 "parser_cocci_menhir.mly"
+# 2149 "parser_cocci_menhir.mly"
       ( fun build_dots build_comma ->
        [(build_dots "..." d);Ast0.wrap(build_comma(P.clt2mcode "," _2))] )
-# 27951 "parser_cocci_menhir.ml"
+# 28067 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -27977,24 +28093,24 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let r : 'tv_continue_list_one_dec_decl__TEllipsis_ = Obj.magic r in
         let _2 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 27983 "parser_cocci_menhir.ml"
+# 28099 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let d : (
-# 145 "parser_cocci_menhir.mly"
+# 171 "parser_cocci_menhir.mly"
        (Data.clt)
-# 27988 "parser_cocci_menhir.ml"
+# 28104 "parser_cocci_menhir.ml"
         ) = Obj.magic d in
         let _startpos = _startpos_d_ in
         let _endpos = _endpos_r_ in
         let _v : 'tv_nonempty_list_start_one_dec_decl__TEllipsis_ = 
-# 2115 "parser_cocci_menhir.mly"
+# 2152 "parser_cocci_menhir.mly"
     ( fun build_dots build_comma ->
       (build_dots "..." d)::
       (Ast0.wrap(build_comma(P.clt2mcode "," _2)))::
       (r build_dots build_comma) )
-# 27998 "parser_cocci_menhir.ml"
+# 28114 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -28016,9 +28132,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_nonempty_list_start_one_dec_name_opt_decl__TEllipsis_ = 
-# 2101 "parser_cocci_menhir.mly"
+# 2138 "parser_cocci_menhir.mly"
        ( fun build_dots build_comma -> [_1] )
-# 28022 "parser_cocci_menhir.ml"
+# 28138 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -28042,18 +28158,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _2 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 28048 "parser_cocci_menhir.ml"
+# 28164 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_one_dec_name_opt_decl_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_nonempty_list_start_one_dec_name_opt_decl__TEllipsis_ = 
-# 2103 "parser_cocci_menhir.mly"
+# 2140 "parser_cocci_menhir.mly"
     ( fun build_dots build_comma ->
       _1::[Ast0.wrap(build_comma(P.clt2mcode "," _2))] )
-# 28057 "parser_cocci_menhir.ml"
+# 28173 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -28083,19 +28199,19 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_nonempty_list_start_one_dec_name_opt_decl__TEllipsis_ = Obj.magic _3 in
         let _2 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 28089 "parser_cocci_menhir.ml"
+# 28205 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_one_dec_name_opt_decl_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_nonempty_list_start_one_dec_name_opt_decl__TEllipsis_ = 
-# 2106 "parser_cocci_menhir.mly"
+# 2143 "parser_cocci_menhir.mly"
     ( fun build_dots build_comma ->
       _1::(Ast0.wrap(build_comma(P.clt2mcode "," _2)))::
       (_3 build_dots build_comma) )
-# 28099 "parser_cocci_menhir.ml"
+# 28215 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -28121,9 +28237,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_nonempty_list_start_one_dec_name_opt_decl__TEllipsis_ = 
-# 2109 "parser_cocci_menhir.mly"
+# 2146 "parser_cocci_menhir.mly"
                                             ( _2 )
-# 28127 "parser_cocci_menhir.ml"
+# 28243 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -28142,16 +28258,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let d : (
-# 145 "parser_cocci_menhir.mly"
+# 171 "parser_cocci_menhir.mly"
        (Data.clt)
-# 28148 "parser_cocci_menhir.ml"
+# 28264 "parser_cocci_menhir.ml"
         ) = Obj.magic d in
         let _startpos = _startpos_d_ in
         let _endpos = _endpos_d_ in
         let _v : 'tv_nonempty_list_start_one_dec_name_opt_decl__TEllipsis_ = 
-# 2110 "parser_cocci_menhir.mly"
+# 2147 "parser_cocci_menhir.mly"
            ( fun build_dots build_comma -> [(build_dots "..." d)] )
-# 28155 "parser_cocci_menhir.ml"
+# 28271 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -28175,22 +28291,22 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _2 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 28181 "parser_cocci_menhir.ml"
+# 28297 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let d : (
-# 145 "parser_cocci_menhir.mly"
+# 171 "parser_cocci_menhir.mly"
        (Data.clt)
-# 28186 "parser_cocci_menhir.ml"
+# 28302 "parser_cocci_menhir.ml"
         ) = Obj.magic d in
         let _startpos = _startpos_d_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_nonempty_list_start_one_dec_name_opt_decl__TEllipsis_ = 
-# 2112 "parser_cocci_menhir.mly"
+# 2149 "parser_cocci_menhir.mly"
       ( fun build_dots build_comma ->
        [(build_dots "..." d);Ast0.wrap(build_comma(P.clt2mcode "," _2))] )
-# 28194 "parser_cocci_menhir.ml"
+# 28310 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -28220,24 +28336,24 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let r : 'tv_continue_list_one_dec_name_opt_decl__TEllipsis_ = Obj.magic r in
         let _2 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 28226 "parser_cocci_menhir.ml"
+# 28342 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let d : (
-# 145 "parser_cocci_menhir.mly"
+# 171 "parser_cocci_menhir.mly"
        (Data.clt)
-# 28231 "parser_cocci_menhir.ml"
+# 28347 "parser_cocci_menhir.ml"
         ) = Obj.magic d in
         let _startpos = _startpos_d_ in
         let _endpos = _endpos_r_ in
         let _v : 'tv_nonempty_list_start_one_dec_name_opt_decl__TEllipsis_ = 
-# 2115 "parser_cocci_menhir.mly"
+# 2152 "parser_cocci_menhir.mly"
     ( fun build_dots build_comma ->
       (build_dots "..." d)::
       (Ast0.wrap(build_comma(P.clt2mcode "," _2)))::
       (r build_dots build_comma) )
-# 28241 "parser_cocci_menhir.ml"
+# 28357 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -28263,13 +28379,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos_i_ in
         let _v : 'tv_not_ceq = 
-# 1934 "parser_cocci_menhir.mly"
+# 1971 "parser_cocci_menhir.mly"
          ( (if !Data.in_iso
           then failwith "constraints not allowed in iso file");
           (if !Data.in_generating
           then failwith "constraints not allowed in a generated rule file");
           [i] )
-# 28273 "parser_cocci_menhir.ml"
+# 28389 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -28303,13 +28419,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__4_ in
         let _v : 'tv_not_ceq = 
-# 1940 "parser_cocci_menhir.mly"
+# 1977 "parser_cocci_menhir.mly"
   ( (if !Data.in_iso
           then failwith "constraints not allowed in iso file");
           (if !Data.in_generating
           then failwith "constraints not allowed in a generated rule file");
           l )
-# 28313 "parser_cocci_menhir.ml"
+# 28429 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -28331,9 +28447,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_ceq_ in
         let _endpos = _endpos_ceq_ in
         let _v : 'tv_not_ceq_or_sub = 
-# 1910 "parser_cocci_menhir.mly"
+# 1947 "parser_cocci_menhir.mly"
                   (Ast0.NotExpCstrt ceq)
-# 28337 "parser_cocci_menhir.ml"
+# 28453 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -28355,9 +28471,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_s_ in
         let _endpos = _endpos_s_ in
         let _v : 'tv_not_ceq_or_sub = 
-# 1911 "parser_cocci_menhir.mly"
+# 1948 "parser_cocci_menhir.mly"
                   (Ast0.SubExpCstrt s)
-# 28361 "parser_cocci_menhir.ml"
+# 28477 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -28383,14 +28499,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos_i_ in
         let _v : 'tv_not_eqe = 
-# 1915 "parser_cocci_menhir.mly"
+# 1952 "parser_cocci_menhir.mly"
          ( (if !Data.in_iso
           then failwith "constraints not allowed in iso file");
           (if !Data.in_generating
           then failwith "constraints not allowed in a generated rule file");
           [Ast0.wrap(Ast0.Ident(Ast0.wrap(Ast0.Id(P.id2mcode i))))]
         )
-# 28394 "parser_cocci_menhir.ml"
+# 28510 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -28424,7 +28540,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__4_ in
         let _v : 'tv_not_eqe = 
-# 1922 "parser_cocci_menhir.mly"
+# 1959 "parser_cocci_menhir.mly"
   ( (if !Data.in_iso
           then failwith "constraints not allowed in iso file");
           (if !Data.in_generating
@@ -28434,7 +28550,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
                Ast0.wrap(Ast0.Ident(Ast0.wrap(Ast0.Id(P.id2mcode i)))))
             l
         )
-# 28438 "parser_cocci_menhir.ml"
+# 28554 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -28460,7 +28576,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos_i_ in
         let _v : 'tv_not_eqid = 
-# 1872 "parser_cocci_menhir.mly"
+# 1909 "parser_cocci_menhir.mly"
          ( (if !Data.in_iso
           then failwith "constraints not allowed in iso file");
           (if !Data.in_generating
@@ -28474,7 +28590,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
                   (function mv -> Ast.MetaIdDecl(Ast.NONE,mv)) in
               Ast.IdNegIdSet([],[i])
           | (None,i) -> Ast.IdNegIdSet([i],[])) )
-# 28478 "parser_cocci_menhir.ml"
+# 28594 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -28508,7 +28624,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__4_ in
         let _v : 'tv_not_eqid = 
-# 1886 "parser_cocci_menhir.mly"
+# 1923 "parser_cocci_menhir.mly"
   ( (if !Data.in_iso
           then failwith "constraints not allowed in iso file");
           (if !Data.in_generating
@@ -28526,7 +28642,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
               ([],[]) l in
           Ast.IdNegIdSet(str,meta)
         )
-# 28530 "parser_cocci_menhir.ml"
+# 28646 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -28552,7 +28668,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos_i_ in
         let _v : 'tv_not_pos = 
-# 1979 "parser_cocci_menhir.mly"
+# 2016 "parser_cocci_menhir.mly"
          ( (if !Data.in_iso
           then failwith "constraints not allowed in iso file");
           (if !Data.in_generating
@@ -28561,7 +28677,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             P.check_inherited_constraint i
               (function mv -> Ast.MetaPosDecl(Ast.NONE,mv)) in
           [i] )
-# 28565 "parser_cocci_menhir.ml"
+# 28681 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -28595,7 +28711,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__4_ in
         let _v : 'tv_not_pos = 
-# 1988 "parser_cocci_menhir.mly"
+# 2025 "parser_cocci_menhir.mly"
   ( (if !Data.in_iso
           then failwith "constraints not allowed in iso file");
           (if !Data.in_generating
@@ -28605,7 +28721,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
               P.check_inherited_constraint i
                 (function mv -> Ast.MetaPosDecl(Ast.NONE,mv)))
             l )
-# 28609 "parser_cocci_menhir.ml"
+# 28725 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -28627,9 +28743,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_one_dec_decl_ = 
-# 2076 "parser_cocci_menhir.mly"
+# 2113 "parser_cocci_menhir.mly"
         ( _1 )
-# 28633 "parser_cocci_menhir.ml"
+# 28749 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -28648,14 +28764,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 136 "parser_cocci_menhir.mly"
+# 162 "parser_cocci_menhir.mly"
        (Parse_aux.list_info)
-# 28654 "parser_cocci_menhir.ml"
+# 28770 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_one_dec_decl_ = 
-# 2078 "parser_cocci_menhir.mly"
+# 2115 "parser_cocci_menhir.mly"
     ( let (nm,lenname,pure,clt) = _1 in
     let nm = P.clt2mcode nm clt in
       let lenname =
@@ -28664,7 +28780,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
        | Ast.MetaLen nm -> Ast0.MetaListLen(P.clt2mcode nm clt)
        | Ast.CstLen n -> Ast0.CstListLen n in
     Ast0.wrap(Ast0.MetaParamList(nm,lenname,pure)) )
-# 28668 "parser_cocci_menhir.ml"
+# 28784 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -28686,9 +28802,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_one_dec_name_opt_decl_ = 
-# 2076 "parser_cocci_menhir.mly"
+# 2113 "parser_cocci_menhir.mly"
         ( _1 )
-# 28692 "parser_cocci_menhir.ml"
+# 28808 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -28707,14 +28823,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 136 "parser_cocci_menhir.mly"
+# 162 "parser_cocci_menhir.mly"
        (Parse_aux.list_info)
-# 28713 "parser_cocci_menhir.ml"
+# 28829 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_one_dec_name_opt_decl_ = 
-# 2078 "parser_cocci_menhir.mly"
+# 2115 "parser_cocci_menhir.mly"
     ( let (nm,lenname,pure,clt) = _1 in
     let nm = P.clt2mcode nm clt in
       let lenname =
@@ -28723,7 +28839,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
        | Ast.MetaLen nm -> Ast0.MetaListLen(P.clt2mcode nm clt)
        | Ast.CstLen n -> Ast0.CstListLen n in
     Ast0.wrap(Ast0.MetaParamList(nm,lenname,pure)) )
-# 28727 "parser_cocci_menhir.ml"
+# 28843 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -28747,17 +28863,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let pv : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 28753 "parser_cocci_menhir.ml"
+# 28869 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let t : 'tv_ctype = Obj.magic t in
         let _startpos = _startpos_t_ in
         let _endpos = _endpos_pv_ in
         let _v : 'tv_one_decl_var = 
-# 1281 "parser_cocci_menhir.mly"
+# 1307 "parser_cocci_menhir.mly"
       ( Ast0.wrap(Ast0.TyDecl(t,P.clt2mcode ";" pv)) )
-# 28761 "parser_cocci_menhir.ml"
+# 28877 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -28776,16 +28892,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 135 "parser_cocci_menhir.mly"
+# 161 "parser_cocci_menhir.mly"
        (Parse_aux.info)
-# 28782 "parser_cocci_menhir.ml"
+# 28898 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_one_decl_var = 
-# 1282 "parser_cocci_menhir.mly"
+# 1308 "parser_cocci_menhir.mly"
               ( P.meta_decl _1 )
-# 28789 "parser_cocci_menhir.ml"
+# 28905 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -28814,9 +28930,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let pv : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 28820 "parser_cocci_menhir.ml"
+# 28936 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let d : 'tv_d_ident = Obj.magic d in
         let t : 'tv_ctype = Obj.magic t in
@@ -28826,14 +28942,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 39 "standard.mly"
     ( None )
-# 28830 "parser_cocci_menhir.ml"
+# 28946 "parser_cocci_menhir.ml"
           
         in
         
-# 1284 "parser_cocci_menhir.mly"
+# 1310 "parser_cocci_menhir.mly"
       ( let (id,fn) = d in
         Ast0.wrap(Ast0.UnInit(s,fn t,id,P.clt2mcode ";" pv)) )
-# 28837 "parser_cocci_menhir.ml"
+# 28953 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -28867,9 +28983,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let pv : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 28873 "parser_cocci_menhir.ml"
+# 28989 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let d : 'tv_d_ident = Obj.magic d in
         let t : 'tv_ctype = Obj.magic t in
@@ -28881,14 +28997,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 28885 "parser_cocci_menhir.ml"
+# 29001 "parser_cocci_menhir.ml"
           
         in
         
-# 1284 "parser_cocci_menhir.mly"
+# 1310 "parser_cocci_menhir.mly"
       ( let (id,fn) = d in
         Ast0.wrap(Ast0.UnInit(s,fn t,id,P.clt2mcode ";" pv)) )
-# 28892 "parser_cocci_menhir.ml"
+# 29008 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -28910,9 +29026,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_f_ in
         let _endpos = _endpos_f_ in
         let _v : 'tv_one_decl_var = 
-# 1286 "parser_cocci_menhir.mly"
+# 1312 "parser_cocci_menhir.mly"
                ( f )
-# 28916 "parser_cocci_menhir.ml"
+# 29032 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -28951,15 +29067,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let pv : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 28957 "parser_cocci_menhir.ml"
+# 29073 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let e : 'tv_initialize = Obj.magic e in
         let q : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 28963 "parser_cocci_menhir.ml"
+# 29079 "parser_cocci_menhir.ml"
         ) = Obj.magic q in
         let d : 'tv_d_ident = Obj.magic d in
         let t : 'tv_ctype = Obj.magic t in
@@ -28969,14 +29085,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 39 "standard.mly"
     ( None )
-# 28973 "parser_cocci_menhir.ml"
+# 29089 "parser_cocci_menhir.ml"
           
         in
         
-# 1288 "parser_cocci_menhir.mly"
+# 1314 "parser_cocci_menhir.mly"
       ( let (id,fn) = d in
       Ast0.wrap(Ast0.Init(s,fn t,id,P.clt2mcode "=" q,e,P.clt2mcode ";" pv)) )
-# 28980 "parser_cocci_menhir.ml"
+# 29096 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -29020,15 +29136,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let pv : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 29026 "parser_cocci_menhir.ml"
+# 29142 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let e : 'tv_initialize = Obj.magic e in
         let q : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 29032 "parser_cocci_menhir.ml"
+# 29148 "parser_cocci_menhir.ml"
         ) = Obj.magic q in
         let d : 'tv_d_ident = Obj.magic d in
         let t : 'tv_ctype = Obj.magic t in
@@ -29040,14 +29156,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 29044 "parser_cocci_menhir.ml"
+# 29160 "parser_cocci_menhir.ml"
           
         in
         
-# 1288 "parser_cocci_menhir.mly"
+# 1314 "parser_cocci_menhir.mly"
       ( let (id,fn) = d in
       Ast0.wrap(Ast0.Init(s,fn t,id,P.clt2mcode "=" q,e,P.clt2mcode ";" pv)) )
-# 29051 "parser_cocci_menhir.ml"
+# 29167 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -29076,9 +29192,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let pv : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 29082 "parser_cocci_menhir.ml"
+# 29198 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let d : 'tv_d_ident = Obj.magic d in
         let i : 'tv_pure_ident_or_symbol = Obj.magic i in
@@ -29088,22 +29204,22 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 39 "standard.mly"
     ( None )
-# 29092 "parser_cocci_menhir.ml"
+# 29208 "parser_cocci_menhir.ml"
           
         in
         let s =
           
 # 39 "standard.mly"
     ( None )
-# 29099 "parser_cocci_menhir.ml"
+# 29215 "parser_cocci_menhir.ml"
           
         in
         
-# 1293 "parser_cocci_menhir.mly"
+# 1319 "parser_cocci_menhir.mly"
       ( let (id,fn) = d in
         let idtype = P.make_cv cv (Ast0.wrap (Ast0.TypeName(P.id2mcode i))) in
        Ast0.wrap(Ast0.UnInit(s,fn idtype,id,P.clt2mcode ";" pv)) )
-# 29107 "parser_cocci_menhir.ml"
+# 29223 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -29137,9 +29253,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let pv : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 29143 "parser_cocci_menhir.ml"
+# 29259 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let d : 'tv_d_ident = Obj.magic d in
         let i : 'tv_pure_ident_or_symbol = Obj.magic i in
@@ -29151,22 +29267,22 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 29155 "parser_cocci_menhir.ml"
+# 29271 "parser_cocci_menhir.ml"
           
         in
         let s =
           
 # 39 "standard.mly"
     ( None )
-# 29162 "parser_cocci_menhir.ml"
+# 29278 "parser_cocci_menhir.ml"
           
         in
         
-# 1293 "parser_cocci_menhir.mly"
+# 1319 "parser_cocci_menhir.mly"
       ( let (id,fn) = d in
         let idtype = P.make_cv cv (Ast0.wrap (Ast0.TypeName(P.id2mcode i))) in
        Ast0.wrap(Ast0.UnInit(s,fn idtype,id,P.clt2mcode ";" pv)) )
-# 29170 "parser_cocci_menhir.ml"
+# 29286 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -29200,9 +29316,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let pv : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 29206 "parser_cocci_menhir.ml"
+# 29322 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let d : 'tv_d_ident = Obj.magic d in
         let i : 'tv_pure_ident_or_symbol = Obj.magic i in
@@ -29213,7 +29329,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 39 "standard.mly"
     ( None )
-# 29217 "parser_cocci_menhir.ml"
+# 29333 "parser_cocci_menhir.ml"
           
         in
         let s =
@@ -29221,15 +29337,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 29225 "parser_cocci_menhir.ml"
+# 29341 "parser_cocci_menhir.ml"
           
         in
         
-# 1293 "parser_cocci_menhir.mly"
+# 1319 "parser_cocci_menhir.mly"
       ( let (id,fn) = d in
         let idtype = P.make_cv cv (Ast0.wrap (Ast0.TypeName(P.id2mcode i))) in
        Ast0.wrap(Ast0.UnInit(s,fn idtype,id,P.clt2mcode ";" pv)) )
-# 29233 "parser_cocci_menhir.ml"
+# 29349 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -29268,9 +29384,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let pv : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 29274 "parser_cocci_menhir.ml"
+# 29390 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let d : 'tv_d_ident = Obj.magic d in
         let i : 'tv_pure_ident_or_symbol = Obj.magic i in
@@ -29283,7 +29399,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 29287 "parser_cocci_menhir.ml"
+# 29403 "parser_cocci_menhir.ml"
           
         in
         let s =
@@ -29291,15 +29407,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 29295 "parser_cocci_menhir.ml"
+# 29411 "parser_cocci_menhir.ml"
           
         in
         
-# 1293 "parser_cocci_menhir.mly"
+# 1319 "parser_cocci_menhir.mly"
       ( let (id,fn) = d in
         let idtype = P.make_cv cv (Ast0.wrap (Ast0.TypeName(P.id2mcode i))) in
        Ast0.wrap(Ast0.UnInit(s,fn idtype,id,P.clt2mcode ";" pv)) )
-# 29303 "parser_cocci_menhir.ml"
+# 29419 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -29338,15 +29454,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let pv : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 29344 "parser_cocci_menhir.ml"
+# 29460 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let e : 'tv_initialize = Obj.magic e in
         let q : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 29350 "parser_cocci_menhir.ml"
+# 29466 "parser_cocci_menhir.ml"
         ) = Obj.magic q in
         let d : 'tv_d_ident = Obj.magic d in
         let i : 'tv_pure_ident_or_symbol = Obj.magic i in
@@ -29356,24 +29472,24 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 39 "standard.mly"
     ( None )
-# 29360 "parser_cocci_menhir.ml"
+# 29476 "parser_cocci_menhir.ml"
           
         in
         let s =
           
 # 39 "standard.mly"
     ( None )
-# 29367 "parser_cocci_menhir.ml"
+# 29483 "parser_cocci_menhir.ml"
           
         in
         
-# 1298 "parser_cocci_menhir.mly"
+# 1324 "parser_cocci_menhir.mly"
       ( let (id,fn) = d in
       !Data.add_type_name (P.id2name i);
       let idtype = P.make_cv cv (Ast0.wrap (Ast0.TypeName(P.id2mcode i))) in
       Ast0.wrap(Ast0.Init(s,fn idtype,id,P.clt2mcode "=" q,e,
                           P.clt2mcode ";" pv)) )
-# 29377 "parser_cocci_menhir.ml"
+# 29493 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -29417,15 +29533,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let pv : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 29423 "parser_cocci_menhir.ml"
+# 29539 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let e : 'tv_initialize = Obj.magic e in
         let q : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 29429 "parser_cocci_menhir.ml"
+# 29545 "parser_cocci_menhir.ml"
         ) = Obj.magic q in
         let d : 'tv_d_ident = Obj.magic d in
         let i : 'tv_pure_ident_or_symbol = Obj.magic i in
@@ -29437,24 +29553,24 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 29441 "parser_cocci_menhir.ml"
+# 29557 "parser_cocci_menhir.ml"
           
         in
         let s =
           
 # 39 "standard.mly"
     ( None )
-# 29448 "parser_cocci_menhir.ml"
+# 29564 "parser_cocci_menhir.ml"
           
         in
         
-# 1298 "parser_cocci_menhir.mly"
+# 1324 "parser_cocci_menhir.mly"
       ( let (id,fn) = d in
       !Data.add_type_name (P.id2name i);
       let idtype = P.make_cv cv (Ast0.wrap (Ast0.TypeName(P.id2mcode i))) in
       Ast0.wrap(Ast0.Init(s,fn idtype,id,P.clt2mcode "=" q,e,
                           P.clt2mcode ";" pv)) )
-# 29458 "parser_cocci_menhir.ml"
+# 29574 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -29498,15 +29614,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let pv : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 29504 "parser_cocci_menhir.ml"
+# 29620 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let e : 'tv_initialize = Obj.magic e in
         let q : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 29510 "parser_cocci_menhir.ml"
+# 29626 "parser_cocci_menhir.ml"
         ) = Obj.magic q in
         let d : 'tv_d_ident = Obj.magic d in
         let i : 'tv_pure_ident_or_symbol = Obj.magic i in
@@ -29517,7 +29633,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 39 "standard.mly"
     ( None )
-# 29521 "parser_cocci_menhir.ml"
+# 29637 "parser_cocci_menhir.ml"
           
         in
         let s =
@@ -29525,17 +29641,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 29529 "parser_cocci_menhir.ml"
+# 29645 "parser_cocci_menhir.ml"
           
         in
         
-# 1298 "parser_cocci_menhir.mly"
+# 1324 "parser_cocci_menhir.mly"
       ( let (id,fn) = d in
       !Data.add_type_name (P.id2name i);
       let idtype = P.make_cv cv (Ast0.wrap (Ast0.TypeName(P.id2mcode i))) in
       Ast0.wrap(Ast0.Init(s,fn idtype,id,P.clt2mcode "=" q,e,
                           P.clt2mcode ";" pv)) )
-# 29539 "parser_cocci_menhir.ml"
+# 29655 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -29584,15 +29700,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let pv : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 29590 "parser_cocci_menhir.ml"
+# 29706 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let e : 'tv_initialize = Obj.magic e in
         let q : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 29596 "parser_cocci_menhir.ml"
+# 29712 "parser_cocci_menhir.ml"
         ) = Obj.magic q in
         let d : 'tv_d_ident = Obj.magic d in
         let i : 'tv_pure_ident_or_symbol = Obj.magic i in
@@ -29605,7 +29721,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 29609 "parser_cocci_menhir.ml"
+# 29725 "parser_cocci_menhir.ml"
           
         in
         let s =
@@ -29613,17 +29729,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 29617 "parser_cocci_menhir.ml"
+# 29733 "parser_cocci_menhir.ml"
           
         in
         
-# 1298 "parser_cocci_menhir.mly"
+# 1324 "parser_cocci_menhir.mly"
       ( let (id,fn) = d in
       !Data.add_type_name (P.id2name i);
       let idtype = P.make_cv cv (Ast0.wrap (Ast0.TypeName(P.id2mcode i))) in
       Ast0.wrap(Ast0.Init(s,fn idtype,id,P.clt2mcode "=" q,e,
                           P.clt2mcode ";" pv)) )
-# 29627 "parser_cocci_menhir.ml"
+# 29743 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -29682,36 +29798,36 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let pv : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 29688 "parser_cocci_menhir.ml"
+# 29804 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let rp2 : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
-# 29693 "parser_cocci_menhir.ml"
+# 29809 "parser_cocci_menhir.ml"
         ) = Obj.magic rp2 in
         let p : 'tv_decl_list_name_opt_decl_ = Obj.magic p in
         let lp2 : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
-# 29699 "parser_cocci_menhir.ml"
+# 29815 "parser_cocci_menhir.ml"
         ) = Obj.magic lp2 in
         let rp1 : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
-# 29704 "parser_cocci_menhir.ml"
+# 29820 "parser_cocci_menhir.ml"
         ) = Obj.magic rp1 in
         let d : 'tv_d_ident = Obj.magic d in
         let st : (
-# 171 "parser_cocci_menhir.mly"
+# 197 "parser_cocci_menhir.mly"
        (Data.clt)
-# 29710 "parser_cocci_menhir.ml"
+# 29826 "parser_cocci_menhir.ml"
         ) = Obj.magic st in
         let lp1 : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
-# 29715 "parser_cocci_menhir.ml"
+# 29831 "parser_cocci_menhir.ml"
         ) = Obj.magic lp1 in
         let t : 'tv_ctype = Obj.magic t in
         let _startpos = _startpos_t_ in
@@ -29720,11 +29836,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 39 "standard.mly"
     ( None )
-# 29724 "parser_cocci_menhir.ml"
+# 29840 "parser_cocci_menhir.ml"
           
         in
         
-# 1308 "parser_cocci_menhir.mly"
+# 1334 "parser_cocci_menhir.mly"
       ( let (id,fn) = d in
         let t =
          Ast0.wrap
@@ -29732,7 +29848,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
               (t,P.clt2mcode "(" lp1,P.clt2mcode "*" st,P.clt2mcode ")" rp1,
                P.clt2mcode "(" lp2,p,P.clt2mcode ")" rp2)) in
         Ast0.wrap(Ast0.UnInit(s,fn t,id,P.clt2mcode ";" pv)) )
-# 29736 "parser_cocci_menhir.ml"
+# 29852 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -29796,36 +29912,36 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let pv : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 29802 "parser_cocci_menhir.ml"
+# 29918 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let rp2 : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
-# 29807 "parser_cocci_menhir.ml"
+# 29923 "parser_cocci_menhir.ml"
         ) = Obj.magic rp2 in
         let p : 'tv_decl_list_name_opt_decl_ = Obj.magic p in
         let lp2 : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
-# 29813 "parser_cocci_menhir.ml"
+# 29929 "parser_cocci_menhir.ml"
         ) = Obj.magic lp2 in
         let rp1 : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
-# 29818 "parser_cocci_menhir.ml"
+# 29934 "parser_cocci_menhir.ml"
         ) = Obj.magic rp1 in
         let d : 'tv_d_ident = Obj.magic d in
         let st : (
-# 171 "parser_cocci_menhir.mly"
+# 197 "parser_cocci_menhir.mly"
        (Data.clt)
-# 29824 "parser_cocci_menhir.ml"
+# 29940 "parser_cocci_menhir.ml"
         ) = Obj.magic st in
         let lp1 : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
-# 29829 "parser_cocci_menhir.ml"
+# 29945 "parser_cocci_menhir.ml"
         ) = Obj.magic lp1 in
         let t : 'tv_ctype = Obj.magic t in
         let x0 : 'tv_storage = Obj.magic x0 in
@@ -29836,11 +29952,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 29840 "parser_cocci_menhir.ml"
+# 29956 "parser_cocci_menhir.ml"
           
         in
         
-# 1308 "parser_cocci_menhir.mly"
+# 1334 "parser_cocci_menhir.mly"
       ( let (id,fn) = d in
         let t =
          Ast0.wrap
@@ -29848,7 +29964,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
               (t,P.clt2mcode "(" lp1,P.clt2mcode "*" st,P.clt2mcode ")" rp1,
                P.clt2mcode "(" lp2,p,P.clt2mcode ")" rp2)) in
         Ast0.wrap(Ast0.UnInit(s,fn t,id,P.clt2mcode ";" pv)) )
-# 29852 "parser_cocci_menhir.ml"
+# 29968 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -29887,29 +30003,29 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _5 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 29893 "parser_cocci_menhir.ml"
+# 30009 "parser_cocci_menhir.ml"
         ) = Obj.magic _5 in
         let _4 : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
-# 29898 "parser_cocci_menhir.ml"
+# 30014 "parser_cocci_menhir.ml"
         ) = Obj.magic _4 in
         let _3 : 'tv_eexpr_list_option = Obj.magic _3 in
         let _2 : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
-# 29904 "parser_cocci_menhir.ml"
+# 30020 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_decl_ident = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__5_ in
         let _v : 'tv_one_decl_var = 
-# 1316 "parser_cocci_menhir.mly"
+# 1342 "parser_cocci_menhir.mly"
       ( Ast0.wrap(Ast0.MacroDecl(_1,P.clt2mcode "(" _2,_3,
                                  P.clt2mcode ")" _4,P.clt2mcode ";" _5)) )
-# 29913 "parser_cocci_menhir.ml"
+# 30029 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -29958,38 +30074,38 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _7 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 29964 "parser_cocci_menhir.ml"
+# 30080 "parser_cocci_menhir.ml"
         ) = Obj.magic _7 in
         let e : 'tv_initialize = Obj.magic e in
         let q : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 29970 "parser_cocci_menhir.ml"
+# 30086 "parser_cocci_menhir.ml"
         ) = Obj.magic q in
         let _4 : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
-# 29975 "parser_cocci_menhir.ml"
+# 30091 "parser_cocci_menhir.ml"
         ) = Obj.magic _4 in
         let _3 : 'tv_eexpr_list_option = Obj.magic _3 in
         let _2 : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
-# 29981 "parser_cocci_menhir.ml"
+# 30097 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_decl_ident = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__7_ in
         let _v : 'tv_one_decl_var = 
-# 1319 "parser_cocci_menhir.mly"
+# 1345 "parser_cocci_menhir.mly"
       ( Ast0.wrap
             (Ast0.MacroDeclInit
                (_1,P.clt2mcode "(" _2,_3,
                 P.clt2mcode ")" _4,P.clt2mcode "=" q,e,
                 P.clt2mcode ";" _7)) )
-# 29993 "parser_cocci_menhir.ml"
+# 30109 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -30058,42 +30174,42 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let pv : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 30064 "parser_cocci_menhir.ml"
+# 30180 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let e : 'tv_initialize = Obj.magic e in
         let q : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 30070 "parser_cocci_menhir.ml"
+# 30186 "parser_cocci_menhir.ml"
         ) = Obj.magic q in
         let rp2 : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
-# 30075 "parser_cocci_menhir.ml"
+# 30191 "parser_cocci_menhir.ml"
         ) = Obj.magic rp2 in
         let p : 'tv_decl_list_name_opt_decl_ = Obj.magic p in
         let lp2 : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
-# 30081 "parser_cocci_menhir.ml"
+# 30197 "parser_cocci_menhir.ml"
         ) = Obj.magic lp2 in
         let rp1 : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
-# 30086 "parser_cocci_menhir.ml"
+# 30202 "parser_cocci_menhir.ml"
         ) = Obj.magic rp1 in
         let d : 'tv_d_ident = Obj.magic d in
         let st : (
-# 171 "parser_cocci_menhir.mly"
+# 197 "parser_cocci_menhir.mly"
        (Data.clt)
-# 30092 "parser_cocci_menhir.ml"
+# 30208 "parser_cocci_menhir.ml"
         ) = Obj.magic st in
         let lp1 : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
-# 30097 "parser_cocci_menhir.ml"
+# 30213 "parser_cocci_menhir.ml"
         ) = Obj.magic lp1 in
         let t : 'tv_ctype = Obj.magic t in
         let _startpos = _startpos_t_ in
@@ -30102,11 +30218,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 39 "standard.mly"
     ( None )
-# 30106 "parser_cocci_menhir.ml"
+# 30222 "parser_cocci_menhir.ml"
           
         in
         
-# 1328 "parser_cocci_menhir.mly"
+# 1354 "parser_cocci_menhir.mly"
       ( let (id,fn) = d in
         let t =
          Ast0.wrap
@@ -30114,7 +30230,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
               (t,P.clt2mcode "(" lp1,P.clt2mcode "*" st,P.clt2mcode ")" rp1,
                P.clt2mcode "(" lp2,p,P.clt2mcode ")" rp2)) in
       Ast0.wrap(Ast0.Init(s,fn t,id,P.clt2mcode "=" q,e,P.clt2mcode ";" pv)))
-# 30118 "parser_cocci_menhir.ml"
+# 30234 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -30188,42 +30304,42 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let pv : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 30194 "parser_cocci_menhir.ml"
+# 30310 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let e : 'tv_initialize = Obj.magic e in
         let q : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 30200 "parser_cocci_menhir.ml"
+# 30316 "parser_cocci_menhir.ml"
         ) = Obj.magic q in
         let rp2 : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
-# 30205 "parser_cocci_menhir.ml"
+# 30321 "parser_cocci_menhir.ml"
         ) = Obj.magic rp2 in
         let p : 'tv_decl_list_name_opt_decl_ = Obj.magic p in
         let lp2 : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
-# 30211 "parser_cocci_menhir.ml"
+# 30327 "parser_cocci_menhir.ml"
         ) = Obj.magic lp2 in
         let rp1 : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
-# 30216 "parser_cocci_menhir.ml"
+# 30332 "parser_cocci_menhir.ml"
         ) = Obj.magic rp1 in
         let d : 'tv_d_ident = Obj.magic d in
         let st : (
-# 171 "parser_cocci_menhir.mly"
+# 197 "parser_cocci_menhir.mly"
        (Data.clt)
-# 30222 "parser_cocci_menhir.ml"
+# 30338 "parser_cocci_menhir.ml"
         ) = Obj.magic st in
         let lp1 : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
-# 30227 "parser_cocci_menhir.ml"
+# 30343 "parser_cocci_menhir.ml"
         ) = Obj.magic lp1 in
         let t : 'tv_ctype = Obj.magic t in
         let x0 : 'tv_storage = Obj.magic x0 in
@@ -30234,11 +30350,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 30238 "parser_cocci_menhir.ml"
+# 30354 "parser_cocci_menhir.ml"
           
         in
         
-# 1328 "parser_cocci_menhir.mly"
+# 1354 "parser_cocci_menhir.mly"
       ( let (id,fn) = d in
         let t =
          Ast0.wrap
@@ -30246,7 +30362,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
               (t,P.clt2mcode "(" lp1,P.clt2mcode "*" st,P.clt2mcode ")" rp1,
                P.clt2mcode "(" lp2,p,P.clt2mcode ")" rp2)) in
       Ast0.wrap(Ast0.Init(s,fn t,id,P.clt2mcode "=" q,e,P.clt2mcode ";" pv)))
-# 30250 "parser_cocci_menhir.ml"
+# 30366 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -30263,7 +30379,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_option_TLocal_ = 
 # 29 "standard.mly"
     ( None )
-# 30267 "parser_cocci_menhir.ml"
+# 30383 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -30287,7 +30403,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_option_TLocal_ = 
 # 31 "standard.mly"
     ( Some x )
-# 30291 "parser_cocci_menhir.ml"
+# 30407 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -30304,7 +30420,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_option_TPosAny_ = 
 # 29 "standard.mly"
     ( None )
-# 30308 "parser_cocci_menhir.ml"
+# 30424 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -30328,7 +30444,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_option_TPosAny_ = 
 # 31 "standard.mly"
     ( Some x )
-# 30332 "parser_cocci_menhir.ml"
+# 30448 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -30345,7 +30461,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_option_eexpr_ = 
 # 29 "standard.mly"
     ( None )
-# 30349 "parser_cocci_menhir.ml"
+# 30465 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -30369,7 +30485,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_option_eexpr_ = 
 # 31 "standard.mly"
     ( Some x )
-# 30373 "parser_cocci_menhir.ml"
+# 30489 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -30386,7 +30502,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_option_expr_ = 
 # 29 "standard.mly"
     ( None )
-# 30390 "parser_cocci_menhir.ml"
+# 30506 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -30410,7 +30526,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_option_expr_ = 
 # 31 "standard.mly"
     ( Some x )
-# 30414 "parser_cocci_menhir.ml"
+# 30530 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -30427,7 +30543,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_option_not_ceq_or_sub_ = 
 # 29 "standard.mly"
     ( None )
-# 30431 "parser_cocci_menhir.ml"
+# 30547 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -30451,7 +30567,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_option_not_ceq_or_sub_ = 
 # 31 "standard.mly"
     ( Some x )
-# 30455 "parser_cocci_menhir.ml"
+# 30571 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -30468,7 +30584,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_option_re_or_not_eqe_or_sub_ = 
 # 29 "standard.mly"
     ( None )
-# 30472 "parser_cocci_menhir.ml"
+# 30588 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -30492,7 +30608,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_option_re_or_not_eqe_or_sub_ = 
 # 31 "standard.mly"
     ( Some x )
-# 30496 "parser_cocci_menhir.ml"
+# 30612 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -30509,7 +30625,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_option_re_or_not_eqid_ = 
 # 29 "standard.mly"
     ( None )
-# 30513 "parser_cocci_menhir.ml"
+# 30629 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -30533,7 +30649,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_option_re_or_not_eqid_ = 
 # 31 "standard.mly"
     ( Some x )
-# 30537 "parser_cocci_menhir.ml"
+# 30653 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -30548,9 +30664,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in
         let _endpos = _startpos in
         let _v : 'tv_plus_after_dots = 
-# 2241 "parser_cocci_menhir.mly"
+# 2278 "parser_cocci_menhir.mly"
                                                                          ([])
-# 30554 "parser_cocci_menhir.ml"
+# 30670 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -30576,9 +30692,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_plus_after_dots = 
-# 2242 "parser_cocci_menhir.mly"
+# 2279 "parser_cocci_menhir.mly"
                                                                          (_2)
-# 30582 "parser_cocci_menhir.ml"
+# 30698 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -30606,9 +30722,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_plus_after_dots = 
-# 2244 "parser_cocci_menhir.mly"
+# 2281 "parser_cocci_menhir.mly"
                      ( (Ast0.wrap(Ast0.OTHER(Ast0.wrap(Ast0.Exp(_1)))))::_2 )
-# 30612 "parser_cocci_menhir.ml"
+# 30728 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -30636,9 +30752,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_plus_after_dots = 
-# 2245 "parser_cocci_menhir.mly"
+# 2282 "parser_cocci_menhir.mly"
                                              ( Ast0.wrap(Ast0.OTHER(_1))::_2 )
-# 30642 "parser_cocci_menhir.ml"
+# 30758 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -30666,9 +30782,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_plus_after_dots = 
-# 2247 "parser_cocci_menhir.mly"
+# 2284 "parser_cocci_menhir.mly"
                 ( (List.map (function x -> Ast0.wrap(Ast0.OTHER(x))) _1)@_2 )
-# 30672 "parser_cocci_menhir.ml"
+# 30788 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -30683,9 +30799,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in
         let _endpos = _startpos in
         let _v : 'tv_plus_after_exp = 
-# 2237 "parser_cocci_menhir.mly"
+# 2274 "parser_cocci_menhir.mly"
                                                                          ([])
-# 30689 "parser_cocci_menhir.ml"
+# 30805 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -30713,9 +30829,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_plus_after_exp = 
-# 2238 "parser_cocci_menhir.mly"
+# 2275 "parser_cocci_menhir.mly"
                                           ( (Ast0.wrap(Ast0.OTHER(_1)))::_2 )
-# 30719 "parser_cocci_menhir.ml"
+# 30835 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -30730,9 +30846,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in
         let _endpos = _startpos in
         let _v : 'tv_plus_after_stm = 
-# 2250 "parser_cocci_menhir.mly"
+# 2287 "parser_cocci_menhir.mly"
                                                                          ([])
-# 30736 "parser_cocci_menhir.ml"
+# 30852 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -30760,9 +30876,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_plus_after_stm = 
-# 2251 "parser_cocci_menhir.mly"
+# 2288 "parser_cocci_menhir.mly"
                                           ( (Ast0.wrap(Ast0.OTHER(_1)))::_2 )
-# 30766 "parser_cocci_menhir.ml"
+# 30882 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -30790,9 +30906,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_plus_after_stm = 
-# 2252 "parser_cocci_menhir.mly"
+# 2289 "parser_cocci_menhir.mly"
                                              ( Ast0.wrap(Ast0.OTHER(_1))::_2 )
-# 30796 "parser_cocci_menhir.ml"
+# 30912 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -30820,9 +30936,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_plus_after_stm = 
-# 2254 "parser_cocci_menhir.mly"
+# 2291 "parser_cocci_menhir.mly"
                 ( (List.map (function x -> Ast0.wrap(Ast0.OTHER(x))) _1)@_2 )
-# 30826 "parser_cocci_menhir.ml"
+# 30942 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -30850,9 +30966,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_f_ in
         let _endpos = _endpos_b_ in
         let _v : 'tv_plus_body = 
-# 854 "parser_cocci_menhir.mly"
+# 880 "parser_cocci_menhir.mly"
     ( f@b(*@ew*) )
-# 30856 "parser_cocci_menhir.ml"
+# 30972 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -30880,9 +30996,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_f_ in
         let _endpos = _endpos_b_ in
         let _v : 'tv_plus_exp_body = 
-# 868 "parser_cocci_menhir.mly"
+# 894 "parser_cocci_menhir.mly"
     ( f@[b](*@ew*) )
-# 30886 "parser_cocci_menhir.ml"
+# 31002 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -30908,13 +31024,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : (
-# 217 "parser_cocci_menhir.mly"
+# 243 "parser_cocci_menhir.mly"
       (Ast0_cocci.rule)
-# 30914 "parser_cocci_menhir.ml"
+# 31030 "parser_cocci_menhir.ml"
         ) = 
-# 253 "parser_cocci_menhir.mly"
+# 279 "parser_cocci_menhir.mly"
                                  ( _1 )
-# 30918 "parser_cocci_menhir.ml"
+# 31034 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -30940,13 +31056,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_p_ in
         let _endpos = _endpos__2_ in
         let _v : (
-# 217 "parser_cocci_menhir.mly"
+# 243 "parser_cocci_menhir.mly"
       (Ast0_cocci.rule)
-# 30946 "parser_cocci_menhir.ml"
+# 31062 "parser_cocci_menhir.ml"
         ) = 
-# 253 "parser_cocci_menhir.mly"
+# 279 "parser_cocci_menhir.mly"
                                                                     ( p )
-# 30950 "parser_cocci_menhir.ml"
+# 31066 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -30972,13 +31088,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_p_ in
         let _endpos = _endpos__2_ in
         let _v : (
-# 217 "parser_cocci_menhir.mly"
+# 243 "parser_cocci_menhir.mly"
       (Ast0_cocci.rule)
-# 30978 "parser_cocci_menhir.ml"
+# 31094 "parser_cocci_menhir.ml"
         ) = 
-# 254 "parser_cocci_menhir.mly"
+# 280 "parser_cocci_menhir.mly"
                         ( p )
-# 30982 "parser_cocci_menhir.ml"
+# 31098 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -31004,13 +31120,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : (
-# 214 "parser_cocci_menhir.mly"
+# 240 "parser_cocci_menhir.mly"
       (Ast0_cocci.rule)
-# 31010 "parser_cocci_menhir.ml"
+# 31126 "parser_cocci_menhir.ml"
         ) = 
-# 249 "parser_cocci_menhir.mly"
+# 275 "parser_cocci_menhir.mly"
                          ( _1 )
-# 31014 "parser_cocci_menhir.ml"
+# 31130 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -31036,13 +31152,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_p_ in
         let _endpos = _endpos__2_ in
         let _v : (
-# 214 "parser_cocci_menhir.mly"
+# 240 "parser_cocci_menhir.mly"
       (Ast0_cocci.rule)
-# 31042 "parser_cocci_menhir.ml"
+# 31158 "parser_cocci_menhir.ml"
         ) = 
-# 249 "parser_cocci_menhir.mly"
+# 275 "parser_cocci_menhir.mly"
                                                         ( p )
-# 31046 "parser_cocci_menhir.ml"
+# 31162 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -31068,13 +31184,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_p_ in
         let _endpos = _endpos__2_ in
         let _v : (
-# 214 "parser_cocci_menhir.mly"
+# 240 "parser_cocci_menhir.mly"
       (Ast0_cocci.rule)
-# 31074 "parser_cocci_menhir.ml"
+# 31190 "parser_cocci_menhir.ml"
         ) = 
-# 250 "parser_cocci_menhir.mly"
+# 276 "parser_cocci_menhir.mly"
                     ( p )
-# 31078 "parser_cocci_menhir.ml"
+# 31194 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -31096,9 +31212,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_plus_start = 
-# 2226 "parser_cocci_menhir.mly"
+# 2263 "parser_cocci_menhir.mly"
                           ( [Ast0.wrap(Ast0.OTHER(Ast0.wrap(Ast0.Ty(_1))))] )
-# 31102 "parser_cocci_menhir.ml"
+# 31218 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -31120,9 +31236,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_plus_start = 
-# 2227 "parser_cocci_menhir.mly"
+# 2264 "parser_cocci_menhir.mly"
                      ( [Ast0.wrap(Ast0.OTHER(Ast0.wrap(Ast0.TopInit(_1))))] )
-# 31126 "parser_cocci_menhir.ml"
+# 31242 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -31150,9 +31266,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_plus_start = 
-# 2229 "parser_cocci_menhir.mly"
+# 2266 "parser_cocci_menhir.mly"
                                           ( (Ast0.wrap(Ast0.OTHER(_1)))::_2 )
-# 31156 "parser_cocci_menhir.ml"
+# 31272 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -31180,9 +31296,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_plus_start = 
-# 2231 "parser_cocci_menhir.mly"
+# 2268 "parser_cocci_menhir.mly"
                      ( (Ast0.wrap(Ast0.OTHER(Ast0.wrap(Ast0.Exp(_1)))))::_2 )
-# 31186 "parser_cocci_menhir.ml"
+# 31302 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -31210,9 +31326,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_plus_start = 
-# 2232 "parser_cocci_menhir.mly"
+# 2269 "parser_cocci_menhir.mly"
                                              ( Ast0.wrap(Ast0.OTHER(_1))::_2 )
-# 31216 "parser_cocci_menhir.ml"
+# 31332 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -31240,9 +31356,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_plus_start = 
-# 2234 "parser_cocci_menhir.mly"
+# 2271 "parser_cocci_menhir.mly"
                 ( (List.map (function x -> Ast0.wrap(Ast0.OTHER(x))) _1)@_2 )
-# 31246 "parser_cocci_menhir.ml"
+# 31362 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -31264,9 +31380,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_postfix_expr_eexpr_dot_expressions_ = 
-# 1654 "parser_cocci_menhir.mly"
+# 1691 "parser_cocci_menhir.mly"
                                                  ( _1 )
-# 31270 "parser_cocci_menhir.ml"
+# 31386 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -31300,24 +31416,24 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _4 : (
-# 174 "parser_cocci_menhir.mly"
+# 200 "parser_cocci_menhir.mly"
        (Data.clt)
-# 31306 "parser_cocci_menhir.ml"
+# 31422 "parser_cocci_menhir.ml"
         ) = Obj.magic _4 in
         let _3 : 'tv_eexpr = Obj.magic _3 in
         let _2 : (
-# 174 "parser_cocci_menhir.mly"
+# 200 "parser_cocci_menhir.mly"
        (Data.clt)
-# 31312 "parser_cocci_menhir.ml"
+# 31428 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_postfix_expr_eexpr_dot_expressions_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__4_ in
         let _v : 'tv_postfix_expr_eexpr_dot_expressions_ = 
-# 1656 "parser_cocci_menhir.mly"
+# 1693 "parser_cocci_menhir.mly"
      ( Ast0.wrap(Ast0.ArrayAccess (_1,P.clt2mcode "[" _2,_3,
                                       P.clt2mcode "]" _4)) )
-# 31321 "parser_cocci_menhir.ml"
+# 31437 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -31347,17 +31463,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_disj_ident = Obj.magic _3 in
         let _2 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 31353 "parser_cocci_menhir.ml"
+# 31469 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_postfix_expr_eexpr_dot_expressions_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_postfix_expr_eexpr_dot_expressions_ = 
-# 1659 "parser_cocci_menhir.mly"
+# 1696 "parser_cocci_menhir.mly"
      ( Ast0.wrap(Ast0.RecordAccess(_1, P.clt2mcode "." _2, _3)) )
-# 31361 "parser_cocci_menhir.ml"
+# 31477 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -31387,18 +31503,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_disj_ident = Obj.magic _3 in
         let _2 : (
-# 176 "parser_cocci_menhir.mly"
+# 202 "parser_cocci_menhir.mly"
        (Data.clt)
-# 31393 "parser_cocci_menhir.ml"
+# 31509 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_postfix_expr_eexpr_dot_expressions_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_postfix_expr_eexpr_dot_expressions_ = 
-# 1661 "parser_cocci_menhir.mly"
+# 1698 "parser_cocci_menhir.mly"
      ( Ast0.wrap(Ast0.RecordPtAccess(_1, P.clt2mcode "->" _2,
                                     _3)) )
-# 31402 "parser_cocci_menhir.ml"
+# 31518 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -31422,17 +31538,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _2 : (
-# 157 "parser_cocci_menhir.mly"
+# 183 "parser_cocci_menhir.mly"
        (Data.clt)
-# 31428 "parser_cocci_menhir.ml"
+# 31544 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_postfix_expr_eexpr_dot_expressions_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_postfix_expr_eexpr_dot_expressions_ = 
-# 1664 "parser_cocci_menhir.mly"
+# 1701 "parser_cocci_menhir.mly"
      ( Ast0.wrap(Ast0.Postfix (_1, P.clt2mcode Ast.Inc _2)) )
-# 31436 "parser_cocci_menhir.ml"
+# 31552 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -31456,17 +31572,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _2 : (
-# 157 "parser_cocci_menhir.mly"
+# 183 "parser_cocci_menhir.mly"
        (Data.clt)
-# 31462 "parser_cocci_menhir.ml"
+# 31578 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_postfix_expr_eexpr_dot_expressions_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_postfix_expr_eexpr_dot_expressions_ = 
-# 1666 "parser_cocci_menhir.mly"
+# 1703 "parser_cocci_menhir.mly"
      ( Ast0.wrap(Ast0.Postfix (_1, P.clt2mcode Ast.Dec _2)) )
-# 31470 "parser_cocci_menhir.ml"
+# 31586 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -31500,25 +31616,25 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _4 : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
-# 31506 "parser_cocci_menhir.ml"
+# 31622 "parser_cocci_menhir.ml"
         ) = Obj.magic _4 in
         let _3 : 'tv_eexpr_list_option = Obj.magic _3 in
         let _2 : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
-# 31512 "parser_cocci_menhir.ml"
+# 31628 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_postfix_expr_eexpr_dot_expressions_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__4_ in
         let _v : 'tv_postfix_expr_eexpr_dot_expressions_ = 
-# 1668 "parser_cocci_menhir.mly"
+# 1705 "parser_cocci_menhir.mly"
      ( Ast0.wrap(Ast0.FunCall(_1,P.clt2mcode "(" _2,
                              _3,
                              P.clt2mcode ")" _4)) )
-# 31522 "parser_cocci_menhir.ml"
+# 31638 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -31562,31 +31678,31 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _6 : (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
-# 31568 "parser_cocci_menhir.ml"
+# 31684 "parser_cocci_menhir.ml"
         ) = Obj.magic _6 in
         let _5 : 'tv_initialize_list = Obj.magic _5 in
         let _4 : (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
-# 31574 "parser_cocci_menhir.ml"
+# 31690 "parser_cocci_menhir.ml"
         ) = Obj.magic _4 in
         let _3 : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
-# 31579 "parser_cocci_menhir.ml"
+# 31695 "parser_cocci_menhir.ml"
         ) = Obj.magic _3 in
         let _2 : 'tv_ctype = Obj.magic _2 in
         let _1 : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
-# 31585 "parser_cocci_menhir.ml"
+# 31701 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__6_ in
         let _v : 'tv_postfix_expr_eexpr_dot_expressions_ = 
-# 1674 "parser_cocci_menhir.mly"
+# 1711 "parser_cocci_menhir.mly"
      ( let init =
        if P.struct_initializer _5
        then
@@ -31598,7 +31714,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           (Ast0.InitList(P.clt2mcode "{" _4,_5,P.clt2mcode "}" _6,true)) in
      Ast0.wrap
        (Ast0.Constructor(P.clt2mcode "(" _1, _2, P.clt2mcode ")" _3, init)) )
-# 31602 "parser_cocci_menhir.ml"
+# 31718 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -31620,9 +31736,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_postfix_expr_eexpr_invalid_ = 
-# 1654 "parser_cocci_menhir.mly"
+# 1691 "parser_cocci_menhir.mly"
                                                  ( _1 )
-# 31626 "parser_cocci_menhir.ml"
+# 31742 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -31656,24 +31772,24 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _4 : (
-# 174 "parser_cocci_menhir.mly"
+# 200 "parser_cocci_menhir.mly"
        (Data.clt)
-# 31662 "parser_cocci_menhir.ml"
+# 31778 "parser_cocci_menhir.ml"
         ) = Obj.magic _4 in
         let _3 : 'tv_eexpr = Obj.magic _3 in
         let _2 : (
-# 174 "parser_cocci_menhir.mly"
+# 200 "parser_cocci_menhir.mly"
        (Data.clt)
-# 31668 "parser_cocci_menhir.ml"
+# 31784 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_postfix_expr_eexpr_invalid_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__4_ in
         let _v : 'tv_postfix_expr_eexpr_invalid_ = 
-# 1656 "parser_cocci_menhir.mly"
+# 1693 "parser_cocci_menhir.mly"
      ( Ast0.wrap(Ast0.ArrayAccess (_1,P.clt2mcode "[" _2,_3,
                                       P.clt2mcode "]" _4)) )
-# 31677 "parser_cocci_menhir.ml"
+# 31793 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -31703,17 +31819,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_disj_ident = Obj.magic _3 in
         let _2 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 31709 "parser_cocci_menhir.ml"
+# 31825 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_postfix_expr_eexpr_invalid_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_postfix_expr_eexpr_invalid_ = 
-# 1659 "parser_cocci_menhir.mly"
+# 1696 "parser_cocci_menhir.mly"
      ( Ast0.wrap(Ast0.RecordAccess(_1, P.clt2mcode "." _2, _3)) )
-# 31717 "parser_cocci_menhir.ml"
+# 31833 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -31743,18 +31859,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_disj_ident = Obj.magic _3 in
         let _2 : (
-# 176 "parser_cocci_menhir.mly"
+# 202 "parser_cocci_menhir.mly"
        (Data.clt)
-# 31749 "parser_cocci_menhir.ml"
+# 31865 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_postfix_expr_eexpr_invalid_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_postfix_expr_eexpr_invalid_ = 
-# 1661 "parser_cocci_menhir.mly"
+# 1698 "parser_cocci_menhir.mly"
      ( Ast0.wrap(Ast0.RecordPtAccess(_1, P.clt2mcode "->" _2,
                                     _3)) )
-# 31758 "parser_cocci_menhir.ml"
+# 31874 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -31778,17 +31894,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _2 : (
-# 157 "parser_cocci_menhir.mly"
+# 183 "parser_cocci_menhir.mly"
        (Data.clt)
-# 31784 "parser_cocci_menhir.ml"
+# 31900 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_postfix_expr_eexpr_invalid_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_postfix_expr_eexpr_invalid_ = 
-# 1664 "parser_cocci_menhir.mly"
+# 1701 "parser_cocci_menhir.mly"
      ( Ast0.wrap(Ast0.Postfix (_1, P.clt2mcode Ast.Inc _2)) )
-# 31792 "parser_cocci_menhir.ml"
+# 31908 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -31812,17 +31928,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _2 : (
-# 157 "parser_cocci_menhir.mly"
+# 183 "parser_cocci_menhir.mly"
        (Data.clt)
-# 31818 "parser_cocci_menhir.ml"
+# 31934 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_postfix_expr_eexpr_invalid_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_postfix_expr_eexpr_invalid_ = 
-# 1666 "parser_cocci_menhir.mly"
+# 1703 "parser_cocci_menhir.mly"
      ( Ast0.wrap(Ast0.Postfix (_1, P.clt2mcode Ast.Dec _2)) )
-# 31826 "parser_cocci_menhir.ml"
+# 31942 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -31856,25 +31972,25 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _4 : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
-# 31862 "parser_cocci_menhir.ml"
+# 31978 "parser_cocci_menhir.ml"
         ) = Obj.magic _4 in
         let _3 : 'tv_eexpr_list_option = Obj.magic _3 in
         let _2 : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
-# 31868 "parser_cocci_menhir.ml"
+# 31984 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_postfix_expr_eexpr_invalid_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__4_ in
         let _v : 'tv_postfix_expr_eexpr_invalid_ = 
-# 1668 "parser_cocci_menhir.mly"
+# 1705 "parser_cocci_menhir.mly"
      ( Ast0.wrap(Ast0.FunCall(_1,P.clt2mcode "(" _2,
                              _3,
                              P.clt2mcode ")" _4)) )
-# 31878 "parser_cocci_menhir.ml"
+# 31994 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -31918,31 +32034,31 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _6 : (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
-# 31924 "parser_cocci_menhir.ml"
+# 32040 "parser_cocci_menhir.ml"
         ) = Obj.magic _6 in
         let _5 : 'tv_initialize_list = Obj.magic _5 in
         let _4 : (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
-# 31930 "parser_cocci_menhir.ml"
+# 32046 "parser_cocci_menhir.ml"
         ) = Obj.magic _4 in
         let _3 : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
-# 31935 "parser_cocci_menhir.ml"
+# 32051 "parser_cocci_menhir.ml"
         ) = Obj.magic _3 in
         let _2 : 'tv_ctype = Obj.magic _2 in
         let _1 : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
-# 31941 "parser_cocci_menhir.ml"
+# 32057 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__6_ in
         let _v : 'tv_postfix_expr_eexpr_invalid_ = 
-# 1674 "parser_cocci_menhir.mly"
+# 1711 "parser_cocci_menhir.mly"
      ( let init =
        if P.struct_initializer _5
        then
@@ -31954,7 +32070,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           (Ast0.InitList(P.clt2mcode "{" _4,_5,P.clt2mcode "}" _6,true)) in
      Ast0.wrap
        (Ast0.Constructor(P.clt2mcode "(" _1, _2, P.clt2mcode ")" _3, init)) )
-# 31958 "parser_cocci_menhir.ml"
+# 32074 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -31976,9 +32092,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_postfix_expr_eexpr_nest_expressions_ = 
-# 1654 "parser_cocci_menhir.mly"
+# 1691 "parser_cocci_menhir.mly"
                                                  ( _1 )
-# 31982 "parser_cocci_menhir.ml"
+# 32098 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -32012,24 +32128,24 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _4 : (
-# 174 "parser_cocci_menhir.mly"
+# 200 "parser_cocci_menhir.mly"
        (Data.clt)
-# 32018 "parser_cocci_menhir.ml"
+# 32134 "parser_cocci_menhir.ml"
         ) = Obj.magic _4 in
         let _3 : 'tv_eexpr = Obj.magic _3 in
         let _2 : (
-# 174 "parser_cocci_menhir.mly"
+# 200 "parser_cocci_menhir.mly"
        (Data.clt)
-# 32024 "parser_cocci_menhir.ml"
+# 32140 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_postfix_expr_eexpr_nest_expressions_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__4_ in
         let _v : 'tv_postfix_expr_eexpr_nest_expressions_ = 
-# 1656 "parser_cocci_menhir.mly"
+# 1693 "parser_cocci_menhir.mly"
      ( Ast0.wrap(Ast0.ArrayAccess (_1,P.clt2mcode "[" _2,_3,
                                       P.clt2mcode "]" _4)) )
-# 32033 "parser_cocci_menhir.ml"
+# 32149 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -32059,17 +32175,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_disj_ident = Obj.magic _3 in
         let _2 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 32065 "parser_cocci_menhir.ml"
+# 32181 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_postfix_expr_eexpr_nest_expressions_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_postfix_expr_eexpr_nest_expressions_ = 
-# 1659 "parser_cocci_menhir.mly"
+# 1696 "parser_cocci_menhir.mly"
      ( Ast0.wrap(Ast0.RecordAccess(_1, P.clt2mcode "." _2, _3)) )
-# 32073 "parser_cocci_menhir.ml"
+# 32189 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -32099,18 +32215,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_disj_ident = Obj.magic _3 in
         let _2 : (
-# 176 "parser_cocci_menhir.mly"
+# 202 "parser_cocci_menhir.mly"
        (Data.clt)
-# 32105 "parser_cocci_menhir.ml"
+# 32221 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_postfix_expr_eexpr_nest_expressions_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_postfix_expr_eexpr_nest_expressions_ = 
-# 1661 "parser_cocci_menhir.mly"
+# 1698 "parser_cocci_menhir.mly"
      ( Ast0.wrap(Ast0.RecordPtAccess(_1, P.clt2mcode "->" _2,
                                     _3)) )
-# 32114 "parser_cocci_menhir.ml"
+# 32230 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -32134,17 +32250,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _2 : (
-# 157 "parser_cocci_menhir.mly"
+# 183 "parser_cocci_menhir.mly"
        (Data.clt)
-# 32140 "parser_cocci_menhir.ml"
+# 32256 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_postfix_expr_eexpr_nest_expressions_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_postfix_expr_eexpr_nest_expressions_ = 
-# 1664 "parser_cocci_menhir.mly"
+# 1701 "parser_cocci_menhir.mly"
      ( Ast0.wrap(Ast0.Postfix (_1, P.clt2mcode Ast.Inc _2)) )
-# 32148 "parser_cocci_menhir.ml"
+# 32264 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -32168,17 +32284,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _2 : (
-# 157 "parser_cocci_menhir.mly"
+# 183 "parser_cocci_menhir.mly"
        (Data.clt)
-# 32174 "parser_cocci_menhir.ml"
+# 32290 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_postfix_expr_eexpr_nest_expressions_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_postfix_expr_eexpr_nest_expressions_ = 
-# 1666 "parser_cocci_menhir.mly"
+# 1703 "parser_cocci_menhir.mly"
      ( Ast0.wrap(Ast0.Postfix (_1, P.clt2mcode Ast.Dec _2)) )
-# 32182 "parser_cocci_menhir.ml"
+# 32298 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -32212,25 +32328,25 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _4 : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
-# 32218 "parser_cocci_menhir.ml"
+# 32334 "parser_cocci_menhir.ml"
         ) = Obj.magic _4 in
         let _3 : 'tv_eexpr_list_option = Obj.magic _3 in
         let _2 : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
-# 32224 "parser_cocci_menhir.ml"
+# 32340 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_postfix_expr_eexpr_nest_expressions_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__4_ in
         let _v : 'tv_postfix_expr_eexpr_nest_expressions_ = 
-# 1668 "parser_cocci_menhir.mly"
+# 1705 "parser_cocci_menhir.mly"
      ( Ast0.wrap(Ast0.FunCall(_1,P.clt2mcode "(" _2,
                              _3,
                              P.clt2mcode ")" _4)) )
-# 32234 "parser_cocci_menhir.ml"
+# 32350 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -32274,31 +32390,31 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _6 : (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
-# 32280 "parser_cocci_menhir.ml"
+# 32396 "parser_cocci_menhir.ml"
         ) = Obj.magic _6 in
         let _5 : 'tv_initialize_list = Obj.magic _5 in
         let _4 : (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
-# 32286 "parser_cocci_menhir.ml"
+# 32402 "parser_cocci_menhir.ml"
         ) = Obj.magic _4 in
         let _3 : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
-# 32291 "parser_cocci_menhir.ml"
+# 32407 "parser_cocci_menhir.ml"
         ) = Obj.magic _3 in
         let _2 : 'tv_ctype = Obj.magic _2 in
         let _1 : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
-# 32297 "parser_cocci_menhir.ml"
+# 32413 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__6_ in
         let _v : 'tv_postfix_expr_eexpr_nest_expressions_ = 
-# 1674 "parser_cocci_menhir.mly"
+# 1711 "parser_cocci_menhir.mly"
      ( let init =
        if P.struct_initializer _5
        then
@@ -32310,7 +32426,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           (Ast0.InitList(P.clt2mcode "{" _4,_5,P.clt2mcode "}" _6,true)) in
      Ast0.wrap
        (Ast0.Constructor(P.clt2mcode "(" _1, _2, P.clt2mcode ")" _3, init)) )
-# 32314 "parser_cocci_menhir.ml"
+# 32430 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -32332,9 +32448,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_postfix_expr_expr_invalid_ = 
-# 1654 "parser_cocci_menhir.mly"
+# 1691 "parser_cocci_menhir.mly"
                                                  ( _1 )
-# 32338 "parser_cocci_menhir.ml"
+# 32454 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -32368,24 +32484,24 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _4 : (
-# 174 "parser_cocci_menhir.mly"
+# 200 "parser_cocci_menhir.mly"
        (Data.clt)
-# 32374 "parser_cocci_menhir.ml"
+# 32490 "parser_cocci_menhir.ml"
         ) = Obj.magic _4 in
         let _3 : 'tv_eexpr = Obj.magic _3 in
         let _2 : (
-# 174 "parser_cocci_menhir.mly"
+# 200 "parser_cocci_menhir.mly"
        (Data.clt)
-# 32380 "parser_cocci_menhir.ml"
+# 32496 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_postfix_expr_expr_invalid_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__4_ in
         let _v : 'tv_postfix_expr_expr_invalid_ = 
-# 1656 "parser_cocci_menhir.mly"
+# 1693 "parser_cocci_menhir.mly"
      ( Ast0.wrap(Ast0.ArrayAccess (_1,P.clt2mcode "[" _2,_3,
                                       P.clt2mcode "]" _4)) )
-# 32389 "parser_cocci_menhir.ml"
+# 32505 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -32415,17 +32531,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_disj_ident = Obj.magic _3 in
         let _2 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 32421 "parser_cocci_menhir.ml"
+# 32537 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_postfix_expr_expr_invalid_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_postfix_expr_expr_invalid_ = 
-# 1659 "parser_cocci_menhir.mly"
+# 1696 "parser_cocci_menhir.mly"
      ( Ast0.wrap(Ast0.RecordAccess(_1, P.clt2mcode "." _2, _3)) )
-# 32429 "parser_cocci_menhir.ml"
+# 32545 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -32455,18 +32571,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_disj_ident = Obj.magic _3 in
         let _2 : (
-# 176 "parser_cocci_menhir.mly"
+# 202 "parser_cocci_menhir.mly"
        (Data.clt)
-# 32461 "parser_cocci_menhir.ml"
+# 32577 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_postfix_expr_expr_invalid_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_postfix_expr_expr_invalid_ = 
-# 1661 "parser_cocci_menhir.mly"
+# 1698 "parser_cocci_menhir.mly"
      ( Ast0.wrap(Ast0.RecordPtAccess(_1, P.clt2mcode "->" _2,
                                     _3)) )
-# 32470 "parser_cocci_menhir.ml"
+# 32586 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -32490,17 +32606,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _2 : (
-# 157 "parser_cocci_menhir.mly"
+# 183 "parser_cocci_menhir.mly"
        (Data.clt)
-# 32496 "parser_cocci_menhir.ml"
+# 32612 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_postfix_expr_expr_invalid_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_postfix_expr_expr_invalid_ = 
-# 1664 "parser_cocci_menhir.mly"
+# 1701 "parser_cocci_menhir.mly"
      ( Ast0.wrap(Ast0.Postfix (_1, P.clt2mcode Ast.Inc _2)) )
-# 32504 "parser_cocci_menhir.ml"
+# 32620 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -32524,17 +32640,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _2 : (
-# 157 "parser_cocci_menhir.mly"
+# 183 "parser_cocci_menhir.mly"
        (Data.clt)
-# 32530 "parser_cocci_menhir.ml"
+# 32646 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_postfix_expr_expr_invalid_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_postfix_expr_expr_invalid_ = 
-# 1666 "parser_cocci_menhir.mly"
+# 1703 "parser_cocci_menhir.mly"
      ( Ast0.wrap(Ast0.Postfix (_1, P.clt2mcode Ast.Dec _2)) )
-# 32538 "parser_cocci_menhir.ml"
+# 32654 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -32568,25 +32684,25 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _4 : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
-# 32574 "parser_cocci_menhir.ml"
+# 32690 "parser_cocci_menhir.ml"
         ) = Obj.magic _4 in
         let _3 : 'tv_eexpr_list_option = Obj.magic _3 in
         let _2 : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
-# 32580 "parser_cocci_menhir.ml"
+# 32696 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_postfix_expr_expr_invalid_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__4_ in
         let _v : 'tv_postfix_expr_expr_invalid_ = 
-# 1668 "parser_cocci_menhir.mly"
+# 1705 "parser_cocci_menhir.mly"
      ( Ast0.wrap(Ast0.FunCall(_1,P.clt2mcode "(" _2,
                              _3,
                              P.clt2mcode ")" _4)) )
-# 32590 "parser_cocci_menhir.ml"
+# 32706 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -32630,31 +32746,31 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _6 : (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
-# 32636 "parser_cocci_menhir.ml"
+# 32752 "parser_cocci_menhir.ml"
         ) = Obj.magic _6 in
         let _5 : 'tv_initialize_list = Obj.magic _5 in
         let _4 : (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
-# 32642 "parser_cocci_menhir.ml"
+# 32758 "parser_cocci_menhir.ml"
         ) = Obj.magic _4 in
         let _3 : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
-# 32647 "parser_cocci_menhir.ml"
+# 32763 "parser_cocci_menhir.ml"
         ) = Obj.magic _3 in
         let _2 : 'tv_ctype = Obj.magic _2 in
         let _1 : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
-# 32653 "parser_cocci_menhir.ml"
+# 32769 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__6_ in
         let _v : 'tv_postfix_expr_expr_invalid_ = 
-# 1674 "parser_cocci_menhir.mly"
+# 1711 "parser_cocci_menhir.mly"
      ( let init =
        if P.struct_initializer _5
        then
@@ -32666,7 +32782,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           (Ast0.InitList(P.clt2mcode "{" _4,_5,P.clt2mcode "}" _6,true)) in
      Ast0.wrap
        (Ast0.Constructor(P.clt2mcode "(" _1, _2, P.clt2mcode ")" _3, init)) )
-# 32670 "parser_cocci_menhir.ml"
+# 32786 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -32688,9 +32804,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_pre_basic_expr_eexpr_dot_expressions_ = 
-# 1503 "parser_cocci_menhir.mly"
+# 1540 "parser_cocci_menhir.mly"
                                                           ( _1 )
-# 32694 "parser_cocci_menhir.ml"
+# 32810 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -32720,17 +32836,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_basic_expr_eexpr_dot_expressions_ = Obj.magic _3 in
         let _2 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 32726 "parser_cocci_menhir.ml"
+# 32842 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_pre_basic_expr_eexpr_dot_expressions_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_pre_basic_expr_eexpr_dot_expressions_ = 
-# 1506 "parser_cocci_menhir.mly"
+# 1543 "parser_cocci_menhir.mly"
      ( Ast0.wrap(Ast0.Sequence(_1,P.clt2mcode "," _2,_3)) )
-# 32734 "parser_cocci_menhir.ml"
+# 32850 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -32752,9 +32868,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_pre_basic_expr_eexpr_nest_expressions_ = 
-# 1503 "parser_cocci_menhir.mly"
+# 1540 "parser_cocci_menhir.mly"
                                                           ( _1 )
-# 32758 "parser_cocci_menhir.ml"
+# 32874 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -32784,17 +32900,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_basic_expr_eexpr_nest_expressions_ = Obj.magic _3 in
         let _2 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 32790 "parser_cocci_menhir.ml"
+# 32906 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_pre_basic_expr_eexpr_nest_expressions_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_pre_basic_expr_eexpr_nest_expressions_ = 
-# 1506 "parser_cocci_menhir.mly"
+# 1543 "parser_cocci_menhir.mly"
      ( Ast0.wrap(Ast0.Sequence(_1,P.clt2mcode "," _2,_3)) )
-# 32798 "parser_cocci_menhir.ml"
+# 32914 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -32816,9 +32932,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_dot_expressions_ = 
-# 1687 "parser_cocci_menhir.mly"
+# 1724 "parser_cocci_menhir.mly"
                 ( Ast0.wrap(Ast0.Ident(_1)) )
-# 32822 "parser_cocci_menhir.ml"
+# 32938 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -32843,17 +32959,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _2 : 'tv_ident = Obj.magic _2 in
         let _1 : (
-# 162 "parser_cocci_menhir.mly"
+# 188 "parser_cocci_menhir.mly"
        (Data.clt)
-# 32849 "parser_cocci_menhir.ml"
+# 32965 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_primary_expr_eexpr_dot_expressions_ = 
-# 1689 "parser_cocci_menhir.mly"
+# 1726 "parser_cocci_menhir.mly"
      ( let op = P.clt2mcode Ast.GetRefLabel _1 in
      Ast0.wrap(Ast0.Unary(Ast0.wrap(Ast0.Ident(_2)), op)) )
-# 32857 "parser_cocci_menhir.ml"
+# 32973 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -32872,17 +32988,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 159 "parser_cocci_menhir.mly"
+# 185 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 32878 "parser_cocci_menhir.ml"
+# 32994 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_dot_expressions_ = 
-# 1692 "parser_cocci_menhir.mly"
+# 1729 "parser_cocci_menhir.mly"
      ( let (x,clt) = _1 in
      Ast0.wrap(Ast0.Constant (P.clt2mcode (Ast.Int x) clt)) )
-# 32886 "parser_cocci_menhir.ml"
+# 33002 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -32901,17 +33017,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 159 "parser_cocci_menhir.mly"
+# 185 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 32907 "parser_cocci_menhir.ml"
+# 33023 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_dot_expressions_ = 
-# 1695 "parser_cocci_menhir.mly"
+# 1732 "parser_cocci_menhir.mly"
      ( let (x,clt) = _1 in
      Ast0.wrap(Ast0.Constant (P.clt2mcode (Ast.Float x) clt)) )
-# 32915 "parser_cocci_menhir.ml"
+# 33031 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -32930,17 +33046,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 159 "parser_cocci_menhir.mly"
+# 185 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 32936 "parser_cocci_menhir.ml"
+# 33052 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_dot_expressions_ = 
-# 1698 "parser_cocci_menhir.mly"
+# 1735 "parser_cocci_menhir.mly"
      ( let (x,clt) = _1 in
      Ast0.wrap(Ast0.Constant (P.clt2mcode (Ast.String x) clt)) )
-# 32944 "parser_cocci_menhir.ml"
+# 33060 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -32959,17 +33075,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 159 "parser_cocci_menhir.mly"
+# 185 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 32965 "parser_cocci_menhir.ml"
+# 33081 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_dot_expressions_ = 
-# 1701 "parser_cocci_menhir.mly"
+# 1738 "parser_cocci_menhir.mly"
      ( let (x,clt) = _1 in
      Ast0.wrap(Ast0.Constant (P.clt2mcode (Ast.Char x) clt)) )
-# 32973 "parser_cocci_menhir.ml"
+# 33089 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -32988,18 +33104,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 138 "parser_cocci_menhir.mly"
+# 164 "parser_cocci_menhir.mly"
        (Parse_aux.typed_expinfo)
-# 32994 "parser_cocci_menhir.ml"
+# 33110 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_dot_expressions_ = 
-# 1704 "parser_cocci_menhir.mly"
+# 1741 "parser_cocci_menhir.mly"
      ( let (nm,constraints,pure,ty,clt) = _1 in
      Ast0.wrap
        (Ast0.MetaExpr(P.clt2mcode nm clt,constraints,ty,Ast.CONST,pure)) )
-# 33003 "parser_cocci_menhir.ml"
+# 33119 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -33018,17 +33134,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 133 "parser_cocci_menhir.mly"
+# 159 "parser_cocci_menhir.mly"
        (Parse_aux.expinfo)
-# 33024 "parser_cocci_menhir.ml"
+# 33140 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_dot_expressions_ = 
-# 1708 "parser_cocci_menhir.mly"
+# 1745 "parser_cocci_menhir.mly"
      ( let (nm,constraints,pure,clt) = _1 in
      Ast0.wrap(Ast0.MetaErr(P.clt2mcode nm clt,constraints,pure)) )
-# 33032 "parser_cocci_menhir.ml"
+# 33148 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -33047,18 +33163,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 138 "parser_cocci_menhir.mly"
+# 164 "parser_cocci_menhir.mly"
        (Parse_aux.typed_expinfo)
-# 33053 "parser_cocci_menhir.ml"
+# 33169 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_dot_expressions_ = 
-# 1711 "parser_cocci_menhir.mly"
+# 1748 "parser_cocci_menhir.mly"
      ( let (nm,constraints,pure,ty,clt) = _1 in
      Ast0.wrap
        (Ast0.MetaExpr(P.clt2mcode nm clt,constraints,ty,Ast.ANY,pure)) )
-# 33062 "parser_cocci_menhir.ml"
+# 33178 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -33077,18 +33193,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 138 "parser_cocci_menhir.mly"
+# 164 "parser_cocci_menhir.mly"
        (Parse_aux.typed_expinfo)
-# 33083 "parser_cocci_menhir.ml"
+# 33199 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_dot_expressions_ = 
-# 1715 "parser_cocci_menhir.mly"
+# 1752 "parser_cocci_menhir.mly"
      ( let (nm,constraints,pure,ty,clt) = _1 in
      Ast0.wrap
        (Ast0.MetaExpr(P.clt2mcode nm clt,constraints,ty,Ast.ID,pure)) )
-# 33092 "parser_cocci_menhir.ml"
+# 33208 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -33107,18 +33223,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 138 "parser_cocci_menhir.mly"
+# 164 "parser_cocci_menhir.mly"
        (Parse_aux.typed_expinfo)
-# 33113 "parser_cocci_menhir.ml"
+# 33229 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_dot_expressions_ = 
-# 1719 "parser_cocci_menhir.mly"
+# 1756 "parser_cocci_menhir.mly"
      ( let (nm,constraints,pure,ty,clt) = _1 in
      Ast0.wrap
        (Ast0.MetaExpr(P.clt2mcode nm clt,constraints,ty,Ast.LocalID,pure)) )
-# 33122 "parser_cocci_menhir.ml"
+# 33238 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -33147,23 +33263,23 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _3 : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
-# 33153 "parser_cocci_menhir.ml"
+# 33269 "parser_cocci_menhir.ml"
         ) = Obj.magic _3 in
         let _2 : 'tv_eexpr = Obj.magic _2 in
         let _1 : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
-# 33159 "parser_cocci_menhir.ml"
+# 33275 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_primary_expr_eexpr_dot_expressions_ = 
-# 1723 "parser_cocci_menhir.mly"
+# 1760 "parser_cocci_menhir.mly"
      ( Ast0.wrap(Ast0.Paren(P.clt2mcode "(" _1,_2,
                            P.clt2mcode ")" _3)) )
-# 33167 "parser_cocci_menhir.ml"
+# 33283 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -33192,25 +33308,25 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _3 : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
-# 33198 "parser_cocci_menhir.ml"
+# 33314 "parser_cocci_menhir.ml"
         ) = Obj.magic _3 in
         let _2 : 'tv_midzero_list_eexpr_eexpr_ = Obj.magic _2 in
         let _1 : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
-# 33204 "parser_cocci_menhir.ml"
+# 33320 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_primary_expr_eexpr_dot_expressions_ = 
-# 1726 "parser_cocci_menhir.mly"
+# 1763 "parser_cocci_menhir.mly"
      ( let (mids,code) = _2 in
        Ast0.wrap(Ast0.DisjExpr(P.clt2mcode "(" _1,
                               code, mids,
                               P.clt2mcode ")" _3)) )
-# 33214 "parser_cocci_menhir.ml"
+# 33330 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -33232,9 +33348,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_dot_expressions_ = 
-# 1730 "parser_cocci_menhir.mly"
+# 1767 "parser_cocci_menhir.mly"
                  ( _1 )
-# 33238 "parser_cocci_menhir.ml"
+# 33354 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -33256,9 +33372,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_invalid_ = 
-# 1687 "parser_cocci_menhir.mly"
+# 1724 "parser_cocci_menhir.mly"
                 ( Ast0.wrap(Ast0.Ident(_1)) )
-# 33262 "parser_cocci_menhir.ml"
+# 33378 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -33283,17 +33399,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _2 : 'tv_ident = Obj.magic _2 in
         let _1 : (
-# 162 "parser_cocci_menhir.mly"
+# 188 "parser_cocci_menhir.mly"
        (Data.clt)
-# 33289 "parser_cocci_menhir.ml"
+# 33405 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_primary_expr_eexpr_invalid_ = 
-# 1689 "parser_cocci_menhir.mly"
+# 1726 "parser_cocci_menhir.mly"
      ( let op = P.clt2mcode Ast.GetRefLabel _1 in
      Ast0.wrap(Ast0.Unary(Ast0.wrap(Ast0.Ident(_2)), op)) )
-# 33297 "parser_cocci_menhir.ml"
+# 33413 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -33312,17 +33428,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 159 "parser_cocci_menhir.mly"
+# 185 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 33318 "parser_cocci_menhir.ml"
+# 33434 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_invalid_ = 
-# 1692 "parser_cocci_menhir.mly"
+# 1729 "parser_cocci_menhir.mly"
      ( let (x,clt) = _1 in
      Ast0.wrap(Ast0.Constant (P.clt2mcode (Ast.Int x) clt)) )
-# 33326 "parser_cocci_menhir.ml"
+# 33442 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -33341,17 +33457,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 159 "parser_cocci_menhir.mly"
+# 185 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 33347 "parser_cocci_menhir.ml"
+# 33463 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_invalid_ = 
-# 1695 "parser_cocci_menhir.mly"
+# 1732 "parser_cocci_menhir.mly"
      ( let (x,clt) = _1 in
      Ast0.wrap(Ast0.Constant (P.clt2mcode (Ast.Float x) clt)) )
-# 33355 "parser_cocci_menhir.ml"
+# 33471 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -33370,17 +33486,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 159 "parser_cocci_menhir.mly"
+# 185 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 33376 "parser_cocci_menhir.ml"
+# 33492 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_invalid_ = 
-# 1698 "parser_cocci_menhir.mly"
+# 1735 "parser_cocci_menhir.mly"
      ( let (x,clt) = _1 in
      Ast0.wrap(Ast0.Constant (P.clt2mcode (Ast.String x) clt)) )
-# 33384 "parser_cocci_menhir.ml"
+# 33500 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -33399,17 +33515,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 159 "parser_cocci_menhir.mly"
+# 185 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 33405 "parser_cocci_menhir.ml"
+# 33521 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_invalid_ = 
-# 1701 "parser_cocci_menhir.mly"
+# 1738 "parser_cocci_menhir.mly"
      ( let (x,clt) = _1 in
      Ast0.wrap(Ast0.Constant (P.clt2mcode (Ast.Char x) clt)) )
-# 33413 "parser_cocci_menhir.ml"
+# 33529 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -33428,18 +33544,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 138 "parser_cocci_menhir.mly"
+# 164 "parser_cocci_menhir.mly"
        (Parse_aux.typed_expinfo)
-# 33434 "parser_cocci_menhir.ml"
+# 33550 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_invalid_ = 
-# 1704 "parser_cocci_menhir.mly"
+# 1741 "parser_cocci_menhir.mly"
      ( let (nm,constraints,pure,ty,clt) = _1 in
      Ast0.wrap
        (Ast0.MetaExpr(P.clt2mcode nm clt,constraints,ty,Ast.CONST,pure)) )
-# 33443 "parser_cocci_menhir.ml"
+# 33559 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -33458,17 +33574,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 133 "parser_cocci_menhir.mly"
+# 159 "parser_cocci_menhir.mly"
        (Parse_aux.expinfo)
-# 33464 "parser_cocci_menhir.ml"
+# 33580 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_invalid_ = 
-# 1708 "parser_cocci_menhir.mly"
+# 1745 "parser_cocci_menhir.mly"
      ( let (nm,constraints,pure,clt) = _1 in
      Ast0.wrap(Ast0.MetaErr(P.clt2mcode nm clt,constraints,pure)) )
-# 33472 "parser_cocci_menhir.ml"
+# 33588 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -33487,18 +33603,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 138 "parser_cocci_menhir.mly"
+# 164 "parser_cocci_menhir.mly"
        (Parse_aux.typed_expinfo)
-# 33493 "parser_cocci_menhir.ml"
+# 33609 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_invalid_ = 
-# 1711 "parser_cocci_menhir.mly"
+# 1748 "parser_cocci_menhir.mly"
      ( let (nm,constraints,pure,ty,clt) = _1 in
      Ast0.wrap
        (Ast0.MetaExpr(P.clt2mcode nm clt,constraints,ty,Ast.ANY,pure)) )
-# 33502 "parser_cocci_menhir.ml"
+# 33618 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -33517,18 +33633,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 138 "parser_cocci_menhir.mly"
+# 164 "parser_cocci_menhir.mly"
        (Parse_aux.typed_expinfo)
-# 33523 "parser_cocci_menhir.ml"
+# 33639 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_invalid_ = 
-# 1715 "parser_cocci_menhir.mly"
+# 1752 "parser_cocci_menhir.mly"
      ( let (nm,constraints,pure,ty,clt) = _1 in
      Ast0.wrap
        (Ast0.MetaExpr(P.clt2mcode nm clt,constraints,ty,Ast.ID,pure)) )
-# 33532 "parser_cocci_menhir.ml"
+# 33648 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -33547,18 +33663,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 138 "parser_cocci_menhir.mly"
+# 164 "parser_cocci_menhir.mly"
        (Parse_aux.typed_expinfo)
-# 33553 "parser_cocci_menhir.ml"
+# 33669 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_invalid_ = 
-# 1719 "parser_cocci_menhir.mly"
+# 1756 "parser_cocci_menhir.mly"
      ( let (nm,constraints,pure,ty,clt) = _1 in
      Ast0.wrap
        (Ast0.MetaExpr(P.clt2mcode nm clt,constraints,ty,Ast.LocalID,pure)) )
-# 33562 "parser_cocci_menhir.ml"
+# 33678 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -33587,23 +33703,23 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _3 : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
-# 33593 "parser_cocci_menhir.ml"
+# 33709 "parser_cocci_menhir.ml"
         ) = Obj.magic _3 in
         let _2 : 'tv_eexpr = Obj.magic _2 in
         let _1 : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
-# 33599 "parser_cocci_menhir.ml"
+# 33715 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_primary_expr_eexpr_invalid_ = 
-# 1723 "parser_cocci_menhir.mly"
+# 1760 "parser_cocci_menhir.mly"
      ( Ast0.wrap(Ast0.Paren(P.clt2mcode "(" _1,_2,
                            P.clt2mcode ")" _3)) )
-# 33607 "parser_cocci_menhir.ml"
+# 33723 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -33632,25 +33748,25 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _3 : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
-# 33638 "parser_cocci_menhir.ml"
+# 33754 "parser_cocci_menhir.ml"
         ) = Obj.magic _3 in
         let _2 : 'tv_midzero_list_eexpr_eexpr_ = Obj.magic _2 in
         let _1 : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
-# 33644 "parser_cocci_menhir.ml"
+# 33760 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_primary_expr_eexpr_invalid_ = 
-# 1726 "parser_cocci_menhir.mly"
+# 1763 "parser_cocci_menhir.mly"
      ( let (mids,code) = _2 in
        Ast0.wrap(Ast0.DisjExpr(P.clt2mcode "(" _1,
                               code, mids,
                               P.clt2mcode ")" _3)) )
-# 33654 "parser_cocci_menhir.ml"
+# 33770 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -33672,9 +33788,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_invalid_ = 
-# 1730 "parser_cocci_menhir.mly"
+# 1767 "parser_cocci_menhir.mly"
                  ( _1 )
-# 33678 "parser_cocci_menhir.ml"
+# 33794 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -33696,9 +33812,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_nest_expressions_ = 
-# 1687 "parser_cocci_menhir.mly"
+# 1724 "parser_cocci_menhir.mly"
                 ( Ast0.wrap(Ast0.Ident(_1)) )
-# 33702 "parser_cocci_menhir.ml"
+# 33818 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -33723,17 +33839,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _2 : 'tv_ident = Obj.magic _2 in
         let _1 : (
-# 162 "parser_cocci_menhir.mly"
+# 188 "parser_cocci_menhir.mly"
        (Data.clt)
-# 33729 "parser_cocci_menhir.ml"
+# 33845 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_primary_expr_eexpr_nest_expressions_ = 
-# 1689 "parser_cocci_menhir.mly"
+# 1726 "parser_cocci_menhir.mly"
      ( let op = P.clt2mcode Ast.GetRefLabel _1 in
      Ast0.wrap(Ast0.Unary(Ast0.wrap(Ast0.Ident(_2)), op)) )
-# 33737 "parser_cocci_menhir.ml"
+# 33853 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -33752,17 +33868,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 159 "parser_cocci_menhir.mly"
+# 185 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 33758 "parser_cocci_menhir.ml"
+# 33874 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_nest_expressions_ = 
-# 1692 "parser_cocci_menhir.mly"
+# 1729 "parser_cocci_menhir.mly"
      ( let (x,clt) = _1 in
      Ast0.wrap(Ast0.Constant (P.clt2mcode (Ast.Int x) clt)) )
-# 33766 "parser_cocci_menhir.ml"
+# 33882 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -33781,17 +33897,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 159 "parser_cocci_menhir.mly"
+# 185 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 33787 "parser_cocci_menhir.ml"
+# 33903 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_nest_expressions_ = 
-# 1695 "parser_cocci_menhir.mly"
+# 1732 "parser_cocci_menhir.mly"
      ( let (x,clt) = _1 in
      Ast0.wrap(Ast0.Constant (P.clt2mcode (Ast.Float x) clt)) )
-# 33795 "parser_cocci_menhir.ml"
+# 33911 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -33810,17 +33926,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 159 "parser_cocci_menhir.mly"
+# 185 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 33816 "parser_cocci_menhir.ml"
+# 33932 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_nest_expressions_ = 
-# 1698 "parser_cocci_menhir.mly"
+# 1735 "parser_cocci_menhir.mly"
      ( let (x,clt) = _1 in
      Ast0.wrap(Ast0.Constant (P.clt2mcode (Ast.String x) clt)) )
-# 33824 "parser_cocci_menhir.ml"
+# 33940 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -33839,17 +33955,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 159 "parser_cocci_menhir.mly"
+# 185 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 33845 "parser_cocci_menhir.ml"
+# 33961 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_nest_expressions_ = 
-# 1701 "parser_cocci_menhir.mly"
+# 1738 "parser_cocci_menhir.mly"
      ( let (x,clt) = _1 in
      Ast0.wrap(Ast0.Constant (P.clt2mcode (Ast.Char x) clt)) )
-# 33853 "parser_cocci_menhir.ml"
+# 33969 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -33868,18 +33984,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 138 "parser_cocci_menhir.mly"
+# 164 "parser_cocci_menhir.mly"
        (Parse_aux.typed_expinfo)
-# 33874 "parser_cocci_menhir.ml"
+# 33990 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_nest_expressions_ = 
-# 1704 "parser_cocci_menhir.mly"
+# 1741 "parser_cocci_menhir.mly"
      ( let (nm,constraints,pure,ty,clt) = _1 in
      Ast0.wrap
        (Ast0.MetaExpr(P.clt2mcode nm clt,constraints,ty,Ast.CONST,pure)) )
-# 33883 "parser_cocci_menhir.ml"
+# 33999 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -33898,17 +34014,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 133 "parser_cocci_menhir.mly"
+# 159 "parser_cocci_menhir.mly"
        (Parse_aux.expinfo)
-# 33904 "parser_cocci_menhir.ml"
+# 34020 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_nest_expressions_ = 
-# 1708 "parser_cocci_menhir.mly"
+# 1745 "parser_cocci_menhir.mly"
      ( let (nm,constraints,pure,clt) = _1 in
      Ast0.wrap(Ast0.MetaErr(P.clt2mcode nm clt,constraints,pure)) )
-# 33912 "parser_cocci_menhir.ml"
+# 34028 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -33927,18 +34043,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 138 "parser_cocci_menhir.mly"
+# 164 "parser_cocci_menhir.mly"
        (Parse_aux.typed_expinfo)
-# 33933 "parser_cocci_menhir.ml"
+# 34049 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_nest_expressions_ = 
-# 1711 "parser_cocci_menhir.mly"
+# 1748 "parser_cocci_menhir.mly"
      ( let (nm,constraints,pure,ty,clt) = _1 in
      Ast0.wrap
        (Ast0.MetaExpr(P.clt2mcode nm clt,constraints,ty,Ast.ANY,pure)) )
-# 33942 "parser_cocci_menhir.ml"
+# 34058 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -33957,18 +34073,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 138 "parser_cocci_menhir.mly"
+# 164 "parser_cocci_menhir.mly"
        (Parse_aux.typed_expinfo)
-# 33963 "parser_cocci_menhir.ml"
+# 34079 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_nest_expressions_ = 
-# 1715 "parser_cocci_menhir.mly"
+# 1752 "parser_cocci_menhir.mly"
      ( let (nm,constraints,pure,ty,clt) = _1 in
      Ast0.wrap
        (Ast0.MetaExpr(P.clt2mcode nm clt,constraints,ty,Ast.ID,pure)) )
-# 33972 "parser_cocci_menhir.ml"
+# 34088 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -33987,18 +34103,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 138 "parser_cocci_menhir.mly"
+# 164 "parser_cocci_menhir.mly"
        (Parse_aux.typed_expinfo)
-# 33993 "parser_cocci_menhir.ml"
+# 34109 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_nest_expressions_ = 
-# 1719 "parser_cocci_menhir.mly"
+# 1756 "parser_cocci_menhir.mly"
      ( let (nm,constraints,pure,ty,clt) = _1 in
      Ast0.wrap
        (Ast0.MetaExpr(P.clt2mcode nm clt,constraints,ty,Ast.LocalID,pure)) )
-# 34002 "parser_cocci_menhir.ml"
+# 34118 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -34027,23 +34143,23 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _3 : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
-# 34033 "parser_cocci_menhir.ml"
+# 34149 "parser_cocci_menhir.ml"
         ) = Obj.magic _3 in
         let _2 : 'tv_eexpr = Obj.magic _2 in
         let _1 : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
-# 34039 "parser_cocci_menhir.ml"
+# 34155 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_primary_expr_eexpr_nest_expressions_ = 
-# 1723 "parser_cocci_menhir.mly"
+# 1760 "parser_cocci_menhir.mly"
      ( Ast0.wrap(Ast0.Paren(P.clt2mcode "(" _1,_2,
                            P.clt2mcode ")" _3)) )
-# 34047 "parser_cocci_menhir.ml"
+# 34163 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -34072,25 +34188,25 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _3 : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
-# 34078 "parser_cocci_menhir.ml"
+# 34194 "parser_cocci_menhir.ml"
         ) = Obj.magic _3 in
         let _2 : 'tv_midzero_list_eexpr_eexpr_ = Obj.magic _2 in
         let _1 : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
-# 34084 "parser_cocci_menhir.ml"
+# 34200 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_primary_expr_eexpr_nest_expressions_ = 
-# 1726 "parser_cocci_menhir.mly"
+# 1763 "parser_cocci_menhir.mly"
      ( let (mids,code) = _2 in
        Ast0.wrap(Ast0.DisjExpr(P.clt2mcode "(" _1,
                               code, mids,
                               P.clt2mcode ")" _3)) )
-# 34094 "parser_cocci_menhir.ml"
+# 34210 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -34112,9 +34228,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_eexpr_nest_expressions_ = 
-# 1730 "parser_cocci_menhir.mly"
+# 1767 "parser_cocci_menhir.mly"
                  ( _1 )
-# 34118 "parser_cocci_menhir.ml"
+# 34234 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -34136,9 +34252,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_expr_invalid_ = 
-# 1687 "parser_cocci_menhir.mly"
+# 1724 "parser_cocci_menhir.mly"
                 ( Ast0.wrap(Ast0.Ident(_1)) )
-# 34142 "parser_cocci_menhir.ml"
+# 34258 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -34163,17 +34279,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _2 : 'tv_ident = Obj.magic _2 in
         let _1 : (
-# 162 "parser_cocci_menhir.mly"
+# 188 "parser_cocci_menhir.mly"
        (Data.clt)
-# 34169 "parser_cocci_menhir.ml"
+# 34285 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_primary_expr_expr_invalid_ = 
-# 1689 "parser_cocci_menhir.mly"
+# 1726 "parser_cocci_menhir.mly"
      ( let op = P.clt2mcode Ast.GetRefLabel _1 in
      Ast0.wrap(Ast0.Unary(Ast0.wrap(Ast0.Ident(_2)), op)) )
-# 34177 "parser_cocci_menhir.ml"
+# 34293 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -34192,17 +34308,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 159 "parser_cocci_menhir.mly"
+# 185 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 34198 "parser_cocci_menhir.ml"
+# 34314 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_expr_invalid_ = 
-# 1692 "parser_cocci_menhir.mly"
+# 1729 "parser_cocci_menhir.mly"
      ( let (x,clt) = _1 in
      Ast0.wrap(Ast0.Constant (P.clt2mcode (Ast.Int x) clt)) )
-# 34206 "parser_cocci_menhir.ml"
+# 34322 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -34221,17 +34337,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 159 "parser_cocci_menhir.mly"
+# 185 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 34227 "parser_cocci_menhir.ml"
+# 34343 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_expr_invalid_ = 
-# 1695 "parser_cocci_menhir.mly"
+# 1732 "parser_cocci_menhir.mly"
      ( let (x,clt) = _1 in
      Ast0.wrap(Ast0.Constant (P.clt2mcode (Ast.Float x) clt)) )
-# 34235 "parser_cocci_menhir.ml"
+# 34351 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -34250,17 +34366,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 159 "parser_cocci_menhir.mly"
+# 185 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 34256 "parser_cocci_menhir.ml"
+# 34372 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_expr_invalid_ = 
-# 1698 "parser_cocci_menhir.mly"
+# 1735 "parser_cocci_menhir.mly"
      ( let (x,clt) = _1 in
      Ast0.wrap(Ast0.Constant (P.clt2mcode (Ast.String x) clt)) )
-# 34264 "parser_cocci_menhir.ml"
+# 34380 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -34279,17 +34395,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 159 "parser_cocci_menhir.mly"
+# 185 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 34285 "parser_cocci_menhir.ml"
+# 34401 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_expr_invalid_ = 
-# 1701 "parser_cocci_menhir.mly"
+# 1738 "parser_cocci_menhir.mly"
      ( let (x,clt) = _1 in
      Ast0.wrap(Ast0.Constant (P.clt2mcode (Ast.Char x) clt)) )
-# 34293 "parser_cocci_menhir.ml"
+# 34409 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -34308,18 +34424,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 138 "parser_cocci_menhir.mly"
+# 164 "parser_cocci_menhir.mly"
        (Parse_aux.typed_expinfo)
-# 34314 "parser_cocci_menhir.ml"
+# 34430 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_expr_invalid_ = 
-# 1704 "parser_cocci_menhir.mly"
+# 1741 "parser_cocci_menhir.mly"
      ( let (nm,constraints,pure,ty,clt) = _1 in
      Ast0.wrap
        (Ast0.MetaExpr(P.clt2mcode nm clt,constraints,ty,Ast.CONST,pure)) )
-# 34323 "parser_cocci_menhir.ml"
+# 34439 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -34338,17 +34454,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 133 "parser_cocci_menhir.mly"
+# 159 "parser_cocci_menhir.mly"
        (Parse_aux.expinfo)
-# 34344 "parser_cocci_menhir.ml"
+# 34460 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_expr_invalid_ = 
-# 1708 "parser_cocci_menhir.mly"
+# 1745 "parser_cocci_menhir.mly"
      ( let (nm,constraints,pure,clt) = _1 in
      Ast0.wrap(Ast0.MetaErr(P.clt2mcode nm clt,constraints,pure)) )
-# 34352 "parser_cocci_menhir.ml"
+# 34468 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -34367,18 +34483,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 138 "parser_cocci_menhir.mly"
+# 164 "parser_cocci_menhir.mly"
        (Parse_aux.typed_expinfo)
-# 34373 "parser_cocci_menhir.ml"
+# 34489 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_expr_invalid_ = 
-# 1711 "parser_cocci_menhir.mly"
+# 1748 "parser_cocci_menhir.mly"
      ( let (nm,constraints,pure,ty,clt) = _1 in
      Ast0.wrap
        (Ast0.MetaExpr(P.clt2mcode nm clt,constraints,ty,Ast.ANY,pure)) )
-# 34382 "parser_cocci_menhir.ml"
+# 34498 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -34397,18 +34513,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 138 "parser_cocci_menhir.mly"
+# 164 "parser_cocci_menhir.mly"
        (Parse_aux.typed_expinfo)
-# 34403 "parser_cocci_menhir.ml"
+# 34519 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_expr_invalid_ = 
-# 1715 "parser_cocci_menhir.mly"
+# 1752 "parser_cocci_menhir.mly"
      ( let (nm,constraints,pure,ty,clt) = _1 in
      Ast0.wrap
        (Ast0.MetaExpr(P.clt2mcode nm clt,constraints,ty,Ast.ID,pure)) )
-# 34412 "parser_cocci_menhir.ml"
+# 34528 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -34427,18 +34543,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 138 "parser_cocci_menhir.mly"
+# 164 "parser_cocci_menhir.mly"
        (Parse_aux.typed_expinfo)
-# 34433 "parser_cocci_menhir.ml"
+# 34549 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_expr_invalid_ = 
-# 1719 "parser_cocci_menhir.mly"
+# 1756 "parser_cocci_menhir.mly"
      ( let (nm,constraints,pure,ty,clt) = _1 in
      Ast0.wrap
        (Ast0.MetaExpr(P.clt2mcode nm clt,constraints,ty,Ast.LocalID,pure)) )
-# 34442 "parser_cocci_menhir.ml"
+# 34558 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -34467,23 +34583,23 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _3 : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
-# 34473 "parser_cocci_menhir.ml"
+# 34589 "parser_cocci_menhir.ml"
         ) = Obj.magic _3 in
         let _2 : 'tv_eexpr = Obj.magic _2 in
         let _1 : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
-# 34479 "parser_cocci_menhir.ml"
+# 34595 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_primary_expr_expr_invalid_ = 
-# 1723 "parser_cocci_menhir.mly"
+# 1760 "parser_cocci_menhir.mly"
      ( Ast0.wrap(Ast0.Paren(P.clt2mcode "(" _1,_2,
                            P.clt2mcode ")" _3)) )
-# 34487 "parser_cocci_menhir.ml"
+# 34603 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -34512,25 +34628,25 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _3 : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
-# 34518 "parser_cocci_menhir.ml"
+# 34634 "parser_cocci_menhir.ml"
         ) = Obj.magic _3 in
         let _2 : 'tv_midzero_list_expr_eexpr_ = Obj.magic _2 in
         let _1 : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
-# 34524 "parser_cocci_menhir.ml"
+# 34640 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_primary_expr_expr_invalid_ = 
-# 1726 "parser_cocci_menhir.mly"
+# 1763 "parser_cocci_menhir.mly"
      ( let (mids,code) = _2 in
        Ast0.wrap(Ast0.DisjExpr(P.clt2mcode "(" _1,
                               code, mids,
                               P.clt2mcode ")" _3)) )
-# 34534 "parser_cocci_menhir.ml"
+# 34650 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -34552,9 +34668,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_primary_expr_expr_invalid_ = 
-# 1730 "parser_cocci_menhir.mly"
+# 1767 "parser_cocci_menhir.mly"
                  ( _1 )
-# 34558 "parser_cocci_menhir.ml"
+# 34674 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -34574,9 +34690,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_pure = 
-# 264 "parser_cocci_menhir.mly"
+# 290 "parser_cocci_menhir.mly"
                  ( Ast0.Pure )
-# 34580 "parser_cocci_menhir.ml"
+# 34696 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -34596,9 +34712,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_pure = 
-# 265 "parser_cocci_menhir.mly"
+# 291 "parser_cocci_menhir.mly"
                  ( Ast0.Context )
-# 34602 "parser_cocci_menhir.ml"
+# 34718 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -34622,9 +34738,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_pure = 
-# 266 "parser_cocci_menhir.mly"
+# 292 "parser_cocci_menhir.mly"
                  ( Ast0.PureContext )
-# 34628 "parser_cocci_menhir.ml"
+# 34744 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -34648,9 +34764,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_pure = 
-# 267 "parser_cocci_menhir.mly"
+# 293 "parser_cocci_menhir.mly"
                  ( Ast0.PureContext )
-# 34654 "parser_cocci_menhir.ml"
+# 34770 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -34665,9 +34781,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in
         let _endpos = _startpos in
         let _v : 'tv_pure = 
-# 268 "parser_cocci_menhir.mly"
+# 294 "parser_cocci_menhir.mly"
                  ( Ast0.Impure )
-# 34671 "parser_cocci_menhir.ml"
+# 34787 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -34686,16 +34802,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 127 "parser_cocci_menhir.mly"
+# 153 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 34692 "parser_cocci_menhir.ml"
+# 34808 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_pure_ident = 
-# 1744 "parser_cocci_menhir.mly"
+# 1781 "parser_cocci_menhir.mly"
             ( _1 )
-# 34699 "parser_cocci_menhir.ml"
+# 34815 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -34715,9 +34831,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_pure_ident_kwd = 
-# 1751 "parser_cocci_menhir.mly"
+# 1788 "parser_cocci_menhir.mly"
                  ( "identifier" )
-# 34721 "parser_cocci_menhir.ml"
+# 34837 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -34737,9 +34853,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_pure_ident_kwd = 
-# 1752 "parser_cocci_menhir.mly"
+# 1789 "parser_cocci_menhir.mly"
                  ( "expression" )
-# 34743 "parser_cocci_menhir.ml"
+# 34859 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -34759,9 +34875,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_pure_ident_kwd = 
-# 1753 "parser_cocci_menhir.mly"
+# 1790 "parser_cocci_menhir.mly"
                 ( "statement" )
-# 34765 "parser_cocci_menhir.ml"
+# 34881 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -34781,9 +34897,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_pure_ident_kwd = 
-# 1754 "parser_cocci_menhir.mly"
+# 1791 "parser_cocci_menhir.mly"
                ( "function" )
-# 34787 "parser_cocci_menhir.ml"
+# 34903 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -34803,9 +34919,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_pure_ident_kwd = 
-# 1755 "parser_cocci_menhir.mly"
+# 1792 "parser_cocci_menhir.mly"
             ( "local" )
-# 34809 "parser_cocci_menhir.ml"
+# 34925 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -34825,9 +34941,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_pure_ident_kwd = 
-# 1756 "parser_cocci_menhir.mly"
+# 1793 "parser_cocci_menhir.mly"
            ( "type" )
-# 34831 "parser_cocci_menhir.ml"
+# 34947 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -34847,9 +34963,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_pure_ident_kwd = 
-# 1757 "parser_cocci_menhir.mly"
+# 1794 "parser_cocci_menhir.mly"
                 ( "parameter" )
-# 34853 "parser_cocci_menhir.ml"
+# 34969 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -34869,9 +34985,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_pure_ident_kwd = 
-# 1758 "parser_cocci_menhir.mly"
+# 1795 "parser_cocci_menhir.mly"
                    ( "idexpression" )
-# 34875 "parser_cocci_menhir.ml"
+# 34991 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -34891,9 +35007,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_pure_ident_kwd = 
-# 1759 "parser_cocci_menhir.mly"
+# 1796 "parser_cocci_menhir.mly"
                   ( "initialiser" )
-# 34897 "parser_cocci_menhir.ml"
+# 35013 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -34913,9 +35029,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_pure_ident_kwd = 
-# 1760 "parser_cocci_menhir.mly"
+# 1797 "parser_cocci_menhir.mly"
            ( "list" )
-# 34919 "parser_cocci_menhir.ml"
+# 35035 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -34935,9 +35051,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_pure_ident_kwd = 
-# 1761 "parser_cocci_menhir.mly"
+# 1798 "parser_cocci_menhir.mly"
             ( "fresh" )
-# 34941 "parser_cocci_menhir.ml"
+# 35057 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -34957,9 +35073,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_pure_ident_kwd = 
-# 1762 "parser_cocci_menhir.mly"
+# 1799 "parser_cocci_menhir.mly"
                ( "constant" )
-# 34963 "parser_cocci_menhir.ml"
+# 35079 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -34979,9 +35095,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_pure_ident_kwd = 
-# 1763 "parser_cocci_menhir.mly"
+# 1800 "parser_cocci_menhir.mly"
             ( "error" )
-# 34985 "parser_cocci_menhir.ml"
+# 35101 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -35001,9 +35117,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_pure_ident_kwd = 
-# 1764 "parser_cocci_menhir.mly"
+# 1801 "parser_cocci_menhir.mly"
             ( "words" )
-# 35007 "parser_cocci_menhir.ml"
+# 35123 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -35023,9 +35139,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_pure_ident_kwd = 
-# 1765 "parser_cocci_menhir.mly"
+# 1802 "parser_cocci_menhir.mly"
            ( "pure" )
-# 35029 "parser_cocci_menhir.ml"
+# 35145 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -35045,9 +35161,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_pure_ident_kwd = 
-# 1766 "parser_cocci_menhir.mly"
+# 1803 "parser_cocci_menhir.mly"
               ( "context" )
-# 35051 "parser_cocci_menhir.ml"
+# 35167 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -35067,9 +35183,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_pure_ident_kwd = 
-# 1767 "parser_cocci_menhir.mly"
+# 1804 "parser_cocci_menhir.mly"
                 ( "generated" )
-# 35073 "parser_cocci_menhir.ml"
+# 35189 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -35089,9 +35205,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_pure_ident_kwd = 
-# 1768 "parser_cocci_menhir.mly"
+# 1805 "parser_cocci_menhir.mly"
               ( "typedef" )
-# 35095 "parser_cocci_menhir.ml"
+# 35211 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -35111,9 +35227,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_pure_ident_kwd = 
-# 1769 "parser_cocci_menhir.mly"
+# 1806 "parser_cocci_menhir.mly"
                ( "declarer" )
-# 35117 "parser_cocci_menhir.ml"
+# 35233 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -35133,9 +35249,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_pure_ident_kwd = 
-# 1770 "parser_cocci_menhir.mly"
+# 1807 "parser_cocci_menhir.mly"
                ( "iterator" )
-# 35139 "parser_cocci_menhir.ml"
+# 35255 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -35155,9 +35271,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_pure_ident_kwd = 
-# 1771 "parser_cocci_menhir.mly"
+# 1808 "parser_cocci_menhir.mly"
            ( "name" )
-# 35161 "parser_cocci_menhir.ml"
+# 35277 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -35177,9 +35293,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_pure_ident_kwd = 
-# 1772 "parser_cocci_menhir.mly"
+# 1809 "parser_cocci_menhir.mly"
                ( "position" )
-# 35183 "parser_cocci_menhir.ml"
+# 35299 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -35199,9 +35315,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_pure_ident_kwd = 
-# 1773 "parser_cocci_menhir.mly"
+# 1810 "parser_cocci_menhir.mly"
              ( "symbol" )
-# 35205 "parser_cocci_menhir.ml"
+# 35321 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -35223,9 +35339,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_pure_ident_or_meta_ident = 
-# 1780 "parser_cocci_menhir.mly"
+# 1817 "parser_cocci_menhir.mly"
                                  ( (None,P.id2name _1) )
-# 35229 "parser_cocci_menhir.ml"
+# 35345 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -35247,9 +35363,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_pure_ident_or_meta_ident = 
-# 1781 "parser_cocci_menhir.mly"
+# 1818 "parser_cocci_menhir.mly"
                                  ( (None,_1) )
-# 35253 "parser_cocci_menhir.ml"
+# 35369 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -35271,9 +35387,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_pure_ident_or_meta_ident = 
-# 1782 "parser_cocci_menhir.mly"
+# 1819 "parser_cocci_menhir.mly"
                                  ( _1 )
-# 35277 "parser_cocci_menhir.ml"
+# 35393 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -35301,13 +35417,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_i_ in
         let _endpos = _endpos_optc_ in
         let _v : 'tv_pure_ident_or_meta_ident_with_econstraint_not_ceq_or_sub_ = 
-# 1819 "parser_cocci_menhir.mly"
+# 1856 "parser_cocci_menhir.mly"
     (
       match optc with
          None   -> (i, Ast0.NoConstraint)
        | Some c -> (i, c)
     )
-# 35311 "parser_cocci_menhir.ml"
+# 35427 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -35335,13 +35451,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_i_ in
         let _endpos = _endpos_optc_ in
         let _v : 'tv_pure_ident_or_meta_ident_with_econstraint_re_or_not_eqe_or_sub_ = 
-# 1819 "parser_cocci_menhir.mly"
+# 1856 "parser_cocci_menhir.mly"
     (
       match optc with
          None   -> (i, Ast0.NoConstraint)
        | Some c -> (i, c)
     )
-# 35345 "parser_cocci_menhir.ml"
+# 35461 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -35369,13 +35485,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_i_ in
         let _endpos = _endpos_c_ in
         let _v : 'tv_pure_ident_or_meta_ident_with_idconstraint_re_or_not_eqid_ = 
-# 1844 "parser_cocci_menhir.mly"
+# 1881 "parser_cocci_menhir.mly"
     (
       match c with
          None -> (i, Ast.IdNoConstraint)
        | Some constraint_ -> (i,constraint_)
     )
-# 35379 "parser_cocci_menhir.ml"
+# 35495 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -35403,14 +35519,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_i_ in
         let _endpos = _endpos_c_ in
         let _v : 'tv_pure_ident_or_meta_ident_with_idconstraint_virt_re_or_not_eqid_ = 
-# 1827 "parser_cocci_menhir.mly"
+# 1864 "parser_cocci_menhir.mly"
     (
       Common.Left
         (match c with
          None -> (i, Ast.IdNoConstraint)
        | Some constraint_ -> (i,constraint_))
     )
-# 35414 "parser_cocci_menhir.ml"
+# 35530 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -35440,7 +35556,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_pure_ident_or_meta_ident_with_idconstraint_virt_re_or_not_eqid_ = 
-# 1834 "parser_cocci_menhir.mly"
+# 1871 "parser_cocci_menhir.mly"
     (
      let nm = P.id2name _3 in
      Iteration.parsed_virtual_identifiers :=
@@ -35448,7 +35564,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         !Iteration.parsed_virtual_identifiers;
      Common.Right nm
     )
-# 35452 "parser_cocci_menhir.ml"
+# 35568 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -35470,9 +35586,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_pure_ident_or_meta_ident_with_seed = 
-# 1788 "parser_cocci_menhir.mly"
+# 1825 "parser_cocci_menhir.mly"
                                 ( (_1,Ast.NoVal) )
-# 35476 "parser_cocci_menhir.ml"
+# 35592 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -35504,11 +35620,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_pure_ident_or_meta_ident_with_seed = 
-# 1791 "parser_cocci_menhir.mly"
+# 1828 "parser_cocci_menhir.mly"
   ( match _3 with
           [Ast.SeedString s] -> (_1,Ast.StringSeed s)
         | _ -> (_1,Ast.ListSeed _3) )
-# 35512 "parser_cocci_menhir.ml"
+# 35628 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -35536,11 +35652,11 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_i_ in
         let _endpos = _endpos_l_ in
         let _v : 'tv_pure_ident_or_meta_ident_with_x_eq_not_pos_ = 
-# 1813 "parser_cocci_menhir.mly"
+# 1850 "parser_cocci_menhir.mly"
     (
       (i, l)
     )
-# 35544 "parser_cocci_menhir.ml"
+# 35660 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -35562,9 +35678,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_pure_ident_or_symbol = 
-# 1747 "parser_cocci_menhir.mly"
+# 1784 "parser_cocci_menhir.mly"
                ( _1 )
-# 35568 "parser_cocci_menhir.ml"
+# 35684 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -35583,16 +35699,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 127 "parser_cocci_menhir.mly"
+# 153 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 35589 "parser_cocci_menhir.ml"
+# 35705 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_pure_ident_or_symbol = 
-# 1748 "parser_cocci_menhir.mly"
+# 1785 "parser_cocci_menhir.mly"
            ( _1 )
-# 35596 "parser_cocci_menhir.ml"
+# 35712 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -35614,9 +35730,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_re_ in
         let _endpos = _endpos_re_ in
         let _v : 'tv_re_or_not_eqe_or_sub = 
-# 1905 "parser_cocci_menhir.mly"
+# 1942 "parser_cocci_menhir.mly"
                   (Ast0.NotIdCstrt  re)
-# 35620 "parser_cocci_menhir.ml"
+# 35736 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -35638,9 +35754,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_ne_ in
         let _endpos = _endpos_ne_ in
         let _v : 'tv_re_or_not_eqe_or_sub = 
-# 1906 "parser_cocci_menhir.mly"
+# 1943 "parser_cocci_menhir.mly"
                   (Ast0.NotExpCstrt ne)
-# 35644 "parser_cocci_menhir.ml"
+# 35760 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -35662,9 +35778,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_s_ in
         let _endpos = _endpos_s_ in
         let _v : 'tv_re_or_not_eqe_or_sub = 
-# 1907 "parser_cocci_menhir.mly"
+# 1944 "parser_cocci_menhir.mly"
                   (Ast0.SubExpCstrt s)
-# 35668 "parser_cocci_menhir.ml"
+# 35784 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -35686,9 +35802,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_re_ in
         let _endpos = _endpos_re_ in
         let _v : 'tv_re_or_not_eqid = 
-# 1851 "parser_cocci_menhir.mly"
+# 1888 "parser_cocci_menhir.mly"
                   (Ast.IdRegExpConstraint re)
-# 35692 "parser_cocci_menhir.ml"
+# 35808 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -35710,9 +35826,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_ne_ in
         let _endpos = _endpos_ne_ in
         let _v : 'tv_re_or_not_eqid = 
-# 1852 "parser_cocci_menhir.mly"
+# 1889 "parser_cocci_menhir.mly"
                   (ne)
-# 35716 "parser_cocci_menhir.ml"
+# 35832 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -35735,21 +35851,21 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let re : (
-# 159 "parser_cocci_menhir.mly"
+# 185 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 35741 "parser_cocci_menhir.ml"
+# 35857 "parser_cocci_menhir.ml"
         ) = Obj.magic re in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos_re_ in
         let _v : 'tv_regexp_eqid = 
-# 1856 "parser_cocci_menhir.mly"
+# 1893 "parser_cocci_menhir.mly"
          ( (if !Data.in_iso
            then failwith "constraints not allowed in iso file");
           (if !Data.in_generating
            then failwith "constraints not allowed in a generated rule file");
           let (s,_) = re in Ast.IdRegExp (s,Regexp.regexp s)
         )
-# 35753 "parser_cocci_menhir.ml"
+# 35869 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -35772,21 +35888,21 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let re : (
-# 159 "parser_cocci_menhir.mly"
+# 185 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 35778 "parser_cocci_menhir.ml"
+# 35894 "parser_cocci_menhir.ml"
         ) = Obj.magic re in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos_re_ in
         let _v : 'tv_regexp_eqid = 
-# 1863 "parser_cocci_menhir.mly"
+# 1900 "parser_cocci_menhir.mly"
          ( (if !Data.in_iso
            then failwith "constraints not allowed in iso file");
           (if !Data.in_generating
            then failwith "constraints not allowed in a generated rule file");
           let (s,_) = re in Ast.IdNotRegExp (s,Regexp.regexp s)
         )
-# 35790 "parser_cocci_menhir.ml"
+# 35906 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -35801,13 +35917,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in
         let _endpos = _startpos in
         let _v : (
-# 205 "parser_cocci_menhir.mly"
+# 231 "parser_cocci_menhir.mly"
       (unit)
-# 35807 "parser_cocci_menhir.ml"
+# 35923 "parser_cocci_menhir.ml"
         ) = 
-# 246 "parser_cocci_menhir.mly"
+# 272 "parser_cocci_menhir.mly"
         ( )
-# 35811 "parser_cocci_menhir.ml"
+# 35927 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -35829,9 +35945,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_rule_elem_statement = 
-# 1162 "parser_cocci_menhir.mly"
+# 1188 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Decl((Ast0.default_info(),Ast0.context_befaft()),_1)) )
-# 35835 "parser_cocci_menhir.ml"
+# 35951 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -35855,17 +35971,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _2 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 35861 "parser_cocci_menhir.ml"
+# 35977 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_option_expr_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_rule_elem_statement = 
-# 1163 "parser_cocci_menhir.mly"
+# 1189 "parser_cocci_menhir.mly"
                        ( P.exp_stm _1 _2 )
-# 35869 "parser_cocci_menhir.ml"
+# 35985 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -35894,22 +36010,22 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _3 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 35900 "parser_cocci_menhir.ml"
+# 36016 "parser_cocci_menhir.ml"
         ) = Obj.magic _3 in
         let _2 : 'tv_eexpr = Obj.magic _2 in
         let _1 : (
-# 125 "parser_cocci_menhir.mly"
+# 151 "parser_cocci_menhir.mly"
        (Data.clt)
-# 35906 "parser_cocci_menhir.ml"
+# 36022 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_rule_elem_statement = 
-# 1164 "parser_cocci_menhir.mly"
+# 1190 "parser_cocci_menhir.mly"
                         ( P.ret_exp _1 _2 _3 )
-# 35913 "parser_cocci_menhir.ml"
+# 36029 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -35933,21 +36049,21 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _2 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 35939 "parser_cocci_menhir.ml"
+# 36055 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : (
-# 125 "parser_cocci_menhir.mly"
+# 151 "parser_cocci_menhir.mly"
        (Data.clt)
-# 35944 "parser_cocci_menhir.ml"
+# 36060 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_rule_elem_statement = 
-# 1165 "parser_cocci_menhir.mly"
+# 1191 "parser_cocci_menhir.mly"
                   ( P.ret _1 _2 )
-# 35951 "parser_cocci_menhir.ml"
+# 36067 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -35971,21 +36087,21 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _2 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 35977 "parser_cocci_menhir.ml"
+# 36093 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : (
-# 126 "parser_cocci_menhir.mly"
+# 152 "parser_cocci_menhir.mly"
        (Data.clt)
-# 35982 "parser_cocci_menhir.ml"
+# 36098 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_rule_elem_statement = 
-# 1166 "parser_cocci_menhir.mly"
+# 1192 "parser_cocci_menhir.mly"
                  ( P.break _1 _2 )
-# 35989 "parser_cocci_menhir.ml"
+# 36105 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -36009,21 +36125,21 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _2 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 36015 "parser_cocci_menhir.ml"
+# 36131 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : (
-# 126 "parser_cocci_menhir.mly"
+# 152 "parser_cocci_menhir.mly"
        (Data.clt)
-# 36020 "parser_cocci_menhir.ml"
+# 36136 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_rule_elem_statement = 
-# 1167 "parser_cocci_menhir.mly"
+# 1193 "parser_cocci_menhir.mly"
                     ( P.cont _1 _2 )
-# 36027 "parser_cocci_menhir.ml"
+# 36143 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -36052,26 +36168,26 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _3 : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
-# 36058 "parser_cocci_menhir.ml"
+# 36174 "parser_cocci_menhir.ml"
         ) = Obj.magic _3 in
         let _2 : 'tv_midzero_list_rule_elem_statement_rule_elem_statement_ = Obj.magic _2 in
         let _1 : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
-# 36064 "parser_cocci_menhir.ml"
+# 36180 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_rule_elem_statement = 
-# 1169 "parser_cocci_menhir.mly"
+# 1195 "parser_cocci_menhir.mly"
     ( let (mids,code) = _2 in
     Ast0.wrap
       (Ast0.Disj(P.clt2mcode "(" _1,
                 List.map (function x -> Ast0.wrap(Ast0.DOTS([x]))) code,
                 mids, P.clt2mcode ")" _3)) )
-# 36075 "parser_cocci_menhir.ml"
+# 36191 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -36125,20 +36241,20 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__7_ in
         let _v : (
-# 227 "parser_cocci_menhir.mly"
+# 253 "parser_cocci_menhir.mly"
       (Ast_cocci.rulename)
-# 36131 "parser_cocci_menhir.ml"
+# 36247 "parser_cocci_menhir.ml"
         ) = let nm =
           
 # 39 "standard.mly"
     ( None )
-# 36136 "parser_cocci_menhir.ml"
+# 36252 "parser_cocci_menhir.ml"
           
         in
         
-# 276 "parser_cocci_menhir.mly"
+# 302 "parser_cocci_menhir.mly"
       ( P.make_cocci_rule_name_result nm d i a e ee )
-# 36142 "parser_cocci_menhir.ml"
+# 36258 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -36198,21 +36314,21 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_x0_ in
         let _endpos = _endpos__8_ in
         let _v : (
-# 227 "parser_cocci_menhir.mly"
+# 253 "parser_cocci_menhir.mly"
       (Ast_cocci.rulename)
-# 36204 "parser_cocci_menhir.ml"
+# 36320 "parser_cocci_menhir.ml"
         ) = let nm =
           let x = x0 in
           
 # 41 "standard.mly"
     ( Some x )
-# 36210 "parser_cocci_menhir.ml"
+# 36326 "parser_cocci_menhir.ml"
           
         in
         
-# 276 "parser_cocci_menhir.mly"
+# 302 "parser_cocci_menhir.mly"
       ( P.make_cocci_rule_name_result nm d i a e ee )
-# 36216 "parser_cocci_menhir.ml"
+# 36332 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -36270,13 +36386,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__8_ in
         let _v : (
-# 227 "parser_cocci_menhir.mly"
+# 253 "parser_cocci_menhir.mly"
       (Ast_cocci.rulename)
-# 36276 "parser_cocci_menhir.ml"
+# 36392 "parser_cocci_menhir.ml"
         ) = 
-# 281 "parser_cocci_menhir.mly"
+# 307 "parser_cocci_menhir.mly"
       ( P.make_generated_rule_name_result None d i a e ee )
-# 36280 "parser_cocci_menhir.ml"
+# 36396 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -36316,20 +36432,20 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__5_ in
         let _v : (
-# 227 "parser_cocci_menhir.mly"
+# 253 "parser_cocci_menhir.mly"
       (Ast_cocci.rulename)
-# 36322 "parser_cocci_menhir.ml"
+# 36438 "parser_cocci_menhir.ml"
         ) = let nm =
           
 # 39 "standard.mly"
     ( None )
-# 36327 "parser_cocci_menhir.ml"
+# 36443 "parser_cocci_menhir.ml"
           
         in
         
-# 283 "parser_cocci_menhir.mly"
+# 309 "parser_cocci_menhir.mly"
       ( P.make_script_rule_name_result lang nm d )
-# 36333 "parser_cocci_menhir.ml"
+# 36449 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -36375,21 +36491,21 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__6_ in
         let _v : (
-# 227 "parser_cocci_menhir.mly"
+# 253 "parser_cocci_menhir.mly"
       (Ast_cocci.rulename)
-# 36381 "parser_cocci_menhir.ml"
+# 36497 "parser_cocci_menhir.ml"
         ) = let nm =
           let x = x0 in
           
 # 41 "standard.mly"
     ( Some x )
-# 36387 "parser_cocci_menhir.ml"
+# 36503 "parser_cocci_menhir.ml"
           
         in
         
-# 283 "parser_cocci_menhir.mly"
+# 309 "parser_cocci_menhir.mly"
       ( P.make_script_rule_name_result lang nm d )
-# 36393 "parser_cocci_menhir.ml"
+# 36509 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -36429,13 +36545,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__5_ in
         let _v : (
-# 227 "parser_cocci_menhir.mly"
+# 253 "parser_cocci_menhir.mly"
       (Ast_cocci.rulename)
-# 36435 "parser_cocci_menhir.ml"
+# 36551 "parser_cocci_menhir.ml"
         ) = 
-# 285 "parser_cocci_menhir.mly"
+# 311 "parser_cocci_menhir.mly"
       ( P.make_initial_script_rule_name_result lang d )
-# 36439 "parser_cocci_menhir.ml"
+# 36555 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -36475,13 +36591,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__5_ in
         let _v : (
-# 227 "parser_cocci_menhir.mly"
+# 253 "parser_cocci_menhir.mly"
       (Ast_cocci.rulename)
-# 36481 "parser_cocci_menhir.ml"
+# 36597 "parser_cocci_menhir.ml"
         ) = 
-# 287 "parser_cocci_menhir.mly"
+# 313 "parser_cocci_menhir.mly"
       ( P.make_final_script_rule_name_result lang d )
-# 36485 "parser_cocci_menhir.ml"
+# 36601 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -36507,13 +36623,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_py_ in
         let _endpos = _endpos__2_ in
         let _v : (
-# 233 "parser_cocci_menhir.mly"
+# 259 "parser_cocci_menhir.mly"
        ((string option (*string*) * string option (*ast*)) * (Ast_cocci.meta_name * Ast_cocci.metavar) option)
-# 36513 "parser_cocci_menhir.ml"
+# 36629 "parser_cocci_menhir.ml"
         ) = 
-# 2425 "parser_cocci_menhir.mly"
+# 2462 "parser_cocci_menhir.mly"
   ( ((Some (P.id2name py), None), None) )
-# 36517 "parser_cocci_menhir.ml"
+# 36633 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -36545,13 +36661,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_py_ in
         let _endpos = _endpos__3_ in
         let _v : (
-# 233 "parser_cocci_menhir.mly"
+# 259 "parser_cocci_menhir.mly"
        ((string option (*string*) * string option (*ast*)) * (Ast_cocci.meta_name * Ast_cocci.metavar) option)
-# 36551 "parser_cocci_menhir.ml"
+# 36667 "parser_cocci_menhir.ml"
         ) = 
-# 2427 "parser_cocci_menhir.mly"
+# 2464 "parser_cocci_menhir.mly"
   ( ((Some (P.id2name py), None), Some _2) )
-# 36555 "parser_cocci_menhir.ml"
+# 36671 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -36599,13 +36715,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__7_ in
         let _v : (
-# 233 "parser_cocci_menhir.mly"
+# 259 "parser_cocci_menhir.mly"
        ((string option (*string*) * string option (*ast*)) * (Ast_cocci.meta_name * Ast_cocci.metavar) option)
-# 36605 "parser_cocci_menhir.ml"
+# 36721 "parser_cocci_menhir.ml"
         ) = 
-# 2429 "parser_cocci_menhir.mly"
+# 2466 "parser_cocci_menhir.mly"
   ( ((None, Some (P.id2name ast)), Some _6) )
-# 36609 "parser_cocci_menhir.ml"
+# 36725 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -36653,13 +36769,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__7_ in
         let _v : (
-# 233 "parser_cocci_menhir.mly"
+# 259 "parser_cocci_menhir.mly"
        ((string option (*string*) * string option (*ast*)) * (Ast_cocci.meta_name * Ast_cocci.metavar) option)
-# 36659 "parser_cocci_menhir.ml"
+# 36775 "parser_cocci_menhir.ml"
         ) = 
-# 2431 "parser_cocci_menhir.mly"
+# 2468 "parser_cocci_menhir.mly"
   ( ((Some (P.id2name str), None), Some _6) )
-# 36663 "parser_cocci_menhir.ml"
+# 36779 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -36709,13 +36825,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__7_ in
         let _v : (
-# 233 "parser_cocci_menhir.mly"
+# 259 "parser_cocci_menhir.mly"
        ((string option (*string*) * string option (*ast*)) * (Ast_cocci.meta_name * Ast_cocci.metavar) option)
-# 36715 "parser_cocci_menhir.ml"
+# 36831 "parser_cocci_menhir.ml"
         ) = 
-# 2433 "parser_cocci_menhir.mly"
+# 2470 "parser_cocci_menhir.mly"
   ( ((Some (P.id2name str), Some (P.id2name ast)), Some _6) )
-# 36719 "parser_cocci_menhir.ml"
+# 36835 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -36748,18 +36864,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let cocci : 'tv_pure_ident = Obj.magic cocci in
         let _2 : (
-# 114 "parser_cocci_menhir.mly"
+# 140 "parser_cocci_menhir.mly"
       (string)
-# 36754 "parser_cocci_menhir.ml"
+# 36870 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos_cocci_ in
         let _v : 'tv_script_name_decl = 
-# 2437 "parser_cocci_menhir.mly"
+# 2474 "parser_cocci_menhir.mly"
       ( let nm = P.id2name cocci in
         let mv = Parse_aux.lookup _2 nm in
         ((_2, nm), mv) )
-# 36763 "parser_cocci_menhir.ml"
+# 36879 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -36793,7 +36909,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos_cocci_ in
         let _v : 'tv_script_name_decl = 
-# 2441 "parser_cocci_menhir.mly"
+# 2478 "parser_cocci_menhir.mly"
       ( let nm = P.id2name cocci in
         Iteration.parsed_virtual_identifiers :=
           Common.union_set [nm]
@@ -36801,7 +36917,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let name = ("virtual", nm) in
         let mv = Ast.MetaIdDecl(Ast.NONE,name) in
         (name,mv) )
-# 36805 "parser_cocci_menhir.ml"
+# 36921 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -36820,16 +36936,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 159 "parser_cocci_menhir.mly"
+# 185 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 36826 "parser_cocci_menhir.ml"
+# 36942 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_seed_elem = 
-# 1796 "parser_cocci_menhir.mly"
+# 1833 "parser_cocci_menhir.mly"
           ( let (x,_) = _1 in Ast.SeedString x )
-# 36833 "parser_cocci_menhir.ml"
+# 36949 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -36848,16 +36964,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 130 "parser_cocci_menhir.mly"
+# 156 "parser_cocci_menhir.mly"
        (Parse_aux.midinfo)
-# 36854 "parser_cocci_menhir.ml"
+# 36970 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_seed_elem = 
-# 1797 "parser_cocci_menhir.mly"
+# 1834 "parser_cocci_menhir.mly"
           ( let (x,_,_,_,_) = _1 in Ast.SeedId x )
-# 36861 "parser_cocci_menhir.ml"
+# 36977 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -36877,9 +36993,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_seed_elem = 
-# 1798 "parser_cocci_menhir.mly"
+# 1835 "parser_cocci_menhir.mly"
         (failwith "tmeta")
-# 36883 "parser_cocci_menhir.ml"
+# 36999 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -36909,14 +37025,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_seed_elem = 
-# 1800 "parser_cocci_menhir.mly"
+# 1837 "parser_cocci_menhir.mly"
     ( let nm = ("virtual",P.id2name _3) in
      Iteration.parsed_virtual_identifiers :=
        Common.union_set [snd nm]
         !Iteration.parsed_virtual_identifiers;
     try Ast.SeedString (List.assoc (snd nm) !Flag.defined_virtual_env)
     with Not_found -> Ast.SeedId nm )
-# 36920 "parser_cocci_menhir.ml"
+# 37036 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -36945,18 +37061,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _3 : 'tv_pure_ident = Obj.magic _3 in
         let _1 : (
-# 114 "parser_cocci_menhir.mly"
+# 140 "parser_cocci_menhir.mly"
       (string)
-# 36951 "parser_cocci_menhir.ml"
+# 37067 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_seed_elem = 
-# 1807 "parser_cocci_menhir.mly"
+# 1844 "parser_cocci_menhir.mly"
     ( let nm = (_1,P.id2name _3) in
       P.check_meta(Ast.MetaIdDecl(Ast.NONE,nm));
       Ast.SeedId nm )
-# 36960 "parser_cocci_menhir.ml"
+# 37076 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -36975,16 +37091,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let x : (
-# 159 "parser_cocci_menhir.mly"
+# 185 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 36981 "parser_cocci_menhir.ml"
+# 37097 "parser_cocci_menhir.ml"
         ) = Obj.magic x in
         let _startpos = _startpos_x_ in
         let _endpos = _endpos_x_ in
         let _v : 'tv_separated_nonempty_list_TComma_TString_ = 
 # 144 "standard.mly"
     ( [ x ] )
-# 36988 "parser_cocci_menhir.ml"
+# 37104 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -37013,16 +37129,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let xs : 'tv_separated_nonempty_list_TComma_TString_ = Obj.magic xs in
         let x : (
-# 159 "parser_cocci_menhir.mly"
+# 185 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 37019 "parser_cocci_menhir.ml"
+# 37135 "parser_cocci_menhir.ml"
         ) = Obj.magic x in
         let _startpos = _startpos_x_ in
         let _endpos = _endpos_xs_ in
         let _v : 'tv_separated_nonempty_list_TComma_TString_ = 
 # 146 "standard.mly"
     ( x :: xs )
-# 37026 "parser_cocci_menhir.ml"
+# 37142 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -37046,7 +37162,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_separated_nonempty_list_TComma_any_strict_ = 
 # 144 "standard.mly"
     ( [ x ] )
-# 37050 "parser_cocci_menhir.ml"
+# 37166 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -37080,7 +37196,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_separated_nonempty_list_TComma_any_strict_ = 
 # 146 "standard.mly"
     ( x :: xs )
-# 37084 "parser_cocci_menhir.ml"
+# 37200 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -37104,7 +37220,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_separated_nonempty_list_TComma_ctype_ = 
 # 144 "standard.mly"
     ( [ x ] )
-# 37108 "parser_cocci_menhir.ml"
+# 37224 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -37138,7 +37254,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_separated_nonempty_list_TComma_ctype_ = 
 # 146 "standard.mly"
     ( x :: xs )
-# 37142 "parser_cocci_menhir.ml"
+# 37258 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -37162,7 +37278,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_separated_nonempty_list_TComma_d_ident_ = 
 # 144 "standard.mly"
     ( [ x ] )
-# 37166 "parser_cocci_menhir.ml"
+# 37282 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -37196,7 +37312,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_separated_nonempty_list_TComma_d_ident_ = 
 # 146 "standard.mly"
     ( x :: xs )
-# 37200 "parser_cocci_menhir.ml"
+# 37316 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -37220,7 +37336,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_separated_nonempty_list_TComma_ident_or_const_ = 
 # 144 "standard.mly"
     ( [ x ] )
-# 37224 "parser_cocci_menhir.ml"
+# 37340 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -37254,7 +37370,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_separated_nonempty_list_TComma_ident_or_const_ = 
 # 146 "standard.mly"
     ( x :: xs )
-# 37258 "parser_cocci_menhir.ml"
+# 37374 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -37278,7 +37394,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_separated_nonempty_list_TComma_meta_ident_ = 
 # 144 "standard.mly"
     ( [ x ] )
-# 37282 "parser_cocci_menhir.ml"
+# 37398 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -37312,7 +37428,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_separated_nonempty_list_TComma_meta_ident_ = 
 # 146 "standard.mly"
     ( x :: xs )
-# 37316 "parser_cocci_menhir.ml"
+# 37432 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -37336,7 +37452,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_separated_nonempty_list_TComma_pure_ident_ = 
 # 144 "standard.mly"
     ( [ x ] )
-# 37340 "parser_cocci_menhir.ml"
+# 37456 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -37370,7 +37486,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_separated_nonempty_list_TComma_pure_ident_ = 
 # 146 "standard.mly"
     ( x :: xs )
-# 37374 "parser_cocci_menhir.ml"
+# 37490 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -37394,7 +37510,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_separated_nonempty_list_TComma_pure_ident_or_meta_ident_ = 
 # 144 "standard.mly"
     ( [ x ] )
-# 37398 "parser_cocci_menhir.ml"
+# 37514 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -37428,7 +37544,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_separated_nonempty_list_TComma_pure_ident_or_meta_ident_ = 
 # 146 "standard.mly"
     ( x :: xs )
-# 37432 "parser_cocci_menhir.ml"
+# 37548 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -37452,7 +37568,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_separated_nonempty_list_TComma_pure_ident_or_meta_ident_with_econstraint_not_ceq_or_sub__ = 
 # 144 "standard.mly"
     ( [ x ] )
-# 37456 "parser_cocci_menhir.ml"
+# 37572 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -37486,7 +37602,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_separated_nonempty_list_TComma_pure_ident_or_meta_ident_with_econstraint_not_ceq_or_sub__ = 
 # 146 "standard.mly"
     ( x :: xs )
-# 37490 "parser_cocci_menhir.ml"
+# 37606 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -37510,7 +37626,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_separated_nonempty_list_TComma_pure_ident_or_meta_ident_with_econstraint_re_or_not_eqe_or_sub__ = 
 # 144 "standard.mly"
     ( [ x ] )
-# 37514 "parser_cocci_menhir.ml"
+# 37630 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -37544,7 +37660,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_separated_nonempty_list_TComma_pure_ident_or_meta_ident_with_econstraint_re_or_not_eqe_or_sub__ = 
 # 146 "standard.mly"
     ( x :: xs )
-# 37548 "parser_cocci_menhir.ml"
+# 37664 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -37568,7 +37684,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_separated_nonempty_list_TComma_pure_ident_or_meta_ident_with_idconstraint_re_or_not_eqid__ = 
 # 144 "standard.mly"
     ( [ x ] )
-# 37572 "parser_cocci_menhir.ml"
+# 37688 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -37602,7 +37718,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_separated_nonempty_list_TComma_pure_ident_or_meta_ident_with_idconstraint_re_or_not_eqid__ = 
 # 146 "standard.mly"
     ( x :: xs )
-# 37606 "parser_cocci_menhir.ml"
+# 37722 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -37626,7 +37742,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_separated_nonempty_list_TComma_pure_ident_or_meta_ident_with_idconstraint_virt_re_or_not_eqid__ = 
 # 144 "standard.mly"
     ( [ x ] )
-# 37630 "parser_cocci_menhir.ml"
+# 37746 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -37660,7 +37776,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_separated_nonempty_list_TComma_pure_ident_or_meta_ident_with_idconstraint_virt_re_or_not_eqid__ = 
 # 146 "standard.mly"
     ( x :: xs )
-# 37664 "parser_cocci_menhir.ml"
+# 37780 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -37684,7 +37800,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_separated_nonempty_list_TComma_pure_ident_or_meta_ident_with_seed_ = 
 # 144 "standard.mly"
     ( [ x ] )
-# 37688 "parser_cocci_menhir.ml"
+# 37804 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -37718,7 +37834,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_separated_nonempty_list_TComma_pure_ident_or_meta_ident_with_seed_ = 
 # 146 "standard.mly"
     ( x :: xs )
-# 37722 "parser_cocci_menhir.ml"
+# 37838 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -37742,7 +37858,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_separated_nonempty_list_TComma_pure_ident_or_meta_ident_with_x_eq_not_pos__ = 
 # 144 "standard.mly"
     ( [ x ] )
-# 37746 "parser_cocci_menhir.ml"
+# 37862 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -37776,7 +37892,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_separated_nonempty_list_TComma_pure_ident_or_meta_ident_with_x_eq_not_pos__ = 
 # 146 "standard.mly"
     ( x :: xs )
-# 37780 "parser_cocci_menhir.ml"
+# 37896 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -37800,7 +37916,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_separated_nonempty_list_TComma_typedef_ident_ = 
 # 144 "standard.mly"
     ( [ x ] )
-# 37804 "parser_cocci_menhir.ml"
+# 37920 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -37834,7 +37950,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_separated_nonempty_list_TComma_typedef_ident_ = 
 # 146 "standard.mly"
     ( x :: xs )
-# 37838 "parser_cocci_menhir.ml"
+# 37954 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -37858,7 +37974,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_separated_nonempty_list_TCppConcatOp_seed_elem_ = 
 # 144 "standard.mly"
     ( [ x ] )
-# 37862 "parser_cocci_menhir.ml"
+# 37978 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -37892,7 +38008,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _v : 'tv_separated_nonempty_list_TCppConcatOp_seed_elem_ = 
 # 146 "standard.mly"
     ( x :: xs )
-# 37896 "parser_cocci_menhir.ml"
+# 38012 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -37914,9 +38030,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_single_statement = 
-# 1177 "parser_cocci_menhir.mly"
+# 1203 "parser_cocci_menhir.mly"
                                       ( _1 )
-# 37920 "parser_cocci_menhir.ml"
+# 38036 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -37945,26 +38061,26 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _3 : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
-# 37951 "parser_cocci_menhir.ml"
+# 38067 "parser_cocci_menhir.ml"
         ) = Obj.magic _3 in
         let _2 : 'tv_midzero_list_statement_statement_ = Obj.magic _2 in
         let _1 : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
-# 37957 "parser_cocci_menhir.ml"
+# 38073 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_single_statement = 
-# 1181 "parser_cocci_menhir.mly"
+# 1207 "parser_cocci_menhir.mly"
       ( let (mids,code) = _2 in
         Ast0.wrap
          (Ast0.Disj(P.clt2mcode "(" _1,
                     List.map (function x -> Ast0.wrap(Ast0.DOTS([x]))) code,
                     mids, P.clt2mcode ")" _3)) )
-# 37968 "parser_cocci_menhir.ml"
+# 38084 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -37986,9 +38102,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_statement = 
-# 1103 "parser_cocci_menhir.mly"
+# 1129 "parser_cocci_menhir.mly"
            ( _1 )
-# 37992 "parser_cocci_menhir.ml"
+# 38108 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -38007,16 +38123,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 135 "parser_cocci_menhir.mly"
+# 161 "parser_cocci_menhir.mly"
        (Parse_aux.info)
-# 38013 "parser_cocci_menhir.ml"
+# 38129 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_statement = 
-# 1104 "parser_cocci_menhir.mly"
+# 1130 "parser_cocci_menhir.mly"
         ( tmeta_to_statement _1)
-# 38020 "parser_cocci_menhir.ml"
+# 38136 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -38035,16 +38151,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 134 "parser_cocci_menhir.mly"
+# 160 "parser_cocci_menhir.mly"
        (Parse_aux.info)
-# 38041 "parser_cocci_menhir.ml"
+# 38157 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_statement = 
-# 1106 "parser_cocci_menhir.mly"
+# 1132 "parser_cocci_menhir.mly"
     ( P.meta_stm _1 )
-# 38048 "parser_cocci_menhir.ml"
+# 38164 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -38068,17 +38184,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _2 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 38074 "parser_cocci_menhir.ml"
+# 38190 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_option_expr_ = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_statement = 
-# 1108 "parser_cocci_menhir.mly"
+# 1134 "parser_cocci_menhir.mly"
     ( P.exp_stm _1 _2 )
-# 38082 "parser_cocci_menhir.ml"
+# 38198 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -38118,27 +38234,27 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _5 : 'tv_single_statement = Obj.magic _5 in
         let _4 : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
-# 38124 "parser_cocci_menhir.ml"
+# 38240 "parser_cocci_menhir.ml"
         ) = Obj.magic _4 in
         let _3 : 'tv_eexpr = Obj.magic _3 in
         let _2 : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
-# 38130 "parser_cocci_menhir.ml"
+# 38246 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : (
-# 125 "parser_cocci_menhir.mly"
+# 151 "parser_cocci_menhir.mly"
        (Data.clt)
-# 38135 "parser_cocci_menhir.ml"
+# 38251 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__5_ in
         let _v : 'tv_statement = 
-# 1110 "parser_cocci_menhir.mly"
+# 1136 "parser_cocci_menhir.mly"
     ( P.ifthen _1 _2 _3 _4 _5 )
-# 38142 "parser_cocci_menhir.ml"
+# 38258 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -38188,33 +38304,33 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _7 : 'tv_single_statement = Obj.magic _7 in
         let _6 : (
-# 125 "parser_cocci_menhir.mly"
+# 151 "parser_cocci_menhir.mly"
        (Data.clt)
-# 38194 "parser_cocci_menhir.ml"
+# 38310 "parser_cocci_menhir.ml"
         ) = Obj.magic _6 in
         let _5 : 'tv_single_statement = Obj.magic _5 in
         let _4 : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
-# 38200 "parser_cocci_menhir.ml"
+# 38316 "parser_cocci_menhir.ml"
         ) = Obj.magic _4 in
         let _3 : 'tv_eexpr = Obj.magic _3 in
         let _2 : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
-# 38206 "parser_cocci_menhir.ml"
+# 38322 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : (
-# 125 "parser_cocci_menhir.mly"
+# 151 "parser_cocci_menhir.mly"
        (Data.clt)
-# 38211 "parser_cocci_menhir.ml"
+# 38327 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__7_ in
         let _v : 'tv_statement = 
-# 1112 "parser_cocci_menhir.mly"
+# 1138 "parser_cocci_menhir.mly"
     ( P.ifthenelse _1 _2 _3 _4 _5 _6 _7 )
-# 38218 "parser_cocci_menhir.ml"
+# 38334 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -38274,39 +38390,39 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _9 : 'tv_single_statement = Obj.magic _9 in
         let _8 : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
-# 38280 "parser_cocci_menhir.ml"
+# 38396 "parser_cocci_menhir.ml"
         ) = Obj.magic _8 in
         let _7 : 'tv_option_eexpr_ = Obj.magic _7 in
         let _6 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 38286 "parser_cocci_menhir.ml"
+# 38402 "parser_cocci_menhir.ml"
         ) = Obj.magic _6 in
         let _5 : 'tv_option_eexpr_ = Obj.magic _5 in
         let _4 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 38292 "parser_cocci_menhir.ml"
+# 38408 "parser_cocci_menhir.ml"
         ) = Obj.magic _4 in
         let _3 : 'tv_option_eexpr_ = Obj.magic _3 in
         let _2 : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
-# 38298 "parser_cocci_menhir.ml"
+# 38414 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : (
-# 125 "parser_cocci_menhir.mly"
+# 151 "parser_cocci_menhir.mly"
        (Data.clt)
-# 38303 "parser_cocci_menhir.ml"
+# 38419 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__9_ in
         let _v : 'tv_statement = 
-# 1115 "parser_cocci_menhir.mly"
+# 1141 "parser_cocci_menhir.mly"
     ( P.forloop _1 _2 _3 _4 _5 _6 _7 _8 _9 )
-# 38310 "parser_cocci_menhir.ml"
+# 38426 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -38346,27 +38462,27 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _5 : 'tv_single_statement = Obj.magic _5 in
         let _4 : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
-# 38352 "parser_cocci_menhir.ml"
+# 38468 "parser_cocci_menhir.ml"
         ) = Obj.magic _4 in
         let _3 : 'tv_eexpr = Obj.magic _3 in
         let _2 : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
-# 38358 "parser_cocci_menhir.ml"
+# 38474 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : (
-# 125 "parser_cocci_menhir.mly"
+# 151 "parser_cocci_menhir.mly"
        (Data.clt)
-# 38363 "parser_cocci_menhir.ml"
+# 38479 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__5_ in
         let _v : 'tv_statement = 
-# 1117 "parser_cocci_menhir.mly"
+# 1143 "parser_cocci_menhir.mly"
     ( P.whileloop _1 _2 _3 _4 _5 )
-# 38370 "parser_cocci_menhir.ml"
+# 38486 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -38415,38 +38531,38 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _7 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 38421 "parser_cocci_menhir.ml"
+# 38537 "parser_cocci_menhir.ml"
         ) = Obj.magic _7 in
         let _6 : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
-# 38426 "parser_cocci_menhir.ml"
+# 38542 "parser_cocci_menhir.ml"
         ) = Obj.magic _6 in
         let _5 : 'tv_eexpr = Obj.magic _5 in
         let _4 : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
-# 38432 "parser_cocci_menhir.ml"
+# 38548 "parser_cocci_menhir.ml"
         ) = Obj.magic _4 in
         let _3 : (
-# 125 "parser_cocci_menhir.mly"
+# 151 "parser_cocci_menhir.mly"
        (Data.clt)
-# 38437 "parser_cocci_menhir.ml"
+# 38553 "parser_cocci_menhir.ml"
         ) = Obj.magic _3 in
         let _2 : 'tv_single_statement = Obj.magic _2 in
         let _1 : (
-# 125 "parser_cocci_menhir.mly"
+# 151 "parser_cocci_menhir.mly"
        (Data.clt)
-# 38443 "parser_cocci_menhir.ml"
+# 38559 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__7_ in
         let _v : 'tv_statement = 
-# 1119 "parser_cocci_menhir.mly"
+# 1145 "parser_cocci_menhir.mly"
     ( P.doloop _1 _2 _3 _4 _5 _6 _7 )
-# 38450 "parser_cocci_menhir.ml"
+# 38566 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -38486,23 +38602,23 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _5 : 'tv_single_statement = Obj.magic _5 in
         let _4 : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
-# 38492 "parser_cocci_menhir.ml"
+# 38608 "parser_cocci_menhir.ml"
         ) = Obj.magic _4 in
         let _3 : 'tv_eexpr_list_option = Obj.magic _3 in
         let _2 : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
-# 38498 "parser_cocci_menhir.ml"
+# 38614 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_iter_ident = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__5_ in
         let _v : 'tv_statement = 
-# 1121 "parser_cocci_menhir.mly"
+# 1147 "parser_cocci_menhir.mly"
     ( P.iterator _1 _2 _3 _4 _5 )
-# 38506 "parser_cocci_menhir.ml"
+# 38622 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -38556,39 +38672,39 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _8 : (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
-# 38562 "parser_cocci_menhir.ml"
+# 38678 "parser_cocci_menhir.ml"
         ) = Obj.magic _8 in
         let _7 : 'tv_list_case_line_ = Obj.magic _7 in
         let _6 : 'tv_list_decl_var_ = Obj.magic _6 in
         let _5 : (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
-# 38569 "parser_cocci_menhir.ml"
+# 38685 "parser_cocci_menhir.ml"
         ) = Obj.magic _5 in
         let _4 : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
-# 38574 "parser_cocci_menhir.ml"
+# 38690 "parser_cocci_menhir.ml"
         ) = Obj.magic _4 in
         let _3 : 'tv_eexpr = Obj.magic _3 in
         let _2 : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
-# 38580 "parser_cocci_menhir.ml"
+# 38696 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : (
-# 125 "parser_cocci_menhir.mly"
+# 151 "parser_cocci_menhir.mly"
        (Data.clt)
-# 38585 "parser_cocci_menhir.ml"
+# 38701 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__8_ in
         let _v : 'tv_statement = 
-# 1123 "parser_cocci_menhir.mly"
+# 1149 "parser_cocci_menhir.mly"
     ( P.switch _1 _2 _3 _4 _5 (List.concat _6) _7 _8 )
-# 38592 "parser_cocci_menhir.ml"
+# 38708 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -38617,22 +38733,22 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _3 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 38623 "parser_cocci_menhir.ml"
+# 38739 "parser_cocci_menhir.ml"
         ) = Obj.magic _3 in
         let _2 : 'tv_eexpr = Obj.magic _2 in
         let _1 : (
-# 125 "parser_cocci_menhir.mly"
+# 151 "parser_cocci_menhir.mly"
        (Data.clt)
-# 38629 "parser_cocci_menhir.ml"
+# 38745 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_statement = 
-# 1124 "parser_cocci_menhir.mly"
+# 1150 "parser_cocci_menhir.mly"
                         ( P.ret_exp _1 _2 _3 )
-# 38636 "parser_cocci_menhir.ml"
+# 38752 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -38656,21 +38772,21 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _2 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 38662 "parser_cocci_menhir.ml"
+# 38778 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : (
-# 125 "parser_cocci_menhir.mly"
+# 151 "parser_cocci_menhir.mly"
        (Data.clt)
-# 38667 "parser_cocci_menhir.ml"
+# 38783 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_statement = 
-# 1125 "parser_cocci_menhir.mly"
+# 1151 "parser_cocci_menhir.mly"
                   ( P.ret _1 _2 )
-# 38674 "parser_cocci_menhir.ml"
+# 38790 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -38694,21 +38810,21 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _2 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 38700 "parser_cocci_menhir.ml"
+# 38816 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : (
-# 126 "parser_cocci_menhir.mly"
+# 152 "parser_cocci_menhir.mly"
        (Data.clt)
-# 38705 "parser_cocci_menhir.ml"
+# 38821 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_statement = 
-# 1126 "parser_cocci_menhir.mly"
+# 1152 "parser_cocci_menhir.mly"
                  ( P.break _1 _2 )
-# 38712 "parser_cocci_menhir.ml"
+# 38828 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -38732,21 +38848,21 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _2 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 38738 "parser_cocci_menhir.ml"
+# 38854 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : (
-# 126 "parser_cocci_menhir.mly"
+# 152 "parser_cocci_menhir.mly"
        (Data.clt)
-# 38743 "parser_cocci_menhir.ml"
+# 38859 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_statement = 
-# 1127 "parser_cocci_menhir.mly"
+# 1153 "parser_cocci_menhir.mly"
                     ( P.cont _1 _2 )
-# 38750 "parser_cocci_menhir.ml"
+# 38866 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -38770,17 +38886,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _2 : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
-# 38776 "parser_cocci_menhir.ml"
+# 38892 "parser_cocci_menhir.ml"
         ) = Obj.magic _2 in
         let _1 : 'tv_mident = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_statement = 
-# 1128 "parser_cocci_menhir.mly"
+# 1154 "parser_cocci_menhir.mly"
                  ( P.label _1 _2 )
-# 38784 "parser_cocci_menhir.ml"
+# 38900 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -38809,22 +38925,22 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _3 : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 38815 "parser_cocci_menhir.ml"
+# 38931 "parser_cocci_menhir.ml"
         ) = Obj.magic _3 in
         let _2 : 'tv_disj_ident = Obj.magic _2 in
         let _1 : (
-# 126 "parser_cocci_menhir.mly"
+# 152 "parser_cocci_menhir.mly"
        (Data.clt)
-# 38821 "parser_cocci_menhir.ml"
+# 38937 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_statement = 
-# 1129 "parser_cocci_menhir.mly"
+# 1155 "parser_cocci_menhir.mly"
                            ( P.goto _1 _2 _3 )
-# 38828 "parser_cocci_menhir.ml"
+# 38944 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -38853,22 +38969,22 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _3 : (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
-# 38859 "parser_cocci_menhir.ml"
+# 38975 "parser_cocci_menhir.ml"
         ) = Obj.magic _3 in
         let _2 : 'tv_fun_start = Obj.magic _2 in
         let _1 : (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
-# 38865 "parser_cocci_menhir.ml"
+# 38981 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_statement = 
-# 1131 "parser_cocci_menhir.mly"
+# 1157 "parser_cocci_menhir.mly"
     ( P.seq _1 _2 _3 )
-# 38872 "parser_cocci_menhir.ml"
+# 38988 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -38893,16 +39009,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let w : 'tv_list_whenppdecs_ = Obj.magic w in
         let _1 : (
-# 145 "parser_cocci_menhir.mly"
+# 171 "parser_cocci_menhir.mly"
        (Data.clt)
-# 38899 "parser_cocci_menhir.ml"
+# 39015 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos_w_ in
         let _v : 'tv_stm_dots = 
-# 1135 "parser_cocci_menhir.mly"
+# 1161 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Dots(P.clt2mcode "..." _1, List.concat w)) )
-# 38906 "parser_cocci_menhir.ml"
+# 39022 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -38936,24 +39052,24 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let c : (
-# 145 "parser_cocci_menhir.mly"
+# 171 "parser_cocci_menhir.mly"
        (Data.clt)
-# 38942 "parser_cocci_menhir.ml"
+# 39058 "parser_cocci_menhir.ml"
         ) = Obj.magic c in
         let b : 'tv_nest_start = Obj.magic b in
         let w : 'tv_list_whenppdecs_ = Obj.magic w in
         let _1 : (
-# 145 "parser_cocci_menhir.mly"
+# 171 "parser_cocci_menhir.mly"
        (Data.clt)
-# 38949 "parser_cocci_menhir.ml"
+# 39065 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos_c_ in
         let _v : 'tv_stm_dots = 
-# 1137 "parser_cocci_menhir.mly"
+# 1163 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Nest(P.clt2mcode "<..." _1, b,
                          P.clt2mcode "...>" c, List.concat w, false)) )
-# 38957 "parser_cocci_menhir.ml"
+# 39073 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -38987,24 +39103,24 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let c : (
-# 145 "parser_cocci_menhir.mly"
+# 171 "parser_cocci_menhir.mly"
        (Data.clt)
-# 38993 "parser_cocci_menhir.ml"
+# 39109 "parser_cocci_menhir.ml"
         ) = Obj.magic c in
         let b : 'tv_nest_start = Obj.magic b in
         let w : 'tv_list_whenppdecs_ = Obj.magic w in
         let _1 : (
-# 145 "parser_cocci_menhir.mly"
+# 171 "parser_cocci_menhir.mly"
        (Data.clt)
-# 39000 "parser_cocci_menhir.ml"
+# 39116 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos_c_ in
         let _v : 'tv_stm_dots = 
-# 1140 "parser_cocci_menhir.mly"
+# 1166 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Nest(P.clt2mcode "<+..." _1, b,
                          P.clt2mcode "...+>" c, List.concat w, true)) )
-# 39008 "parser_cocci_menhir.ml"
+# 39124 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -39023,16 +39139,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let s : (
-# 121 "parser_cocci_menhir.mly"
+# 147 "parser_cocci_menhir.mly"
       (Data.clt)
-# 39029 "parser_cocci_menhir.ml"
+# 39145 "parser_cocci_menhir.ml"
         ) = Obj.magic s in
         let _startpos = _startpos_s_ in
         let _endpos = _endpos_s_ in
         let _v : 'tv_storage = 
-# 1064 "parser_cocci_menhir.mly"
+# 1090 "parser_cocci_menhir.mly"
                         ( P.clt2mcode Ast.Static s )
-# 39036 "parser_cocci_menhir.ml"
+# 39152 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -39051,16 +39167,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let s : (
-# 121 "parser_cocci_menhir.mly"
+# 147 "parser_cocci_menhir.mly"
       (Data.clt)
-# 39057 "parser_cocci_menhir.ml"
+# 39173 "parser_cocci_menhir.ml"
         ) = Obj.magic s in
         let _startpos = _startpos_s_ in
         let _endpos = _endpos_s_ in
         let _v : 'tv_storage = 
-# 1065 "parser_cocci_menhir.mly"
+# 1091 "parser_cocci_menhir.mly"
                         ( P.clt2mcode Ast.Auto s )
-# 39064 "parser_cocci_menhir.ml"
+# 39180 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -39079,16 +39195,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let s : (
-# 121 "parser_cocci_menhir.mly"
+# 147 "parser_cocci_menhir.mly"
       (Data.clt)
-# 39085 "parser_cocci_menhir.ml"
+# 39201 "parser_cocci_menhir.ml"
         ) = Obj.magic s in
         let _startpos = _startpos_s_ in
         let _endpos = _endpos_s_ in
         let _v : 'tv_storage = 
-# 1066 "parser_cocci_menhir.mly"
+# 1092 "parser_cocci_menhir.mly"
                         ( P.clt2mcode Ast.Register s )
-# 39092 "parser_cocci_menhir.ml"
+# 39208 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -39107,16 +39223,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let s : (
-# 121 "parser_cocci_menhir.mly"
+# 147 "parser_cocci_menhir.mly"
       (Data.clt)
-# 39113 "parser_cocci_menhir.ml"
+# 39229 "parser_cocci_menhir.ml"
         ) = Obj.magic s in
         let _startpos = _startpos_s_ in
         let _endpos = _endpos_s_ in
         let _v : 'tv_storage = 
-# 1067 "parser_cocci_menhir.mly"
+# 1093 "parser_cocci_menhir.mly"
                         ( P.clt2mcode Ast.Extern s )
-# 39120 "parser_cocci_menhir.ml"
+# 39236 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -39136,9 +39252,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_struct_decl = 
-# 759 "parser_cocci_menhir.mly"
+# 785 "parser_cocci_menhir.mly"
                       ( [] )
-# 39142 "parser_cocci_menhir.ml"
+# 39258 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -39160,9 +39276,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_struct_decl = 
-# 760 "parser_cocci_menhir.mly"
+# 786 "parser_cocci_menhir.mly"
                       ( [_1] )
-# 39166 "parser_cocci_menhir.ml"
+# 39282 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -39184,9 +39300,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_struct_decl_list = 
-# 788 "parser_cocci_menhir.mly"
+# 814 "parser_cocci_menhir.mly"
                           ( Ast0.wrap(Ast0.DOTS(_1)) )
-# 39190 "parser_cocci_menhir.ml"
+# 39306 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -39208,9 +39324,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_struct_decl_list_start = 
-# 791 "parser_cocci_menhir.mly"
+# 817 "parser_cocci_menhir.mly"
                                      ( _1 )
-# 39214 "parser_cocci_menhir.ml"
+# 39330 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -39238,9 +39354,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_struct_decl_list_start = 
-# 792 "parser_cocci_menhir.mly"
+# 818 "parser_cocci_menhir.mly"
                                      ( _1@_2 )
-# 39244 "parser_cocci_menhir.ml"
+# 39360 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -39268,9 +39384,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_d_ in
         let _endpos = _endpos_r_ in
         let _v : 'tv_struct_decl_list_start = 
-# 794 "parser_cocci_menhir.mly"
+# 820 "parser_cocci_menhir.mly"
     ( (P.mkddots_one "..." d)::r )
-# 39274 "parser_cocci_menhir.ml"
+# 39390 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -39289,16 +39405,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 135 "parser_cocci_menhir.mly"
+# 161 "parser_cocci_menhir.mly"
        (Parse_aux.info)
-# 39295 "parser_cocci_menhir.ml"
+# 39411 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_struct_decl_one = 
-# 763 "parser_cocci_menhir.mly"
+# 789 "parser_cocci_menhir.mly"
                  ( P.meta_field _1 )
-# 39302 "parser_cocci_menhir.ml"
+# 39418 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -39317,16 +39433,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 137 "parser_cocci_menhir.mly"
+# 163 "parser_cocci_menhir.mly"
        (Parse_aux.list_info)
-# 39323 "parser_cocci_menhir.ml"
+# 39439 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_struct_decl_one = 
-# 764 "parser_cocci_menhir.mly"
+# 790 "parser_cocci_menhir.mly"
                      ( P.meta_field_list _1 )
-# 39330 "parser_cocci_menhir.ml"
+# 39446 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -39345,16 +39461,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 135 "parser_cocci_menhir.mly"
+# 161 "parser_cocci_menhir.mly"
        (Parse_aux.info)
-# 39351 "parser_cocci_menhir.ml"
+# 39467 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_struct_decl_one = 
-# 765 "parser_cocci_menhir.mly"
+# 791 "parser_cocci_menhir.mly"
             ( tmeta_to_field _1 )
-# 39358 "parser_cocci_menhir.ml"
+# 39474 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -39383,24 +39499,24 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let rp : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
-# 39389 "parser_cocci_menhir.ml"
+# 39505 "parser_cocci_menhir.ml"
         ) = Obj.magic rp in
         let t : 'tv_midzero_list_struct_decl_one_struct_decl_one_ = Obj.magic t in
         let lp : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
-# 39395 "parser_cocci_menhir.ml"
+# 39511 "parser_cocci_menhir.ml"
         ) = Obj.magic lp in
         let _startpos = _startpos_lp_ in
         let _endpos = _endpos_rp_ in
         let _v : 'tv_struct_decl_one = 
-# 767 "parser_cocci_menhir.mly"
+# 793 "parser_cocci_menhir.mly"
  ( let (mids,code) = t in
        Ast0.wrap
          (Ast0.DisjDecl(P.clt2mcode "(" lp,code,mids, P.clt2mcode ")" rp)) )
-# 39404 "parser_cocci_menhir.ml"
+# 39520 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -39429,19 +39545,19 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let pv : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 39435 "parser_cocci_menhir.ml"
+# 39551 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let d : 'tv_d_ident = Obj.magic d in
         let t : 'tv_ctype = Obj.magic t in
         let _startpos = _startpos_t_ in
         let _endpos = _endpos_pv_ in
         let _v : 'tv_struct_decl_one = 
-# 771 "parser_cocci_menhir.mly"
+# 797 "parser_cocci_menhir.mly"
   ( let (id,fn) = d in
         Ast0.wrap(Ast0.UnInit(None,fn t,id,P.clt2mcode ";" pv)) )
-# 39445 "parser_cocci_menhir.ml"
+# 39561 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -39500,42 +39616,42 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let pv : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 39506 "parser_cocci_menhir.ml"
+# 39622 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let rp2 : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
-# 39511 "parser_cocci_menhir.ml"
+# 39627 "parser_cocci_menhir.ml"
         ) = Obj.magic rp2 in
         let p : 'tv_decl_list_name_opt_decl_ = Obj.magic p in
         let lp2 : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
-# 39517 "parser_cocci_menhir.ml"
+# 39633 "parser_cocci_menhir.ml"
         ) = Obj.magic lp2 in
         let rp1 : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
-# 39522 "parser_cocci_menhir.ml"
+# 39638 "parser_cocci_menhir.ml"
         ) = Obj.magic rp1 in
         let d : 'tv_d_ident = Obj.magic d in
         let st : (
-# 171 "parser_cocci_menhir.mly"
+# 197 "parser_cocci_menhir.mly"
        (Data.clt)
-# 39528 "parser_cocci_menhir.ml"
+# 39644 "parser_cocci_menhir.ml"
         ) = Obj.magic st in
         let lp1 : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
-# 39533 "parser_cocci_menhir.ml"
+# 39649 "parser_cocci_menhir.ml"
         ) = Obj.magic lp1 in
         let t : 'tv_ctype = Obj.magic t in
         let _startpos = _startpos_t_ in
         let _endpos = _endpos_pv_ in
         let _v : 'tv_struct_decl_one = 
-# 775 "parser_cocci_menhir.mly"
+# 801 "parser_cocci_menhir.mly"
         ( let (id,fn) = d in
         let t =
          Ast0.wrap
@@ -39543,7 +39659,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
               (t,P.clt2mcode "(" lp1,P.clt2mcode "*" st,P.clt2mcode ")" rp1,
                P.clt2mcode "(" lp2,p,P.clt2mcode ")" rp2)) in
         Ast0.wrap(Ast0.UnInit(None,fn t,id,P.clt2mcode ";" pv)) )
-# 39547 "parser_cocci_menhir.ml"
+# 39663 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -39572,9 +39688,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let pv : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 39578 "parser_cocci_menhir.ml"
+# 39694 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let d : 'tv_d_ident = Obj.magic d in
         let i : 'tv_pure_ident_or_symbol = Obj.magic i in
@@ -39584,15 +39700,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 39 "standard.mly"
     ( None )
-# 39588 "parser_cocci_menhir.ml"
+# 39704 "parser_cocci_menhir.ml"
           
         in
         
-# 783 "parser_cocci_menhir.mly"
+# 809 "parser_cocci_menhir.mly"
   ( let (id,fn) = d in
         let idtype = P.make_cv cv (Ast0.wrap (Ast0.TypeName(P.id2mcode i))) in
         Ast0.wrap(Ast0.UnInit(None,fn idtype,id,P.clt2mcode ";" pv)) )
-# 39596 "parser_cocci_menhir.ml"
+# 39712 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -39626,9 +39742,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let pv : (
-# 179 "parser_cocci_menhir.mly"
+# 205 "parser_cocci_menhir.mly"
        (Data.clt)
-# 39632 "parser_cocci_menhir.ml"
+# 39748 "parser_cocci_menhir.ml"
         ) = Obj.magic pv in
         let d : 'tv_d_ident = Obj.magic d in
         let i : 'tv_pure_ident_or_symbol = Obj.magic i in
@@ -39640,15 +39756,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 39644 "parser_cocci_menhir.ml"
+# 39760 "parser_cocci_menhir.ml"
           
         in
         
-# 783 "parser_cocci_menhir.mly"
+# 809 "parser_cocci_menhir.mly"
   ( let (id,fn) = d in
         let idtype = P.make_cv cv (Ast0.wrap (Ast0.TypeName(P.id2mcode i))) in
         Ast0.wrap(Ast0.UnInit(None,fn idtype,id,P.clt2mcode ";" pv)) )
-# 39652 "parser_cocci_menhir.ml"
+# 39768 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -39667,16 +39783,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let s : (
-# 118 "parser_cocci_menhir.mly"
+# 144 "parser_cocci_menhir.mly"
       (Data.clt)
-# 39673 "parser_cocci_menhir.ml"
+# 39789 "parser_cocci_menhir.ml"
         ) = Obj.magic s in
         let _startpos = _startpos_s_ in
         let _endpos = _endpos_s_ in
         let _v : 'tv_struct_or_union = 
-# 755 "parser_cocci_menhir.mly"
+# 781 "parser_cocci_menhir.mly"
                  ( P.clt2mcode Ast.Struct s )
-# 39680 "parser_cocci_menhir.ml"
+# 39796 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -39695,16 +39811,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let u : (
-# 118 "parser_cocci_menhir.mly"
+# 144 "parser_cocci_menhir.mly"
       (Data.clt)
-# 39701 "parser_cocci_menhir.ml"
+# 39817 "parser_cocci_menhir.ml"
         ) = Obj.magic u in
         let _startpos = _startpos_u_ in
         let _endpos = _endpos_u_ in
         let _v : 'tv_struct_or_union = 
-# 756 "parser_cocci_menhir.mly"
+# 782 "parser_cocci_menhir.mly"
                  ( P.clt2mcode Ast.Union u )
-# 39708 "parser_cocci_menhir.ml"
+# 39824 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -39730,7 +39846,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos_i_ in
         let _v : 'tv_sub = 
-# 1951 "parser_cocci_menhir.mly"
+# 1988 "parser_cocci_menhir.mly"
          ( (if !Data.in_iso
           then failwith "constraints not allowed in iso file");
           (if !Data.in_generating
@@ -39739,7 +39855,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             P.check_inherited_constraint i
               (function mv -> Ast.MetaExpDecl(Ast.NONE,mv,None)) in
           [i] )
-# 39743 "parser_cocci_menhir.ml"
+# 39859 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -39773,7 +39889,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__4_ in
         let _v : 'tv_sub = 
-# 1960 "parser_cocci_menhir.mly"
+# 1997 "parser_cocci_menhir.mly"
   ( (if !Data.in_iso
           then failwith "constraints not allowed in iso file");
           (if !Data.in_generating
@@ -39783,7 +39899,7 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
               P.check_inherited_constraint i
                 (function mv -> Ast.MetaExpDecl(Ast.NONE,mv,None)))
             l)
-# 39787 "parser_cocci_menhir.ml"
+# 39903 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -39805,9 +39921,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_top_eexpr = 
-# 1479 "parser_cocci_menhir.mly"
+# 1506 "parser_cocci_menhir.mly"
         ( Ast0.wrap(Ast0.OTHER(Ast0.wrap(Ast0.Exp(_1)))) )
-# 39811 "parser_cocci_menhir.ml"
+# 39927 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -39836,27 +39952,27 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let _3 : (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
-# 39842 "parser_cocci_menhir.ml"
+# 39958 "parser_cocci_menhir.ml"
         ) = Obj.magic _3 in
         let _2 : 'tv_initialize_list = Obj.magic _2 in
         let _1 : (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
-# 39848 "parser_cocci_menhir.ml"
+# 39964 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_top_init = 
-# 2214 "parser_cocci_menhir.mly"
+# 2251 "parser_cocci_menhir.mly"
     ( if P.struct_initializer _2
     then
       let il = P.drop_dot_commas _2 in
       Ast0.wrap(Ast0.InitList(P.clt2mcode "{" _1,il,P.clt2mcode "}" _3,false))
     else
       Ast0.wrap(Ast0.InitList(P.clt2mcode "{" _1,_2,P.clt2mcode "}" _3,true)) )
-# 39860 "parser_cocci_menhir.ml"
+# 39976 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -39871,9 +39987,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in
         let _endpos = _startpos in
         let _v : 'tv_toplevel_after_dots = 
-# 2202 "parser_cocci_menhir.mly"
+# 2239 "parser_cocci_menhir.mly"
                                      ([])
-# 39877 "parser_cocci_menhir.ml"
+# 39993 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -39899,9 +40015,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_toplevel_after_dots = 
-# 2203 "parser_cocci_menhir.mly"
+# 2240 "parser_cocci_menhir.mly"
                                      (_2)
-# 39905 "parser_cocci_menhir.ml"
+# 40021 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -39929,9 +40045,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_toplevel_after_dots = 
-# 2204 "parser_cocci_menhir.mly"
+# 2241 "parser_cocci_menhir.mly"
                                      ((Ast0.wrap(Ast0.Exp(_1)))::_2)
-# 39935 "parser_cocci_menhir.ml"
+# 40051 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -39959,9 +40075,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_toplevel_after_dots = 
-# 2205 "parser_cocci_menhir.mly"
+# 2242 "parser_cocci_menhir.mly"
                                           (_1@_2)
-# 39965 "parser_cocci_menhir.ml"
+# 40081 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -39987,9 +40103,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_toplevel_after_dots_init = 
-# 2193 "parser_cocci_menhir.mly"
+# 2230 "parser_cocci_menhir.mly"
                                      (_2)
-# 39993 "parser_cocci_menhir.ml"
+# 40109 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -40017,9 +40133,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_toplevel_after_dots_init = 
-# 2194 "parser_cocci_menhir.mly"
+# 2231 "parser_cocci_menhir.mly"
                                      ((Ast0.wrap(Ast0.Exp(_1)))::_2)
-# 40023 "parser_cocci_menhir.ml"
+# 40139 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -40047,9 +40163,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_toplevel_after_dots_init = 
-# 2195 "parser_cocci_menhir.mly"
+# 2232 "parser_cocci_menhir.mly"
                                           (_1@_2)
-# 40053 "parser_cocci_menhir.ml"
+# 40169 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -40064,9 +40180,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in
         let _endpos = _startpos in
         let _v : 'tv_toplevel_after_exp = 
-# 2198 "parser_cocci_menhir.mly"
+# 2235 "parser_cocci_menhir.mly"
                                      ([])
-# 40070 "parser_cocci_menhir.ml"
+# 40186 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -40094,9 +40210,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_toplevel_after_exp = 
-# 2199 "parser_cocci_menhir.mly"
+# 2236 "parser_cocci_menhir.mly"
                                      (_1::_2)
-# 40100 "parser_cocci_menhir.ml"
+# 40216 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -40111,9 +40227,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _menhir_env.MenhirLib.EngineTypes.lexbuf.Lexing.lex_start_p in
         let _endpos = _startpos in
         let _v : 'tv_toplevel_after_stm = 
-# 2208 "parser_cocci_menhir.mly"
+# 2245 "parser_cocci_menhir.mly"
                                      ([])
-# 40117 "parser_cocci_menhir.ml"
+# 40233 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -40141,9 +40257,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_toplevel_after_stm = 
-# 2209 "parser_cocci_menhir.mly"
+# 2246 "parser_cocci_menhir.mly"
                                      (_1::_2)
-# 40147 "parser_cocci_menhir.ml"
+# 40263 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -40171,9 +40287,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_toplevel_after_stm = 
-# 2210 "parser_cocci_menhir.mly"
+# 2247 "parser_cocci_menhir.mly"
                                      (_1@_2)
-# 40177 "parser_cocci_menhir.ml"
+# 40293 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -40201,9 +40317,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_toplevel_seq_start_toplevel_after_dots_ = 
-# 2188 "parser_cocci_menhir.mly"
+# 2225 "parser_cocci_menhir.mly"
                                      ( _1::_2 )
-# 40207 "parser_cocci_menhir.ml"
+# 40323 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -40231,9 +40347,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_toplevel_seq_start_toplevel_after_dots_ = 
-# 2189 "parser_cocci_menhir.mly"
+# 2226 "parser_cocci_menhir.mly"
                                      ( (Ast0.wrap(Ast0.Exp(_1)))::_2 )
-# 40237 "parser_cocci_menhir.ml"
+# 40353 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -40261,9 +40377,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_toplevel_seq_start_toplevel_after_dots_ = 
-# 2190 "parser_cocci_menhir.mly"
+# 2227 "parser_cocci_menhir.mly"
                                           ( _1@_2 )
-# 40267 "parser_cocci_menhir.ml"
+# 40383 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -40294,9 +40410,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let b : 'tv_toplevel_after_dots_init = Obj.magic b in
         let w0 : 'tv_list_whenppdecs_ = Obj.magic w0 in
         let a0 : (
-# 145 "parser_cocci_menhir.mly"
+# 171 "parser_cocci_menhir.mly"
        (Data.clt)
-# 40300 "parser_cocci_menhir.ml"
+# 40416 "parser_cocci_menhir.ml"
         ) = Obj.magic a0 in
         let _startpos = _startpos_a0_ in
         let _endpos = _endpos_b_ in
@@ -40304,15 +40420,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let w = w0 in
           let a = a0 in
           
-# 1145 "parser_cocci_menhir.mly"
+# 1171 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Dots(P.clt2mcode "..." a, List.concat w)) )
-# 40310 "parser_cocci_menhir.ml"
+# 40426 "parser_cocci_menhir.ml"
           
         in
         
-# 2181 "parser_cocci_menhir.mly"
+# 2218 "parser_cocci_menhir.mly"
                                              ( a::b )
-# 40316 "parser_cocci_menhir.ml"
+# 40432 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -40352,16 +40468,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let b : 'tv_toplevel_after_dots_init = Obj.magic b in
         let c0 : (
-# 145 "parser_cocci_menhir.mly"
+# 171 "parser_cocci_menhir.mly"
        (Data.clt)
-# 40358 "parser_cocci_menhir.ml"
+# 40474 "parser_cocci_menhir.ml"
         ) = Obj.magic c0 in
         let b0 : 'tv_nest_start = Obj.magic b0 in
         let w0 : 'tv_list_whenppdecs_ = Obj.magic w0 in
         let a0 : (
-# 145 "parser_cocci_menhir.mly"
+# 171 "parser_cocci_menhir.mly"
        (Data.clt)
-# 40365 "parser_cocci_menhir.ml"
+# 40481 "parser_cocci_menhir.ml"
         ) = Obj.magic a0 in
         let _startpos = _startpos_a0_ in
         let _endpos = _endpos_b_ in
@@ -40371,16 +40487,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let w = w0 in
           let a = a0 in
           
-# 1149 "parser_cocci_menhir.mly"
+# 1175 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Nest(P.clt2mcode "<..." a, b,
                          P.clt2mcode "...>" c, List.concat w, false)) )
-# 40378 "parser_cocci_menhir.ml"
+# 40494 "parser_cocci_menhir.ml"
           
         in
         
-# 2182 "parser_cocci_menhir.mly"
+# 2219 "parser_cocci_menhir.mly"
                                               ( a::b )
-# 40384 "parser_cocci_menhir.ml"
+# 40500 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -40420,16 +40536,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let b : 'tv_toplevel_after_dots_init = Obj.magic b in
         let c0 : (
-# 145 "parser_cocci_menhir.mly"
+# 171 "parser_cocci_menhir.mly"
        (Data.clt)
-# 40426 "parser_cocci_menhir.ml"
+# 40542 "parser_cocci_menhir.ml"
         ) = Obj.magic c0 in
         let b0 : 'tv_nest_start = Obj.magic b0 in
         let w0 : 'tv_list_whenppdecs_ = Obj.magic w0 in
         let a0 : (
-# 145 "parser_cocci_menhir.mly"
+# 171 "parser_cocci_menhir.mly"
        (Data.clt)
-# 40433 "parser_cocci_menhir.ml"
+# 40549 "parser_cocci_menhir.ml"
         ) = Obj.magic a0 in
         let _startpos = _startpos_a0_ in
         let _endpos = _endpos_b_ in
@@ -40439,16 +40555,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let w = w0 in
           let a = a0 in
           
-# 1152 "parser_cocci_menhir.mly"
+# 1178 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Nest(P.clt2mcode "<+..." a, b,
                          P.clt2mcode "...+>" c, List.concat w, true)) )
-# 40446 "parser_cocci_menhir.ml"
+# 40562 "parser_cocci_menhir.ml"
           
         in
         
-# 2182 "parser_cocci_menhir.mly"
+# 2219 "parser_cocci_menhir.mly"
                                               ( a::b )
-# 40452 "parser_cocci_menhir.ml"
+# 40568 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -40482,16 +40598,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let c0 : (
-# 145 "parser_cocci_menhir.mly"
+# 171 "parser_cocci_menhir.mly"
        (Data.clt)
-# 40488 "parser_cocci_menhir.ml"
+# 40604 "parser_cocci_menhir.ml"
         ) = Obj.magic c0 in
         let b0 : 'tv_nest_start = Obj.magic b0 in
         let w0 : 'tv_list_whenppdecs_ = Obj.magic w0 in
         let a0 : (
-# 145 "parser_cocci_menhir.mly"
+# 171 "parser_cocci_menhir.mly"
        (Data.clt)
-# 40495 "parser_cocci_menhir.ml"
+# 40611 "parser_cocci_menhir.ml"
         ) = Obj.magic a0 in
         let _startpos = _startpos_a0_ in
         let _endpos = _endpos_c0_ in
@@ -40501,16 +40617,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let w = w0 in
           let a = a0 in
           
-# 1149 "parser_cocci_menhir.mly"
+# 1175 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Nest(P.clt2mcode "<..." a, b,
                          P.clt2mcode "...>" c, List.concat w, false)) )
-# 40508 "parser_cocci_menhir.ml"
+# 40624 "parser_cocci_menhir.ml"
           
         in
         
-# 2183 "parser_cocci_menhir.mly"
+# 2220 "parser_cocci_menhir.mly"
                                        ( [a] )
-# 40514 "parser_cocci_menhir.ml"
+# 40630 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -40544,16 +40660,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let c0 : (
-# 145 "parser_cocci_menhir.mly"
+# 171 "parser_cocci_menhir.mly"
        (Data.clt)
-# 40550 "parser_cocci_menhir.ml"
+# 40666 "parser_cocci_menhir.ml"
         ) = Obj.magic c0 in
         let b0 : 'tv_nest_start = Obj.magic b0 in
         let w0 : 'tv_list_whenppdecs_ = Obj.magic w0 in
         let a0 : (
-# 145 "parser_cocci_menhir.mly"
+# 171 "parser_cocci_menhir.mly"
        (Data.clt)
-# 40557 "parser_cocci_menhir.ml"
+# 40673 "parser_cocci_menhir.ml"
         ) = Obj.magic a0 in
         let _startpos = _startpos_a0_ in
         let _endpos = _endpos_c0_ in
@@ -40563,16 +40679,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let w = w0 in
           let a = a0 in
           
-# 1152 "parser_cocci_menhir.mly"
+# 1178 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Nest(P.clt2mcode "<+..." a, b,
                          P.clt2mcode "...+>" c, List.concat w, true)) )
-# 40570 "parser_cocci_menhir.ml"
+# 40686 "parser_cocci_menhir.ml"
           
         in
         
-# 2183 "parser_cocci_menhir.mly"
+# 2220 "parser_cocci_menhir.mly"
                                        ( [a] )
-# 40576 "parser_cocci_menhir.ml"
+# 40692 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -40600,9 +40716,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_toplevel_seq_startne_toplevel_after_dots_init_ = 
-# 2184 "parser_cocci_menhir.mly"
+# 2221 "parser_cocci_menhir.mly"
                                      ( (Ast0.wrap(Ast0.Exp(_1)))::_2 )
-# 40606 "parser_cocci_menhir.ml"
+# 40722 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -40630,9 +40746,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_toplevel_seq_startne_toplevel_after_dots_init_ = 
-# 2185 "parser_cocci_menhir.mly"
+# 2222 "parser_cocci_menhir.mly"
                                           ( _1@_2 )
-# 40636 "parser_cocci_menhir.ml"
+# 40752 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -40654,9 +40770,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_type_ident = 
-# 2039 "parser_cocci_menhir.mly"
+# 2076 "parser_cocci_menhir.mly"
                        ( _1 )
-# 40660 "parser_cocci_menhir.ml"
+# 40776 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -40675,16 +40791,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 127 "parser_cocci_menhir.mly"
+# 153 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 40681 "parser_cocci_menhir.ml"
+# 40797 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_type_ident = 
-# 2041 "parser_cocci_menhir.mly"
+# 2078 "parser_cocci_menhir.mly"
          ( Ast0.wrap(Ast0.Id(P.id2mcode _1)) )
-# 40688 "parser_cocci_menhir.ml"
+# 40804 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -40714,14 +40830,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty00 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 40720 "parser_cocci_menhir.ml"
+# 40836 "parser_cocci_menhir.ml"
         ) = Obj.magic ty00 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
-# 40725 "parser_cocci_menhir.ml"
+# 40841 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
         let _startpos = _startpos_r0_ in
         let _endpos = _endpos_m_ in
@@ -40731,28 +40847,28 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty = ty0 in
             
-# 638 "parser_cocci_menhir.mly"
+# 664 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.CharType,[P.clt2mcode "char" ty])) )
-# 40737 "parser_cocci_menhir.ml"
+# 40853 "parser_cocci_menhir.ml"
             
           in
           
-# 720 "parser_cocci_menhir.mly"
+# 746 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Signed r,Some ty)) )
-# 40743 "parser_cocci_menhir.ml"
+# 40859 "parser_cocci_menhir.ml"
           
         in
         let cv =
           
 # 39 "standard.mly"
     ( None )
-# 40750 "parser_cocci_menhir.ml"
+# 40866 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 40756 "parser_cocci_menhir.ml"
+# 40872 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -40782,14 +40898,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty00 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 40788 "parser_cocci_menhir.ml"
+# 40904 "parser_cocci_menhir.ml"
         ) = Obj.magic ty00 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
-# 40793 "parser_cocci_menhir.ml"
+# 40909 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
         let _startpos = _startpos_r0_ in
         let _endpos = _endpos_m_ in
@@ -40799,28 +40915,28 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty = ty0 in
             
-# 640 "parser_cocci_menhir.mly"
+# 666 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.ShortType,[P.clt2mcode "short" ty])) )
-# 40805 "parser_cocci_menhir.ml"
+# 40921 "parser_cocci_menhir.ml"
             
           in
           
-# 720 "parser_cocci_menhir.mly"
+# 746 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Signed r,Some ty)) )
-# 40811 "parser_cocci_menhir.ml"
+# 40927 "parser_cocci_menhir.ml"
           
         in
         let cv =
           
 # 39 "standard.mly"
     ( None )
-# 40818 "parser_cocci_menhir.ml"
+# 40934 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 40824 "parser_cocci_menhir.ml"
+# 40940 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -40855,19 +40971,19 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty200 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 40861 "parser_cocci_menhir.ml"
+# 40977 "parser_cocci_menhir.ml"
         ) = Obj.magic ty200 in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 40866 "parser_cocci_menhir.ml"
+# 40982 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
-# 40871 "parser_cocci_menhir.ml"
+# 40987 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
         let _startpos = _startpos_r0_ in
         let _endpos = _endpos_m_ in
@@ -40879,30 +40995,30 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let ty2 = ty20 in
             let ty1 = ty10 in
             
-# 642 "parser_cocci_menhir.mly"
+# 668 "parser_cocci_menhir.mly"
     ( Ast0.wrap
        (Ast0.BaseType
           (Ast.ShortIntType,[P.clt2mcode "short" ty1;P.clt2mcode "int" ty2])) )
-# 40887 "parser_cocci_menhir.ml"
+# 41003 "parser_cocci_menhir.ml"
             
           in
           
-# 720 "parser_cocci_menhir.mly"
+# 746 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Signed r,Some ty)) )
-# 40893 "parser_cocci_menhir.ml"
+# 41009 "parser_cocci_menhir.ml"
           
         in
         let cv =
           
 # 39 "standard.mly"
     ( None )
-# 40900 "parser_cocci_menhir.ml"
+# 41016 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 40906 "parser_cocci_menhir.ml"
+# 41022 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -40932,14 +41048,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty00 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 40938 "parser_cocci_menhir.ml"
+# 41054 "parser_cocci_menhir.ml"
         ) = Obj.magic ty00 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
-# 40943 "parser_cocci_menhir.ml"
+# 41059 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
         let _startpos = _startpos_r0_ in
         let _endpos = _endpos_m_ in
@@ -40949,28 +41065,28 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty = ty0 in
             
-# 646 "parser_cocci_menhir.mly"
+# 672 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.IntType,[P.clt2mcode "int" ty])) )
-# 40955 "parser_cocci_menhir.ml"
+# 41071 "parser_cocci_menhir.ml"
             
           in
           
-# 720 "parser_cocci_menhir.mly"
+# 746 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Signed r,Some ty)) )
-# 40961 "parser_cocci_menhir.ml"
+# 41077 "parser_cocci_menhir.ml"
           
         in
         let cv =
           
 # 39 "standard.mly"
     ( None )
-# 40968 "parser_cocci_menhir.ml"
+# 41084 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 40974 "parser_cocci_menhir.ml"
+# 41090 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -41000,14 +41116,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let p00 : (
-# 134 "parser_cocci_menhir.mly"
+# 160 "parser_cocci_menhir.mly"
        (Parse_aux.info)
-# 41006 "parser_cocci_menhir.ml"
+# 41122 "parser_cocci_menhir.ml"
         ) = Obj.magic p00 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
-# 41011 "parser_cocci_menhir.ml"
+# 41127 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
         let _startpos = _startpos_r0_ in
         let _endpos = _endpos_m_ in
@@ -41017,29 +41133,29 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let p = p0 in
             
-# 648 "parser_cocci_menhir.mly"
+# 674 "parser_cocci_menhir.mly"
     ( let (nm,pure,clt) = p in
       Ast0.wrap(Ast0.MetaType(P.clt2mcode nm clt,pure)) )
-# 41024 "parser_cocci_menhir.ml"
+# 41140 "parser_cocci_menhir.ml"
             
           in
           
-# 720 "parser_cocci_menhir.mly"
+# 746 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Signed r,Some ty)) )
-# 41030 "parser_cocci_menhir.ml"
+# 41146 "parser_cocci_menhir.ml"
           
         in
         let cv =
           
 # 39 "standard.mly"
     ( None )
-# 41037 "parser_cocci_menhir.ml"
+# 41153 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 41043 "parser_cocci_menhir.ml"
+# 41159 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -41078,19 +41194,19 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let p00 : (
-# 127 "parser_cocci_menhir.mly"
+# 153 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 41084 "parser_cocci_menhir.ml"
+# 41200 "parser_cocci_menhir.ml"
         ) = Obj.magic p00 in
         let r00 : (
-# 114 "parser_cocci_menhir.mly"
+# 140 "parser_cocci_menhir.mly"
       (string)
-# 41089 "parser_cocci_menhir.ml"
+# 41205 "parser_cocci_menhir.ml"
         ) = Obj.magic r00 in
         let r1 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
-# 41094 "parser_cocci_menhir.ml"
+# 41210 "parser_cocci_menhir.ml"
         ) = Obj.magic r1 in
         let _startpos = _startpos_r1_ in
         let _endpos = _endpos_m_ in
@@ -41102,33 +41218,33 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let p = p0 in
             let r = r0 in
             
-# 651 "parser_cocci_menhir.mly"
+# 677 "parser_cocci_menhir.mly"
     ( let nm = (r,P.id2name p) in
     (* this is only possible when we are in a metavar decl.  Otherwise,
        it will be represented already as a MetaType *)
     let _ = P.check_meta(Ast.MetaTypeDecl(Ast.NONE,nm)) in
     Ast0.wrap(Ast0.MetaType(P.clt2mcode nm (P.id2clt p),
                            Ast0.Impure (*will be ignored*))) )
-# 41113 "parser_cocci_menhir.ml"
+# 41229 "parser_cocci_menhir.ml"
             
           in
           
-# 720 "parser_cocci_menhir.mly"
+# 746 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Signed r,Some ty)) )
-# 41119 "parser_cocci_menhir.ml"
+# 41235 "parser_cocci_menhir.ml"
           
         in
         let cv =
           
 # 39 "standard.mly"
     ( None )
-# 41126 "parser_cocci_menhir.ml"
+# 41242 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 41132 "parser_cocci_menhir.ml"
+# 41248 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -41158,14 +41274,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 41164 "parser_cocci_menhir.ml"
+# 41280 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
-# 41169 "parser_cocci_menhir.ml"
+# 41285 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
         let _startpos = _startpos_r0_ in
         let _endpos = _endpos_m_ in
@@ -41175,28 +41291,28 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty1 = ty10 in
             
-# 658 "parser_cocci_menhir.mly"
+# 684 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.LongType,[P.clt2mcode "long" ty1])) )
-# 41181 "parser_cocci_menhir.ml"
+# 41297 "parser_cocci_menhir.ml"
             
           in
           
-# 720 "parser_cocci_menhir.mly"
+# 746 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Signed r,Some ty)) )
-# 41187 "parser_cocci_menhir.ml"
+# 41303 "parser_cocci_menhir.ml"
           
         in
         let cv =
           
 # 39 "standard.mly"
     ( None )
-# 41194 "parser_cocci_menhir.ml"
+# 41310 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 41200 "parser_cocci_menhir.ml"
+# 41316 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -41231,19 +41347,19 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty200 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 41237 "parser_cocci_menhir.ml"
+# 41353 "parser_cocci_menhir.ml"
         ) = Obj.magic ty200 in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 41242 "parser_cocci_menhir.ml"
+# 41358 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
-# 41247 "parser_cocci_menhir.ml"
+# 41363 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
         let _startpos = _startpos_r0_ in
         let _endpos = _endpos_m_ in
@@ -41255,30 +41371,30 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let ty2 = ty20 in
             let ty1 = ty10 in
             
-# 660 "parser_cocci_menhir.mly"
+# 686 "parser_cocci_menhir.mly"
     ( Ast0.wrap
        (Ast0.BaseType
           (Ast.LongIntType,[P.clt2mcode "long" ty1;P.clt2mcode "int" ty2])) )
-# 41263 "parser_cocci_menhir.ml"
+# 41379 "parser_cocci_menhir.ml"
             
           in
           
-# 720 "parser_cocci_menhir.mly"
+# 746 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Signed r,Some ty)) )
-# 41269 "parser_cocci_menhir.ml"
+# 41385 "parser_cocci_menhir.ml"
           
         in
         let cv =
           
 # 39 "standard.mly"
     ( None )
-# 41276 "parser_cocci_menhir.ml"
+# 41392 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 41282 "parser_cocci_menhir.ml"
+# 41398 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -41313,19 +41429,19 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty200 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 41319 "parser_cocci_menhir.ml"
+# 41435 "parser_cocci_menhir.ml"
         ) = Obj.magic ty200 in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 41324 "parser_cocci_menhir.ml"
+# 41440 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
-# 41329 "parser_cocci_menhir.ml"
+# 41445 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
         let _startpos = _startpos_r0_ in
         let _endpos = _endpos_m_ in
@@ -41337,31 +41453,31 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let ty2 = ty20 in
             let ty1 = ty10 in
             
-# 664 "parser_cocci_menhir.mly"
+# 690 "parser_cocci_menhir.mly"
     ( Ast0.wrap
        (Ast0.BaseType
           (Ast.LongLongType,
            [P.clt2mcode "long" ty1;P.clt2mcode "long" ty2])) )
-# 41346 "parser_cocci_menhir.ml"
+# 41462 "parser_cocci_menhir.ml"
             
           in
           
-# 720 "parser_cocci_menhir.mly"
+# 746 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Signed r,Some ty)) )
-# 41352 "parser_cocci_menhir.ml"
+# 41468 "parser_cocci_menhir.ml"
           
         in
         let cv =
           
 # 39 "standard.mly"
     ( None )
-# 41359 "parser_cocci_menhir.ml"
+# 41475 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 41365 "parser_cocci_menhir.ml"
+# 41481 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -41401,24 +41517,24 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty300 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 41407 "parser_cocci_menhir.ml"
+# 41523 "parser_cocci_menhir.ml"
         ) = Obj.magic ty300 in
         let ty200 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 41412 "parser_cocci_menhir.ml"
+# 41528 "parser_cocci_menhir.ml"
         ) = Obj.magic ty200 in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 41417 "parser_cocci_menhir.ml"
+# 41533 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
-# 41422 "parser_cocci_menhir.ml"
+# 41538 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
         let _startpos = _startpos_r0_ in
         let _endpos = _endpos_m_ in
@@ -41432,32 +41548,32 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let ty2 = ty20 in
             let ty1 = ty10 in
             
-# 669 "parser_cocci_menhir.mly"
+# 695 "parser_cocci_menhir.mly"
     ( Ast0.wrap
        (Ast0.BaseType
           (Ast.LongLongIntType,
            [P.clt2mcode "long" ty1;P.clt2mcode "long" ty2;
              P.clt2mcode "int" ty3])) )
-# 41442 "parser_cocci_menhir.ml"
+# 41558 "parser_cocci_menhir.ml"
             
           in
           
-# 720 "parser_cocci_menhir.mly"
+# 746 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Signed r,Some ty)) )
-# 41448 "parser_cocci_menhir.ml"
+# 41564 "parser_cocci_menhir.ml"
           
         in
         let cv =
           
 # 39 "standard.mly"
     ( None )
-# 41455 "parser_cocci_menhir.ml"
+# 41571 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 41461 "parser_cocci_menhir.ml"
+# 41577 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -41487,14 +41603,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty00 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 41493 "parser_cocci_menhir.ml"
+# 41609 "parser_cocci_menhir.ml"
         ) = Obj.magic ty00 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
-# 41498 "parser_cocci_menhir.ml"
+# 41614 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
         let _startpos = _startpos_r0_ in
         let _endpos = _endpos_m_ in
@@ -41504,28 +41620,28 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty = ty0 in
             
-# 638 "parser_cocci_menhir.mly"
+# 664 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.CharType,[P.clt2mcode "char" ty])) )
-# 41510 "parser_cocci_menhir.ml"
+# 41626 "parser_cocci_menhir.ml"
             
           in
           
-# 722 "parser_cocci_menhir.mly"
+# 748 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Unsigned r,Some ty)) )
-# 41516 "parser_cocci_menhir.ml"
+# 41632 "parser_cocci_menhir.ml"
           
         in
         let cv =
           
 # 39 "standard.mly"
     ( None )
-# 41523 "parser_cocci_menhir.ml"
+# 41639 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 41529 "parser_cocci_menhir.ml"
+# 41645 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -41555,14 +41671,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty00 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 41561 "parser_cocci_menhir.ml"
+# 41677 "parser_cocci_menhir.ml"
         ) = Obj.magic ty00 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
-# 41566 "parser_cocci_menhir.ml"
+# 41682 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
         let _startpos = _startpos_r0_ in
         let _endpos = _endpos_m_ in
@@ -41572,28 +41688,28 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty = ty0 in
             
-# 640 "parser_cocci_menhir.mly"
+# 666 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.ShortType,[P.clt2mcode "short" ty])) )
-# 41578 "parser_cocci_menhir.ml"
+# 41694 "parser_cocci_menhir.ml"
             
           in
           
-# 722 "parser_cocci_menhir.mly"
+# 748 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Unsigned r,Some ty)) )
-# 41584 "parser_cocci_menhir.ml"
+# 41700 "parser_cocci_menhir.ml"
           
         in
         let cv =
           
 # 39 "standard.mly"
     ( None )
-# 41591 "parser_cocci_menhir.ml"
+# 41707 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 41597 "parser_cocci_menhir.ml"
+# 41713 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -41628,19 +41744,19 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty200 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 41634 "parser_cocci_menhir.ml"
+# 41750 "parser_cocci_menhir.ml"
         ) = Obj.magic ty200 in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 41639 "parser_cocci_menhir.ml"
+# 41755 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
-# 41644 "parser_cocci_menhir.ml"
+# 41760 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
         let _startpos = _startpos_r0_ in
         let _endpos = _endpos_m_ in
@@ -41652,30 +41768,30 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let ty2 = ty20 in
             let ty1 = ty10 in
             
-# 642 "parser_cocci_menhir.mly"
+# 668 "parser_cocci_menhir.mly"
     ( Ast0.wrap
        (Ast0.BaseType
           (Ast.ShortIntType,[P.clt2mcode "short" ty1;P.clt2mcode "int" ty2])) )
-# 41660 "parser_cocci_menhir.ml"
+# 41776 "parser_cocci_menhir.ml"
             
           in
           
-# 722 "parser_cocci_menhir.mly"
+# 748 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Unsigned r,Some ty)) )
-# 41666 "parser_cocci_menhir.ml"
+# 41782 "parser_cocci_menhir.ml"
           
         in
         let cv =
           
 # 39 "standard.mly"
     ( None )
-# 41673 "parser_cocci_menhir.ml"
+# 41789 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 41679 "parser_cocci_menhir.ml"
+# 41795 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -41705,14 +41821,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty00 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 41711 "parser_cocci_menhir.ml"
+# 41827 "parser_cocci_menhir.ml"
         ) = Obj.magic ty00 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
-# 41716 "parser_cocci_menhir.ml"
+# 41832 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
         let _startpos = _startpos_r0_ in
         let _endpos = _endpos_m_ in
@@ -41722,28 +41838,28 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty = ty0 in
             
-# 646 "parser_cocci_menhir.mly"
+# 672 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.IntType,[P.clt2mcode "int" ty])) )
-# 41728 "parser_cocci_menhir.ml"
+# 41844 "parser_cocci_menhir.ml"
             
           in
           
-# 722 "parser_cocci_menhir.mly"
+# 748 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Unsigned r,Some ty)) )
-# 41734 "parser_cocci_menhir.ml"
+# 41850 "parser_cocci_menhir.ml"
           
         in
         let cv =
           
 # 39 "standard.mly"
     ( None )
-# 41741 "parser_cocci_menhir.ml"
+# 41857 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 41747 "parser_cocci_menhir.ml"
+# 41863 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -41773,14 +41889,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let p00 : (
-# 134 "parser_cocci_menhir.mly"
+# 160 "parser_cocci_menhir.mly"
        (Parse_aux.info)
-# 41779 "parser_cocci_menhir.ml"
+# 41895 "parser_cocci_menhir.ml"
         ) = Obj.magic p00 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
-# 41784 "parser_cocci_menhir.ml"
+# 41900 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
         let _startpos = _startpos_r0_ in
         let _endpos = _endpos_m_ in
@@ -41790,29 +41906,29 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let p = p0 in
             
-# 648 "parser_cocci_menhir.mly"
+# 674 "parser_cocci_menhir.mly"
     ( let (nm,pure,clt) = p in
       Ast0.wrap(Ast0.MetaType(P.clt2mcode nm clt,pure)) )
-# 41797 "parser_cocci_menhir.ml"
+# 41913 "parser_cocci_menhir.ml"
             
           in
           
-# 722 "parser_cocci_menhir.mly"
+# 748 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Unsigned r,Some ty)) )
-# 41803 "parser_cocci_menhir.ml"
+# 41919 "parser_cocci_menhir.ml"
           
         in
         let cv =
           
 # 39 "standard.mly"
     ( None )
-# 41810 "parser_cocci_menhir.ml"
+# 41926 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 41816 "parser_cocci_menhir.ml"
+# 41932 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -41851,19 +41967,19 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let p00 : (
-# 127 "parser_cocci_menhir.mly"
+# 153 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 41857 "parser_cocci_menhir.ml"
+# 41973 "parser_cocci_menhir.ml"
         ) = Obj.magic p00 in
         let r00 : (
-# 114 "parser_cocci_menhir.mly"
+# 140 "parser_cocci_menhir.mly"
       (string)
-# 41862 "parser_cocci_menhir.ml"
+# 41978 "parser_cocci_menhir.ml"
         ) = Obj.magic r00 in
         let r1 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
-# 41867 "parser_cocci_menhir.ml"
+# 41983 "parser_cocci_menhir.ml"
         ) = Obj.magic r1 in
         let _startpos = _startpos_r1_ in
         let _endpos = _endpos_m_ in
@@ -41875,33 +41991,33 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let p = p0 in
             let r = r0 in
             
-# 651 "parser_cocci_menhir.mly"
+# 677 "parser_cocci_menhir.mly"
     ( let nm = (r,P.id2name p) in
     (* this is only possible when we are in a metavar decl.  Otherwise,
        it will be represented already as a MetaType *)
     let _ = P.check_meta(Ast.MetaTypeDecl(Ast.NONE,nm)) in
     Ast0.wrap(Ast0.MetaType(P.clt2mcode nm (P.id2clt p),
                            Ast0.Impure (*will be ignored*))) )
-# 41886 "parser_cocci_menhir.ml"
+# 42002 "parser_cocci_menhir.ml"
             
           in
           
-# 722 "parser_cocci_menhir.mly"
+# 748 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Unsigned r,Some ty)) )
-# 41892 "parser_cocci_menhir.ml"
+# 42008 "parser_cocci_menhir.ml"
           
         in
         let cv =
           
 # 39 "standard.mly"
     ( None )
-# 41899 "parser_cocci_menhir.ml"
+# 42015 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 41905 "parser_cocci_menhir.ml"
+# 42021 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -41931,14 +42047,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 41937 "parser_cocci_menhir.ml"
+# 42053 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
-# 41942 "parser_cocci_menhir.ml"
+# 42058 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
         let _startpos = _startpos_r0_ in
         let _endpos = _endpos_m_ in
@@ -41948,28 +42064,28 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty1 = ty10 in
             
-# 658 "parser_cocci_menhir.mly"
+# 684 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.LongType,[P.clt2mcode "long" ty1])) )
-# 41954 "parser_cocci_menhir.ml"
+# 42070 "parser_cocci_menhir.ml"
             
           in
           
-# 722 "parser_cocci_menhir.mly"
+# 748 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Unsigned r,Some ty)) )
-# 41960 "parser_cocci_menhir.ml"
+# 42076 "parser_cocci_menhir.ml"
           
         in
         let cv =
           
 # 39 "standard.mly"
     ( None )
-# 41967 "parser_cocci_menhir.ml"
+# 42083 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 41973 "parser_cocci_menhir.ml"
+# 42089 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -42004,19 +42120,19 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty200 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 42010 "parser_cocci_menhir.ml"
+# 42126 "parser_cocci_menhir.ml"
         ) = Obj.magic ty200 in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 42015 "parser_cocci_menhir.ml"
+# 42131 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
-# 42020 "parser_cocci_menhir.ml"
+# 42136 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
         let _startpos = _startpos_r0_ in
         let _endpos = _endpos_m_ in
@@ -42028,30 +42144,30 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let ty2 = ty20 in
             let ty1 = ty10 in
             
-# 660 "parser_cocci_menhir.mly"
+# 686 "parser_cocci_menhir.mly"
     ( Ast0.wrap
        (Ast0.BaseType
           (Ast.LongIntType,[P.clt2mcode "long" ty1;P.clt2mcode "int" ty2])) )
-# 42036 "parser_cocci_menhir.ml"
+# 42152 "parser_cocci_menhir.ml"
             
           in
           
-# 722 "parser_cocci_menhir.mly"
+# 748 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Unsigned r,Some ty)) )
-# 42042 "parser_cocci_menhir.ml"
+# 42158 "parser_cocci_menhir.ml"
           
         in
         let cv =
           
 # 39 "standard.mly"
     ( None )
-# 42049 "parser_cocci_menhir.ml"
+# 42165 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 42055 "parser_cocci_menhir.ml"
+# 42171 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -42086,19 +42202,19 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty200 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 42092 "parser_cocci_menhir.ml"
+# 42208 "parser_cocci_menhir.ml"
         ) = Obj.magic ty200 in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 42097 "parser_cocci_menhir.ml"
+# 42213 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
-# 42102 "parser_cocci_menhir.ml"
+# 42218 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
         let _startpos = _startpos_r0_ in
         let _endpos = _endpos_m_ in
@@ -42110,31 +42226,31 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let ty2 = ty20 in
             let ty1 = ty10 in
             
-# 664 "parser_cocci_menhir.mly"
+# 690 "parser_cocci_menhir.mly"
     ( Ast0.wrap
        (Ast0.BaseType
           (Ast.LongLongType,
            [P.clt2mcode "long" ty1;P.clt2mcode "long" ty2])) )
-# 42119 "parser_cocci_menhir.ml"
+# 42235 "parser_cocci_menhir.ml"
             
           in
           
-# 722 "parser_cocci_menhir.mly"
+# 748 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Unsigned r,Some ty)) )
-# 42125 "parser_cocci_menhir.ml"
+# 42241 "parser_cocci_menhir.ml"
           
         in
         let cv =
           
 # 39 "standard.mly"
     ( None )
-# 42132 "parser_cocci_menhir.ml"
+# 42248 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 42138 "parser_cocci_menhir.ml"
+# 42254 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -42174,24 +42290,24 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty300 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 42180 "parser_cocci_menhir.ml"
+# 42296 "parser_cocci_menhir.ml"
         ) = Obj.magic ty300 in
         let ty200 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 42185 "parser_cocci_menhir.ml"
+# 42301 "parser_cocci_menhir.ml"
         ) = Obj.magic ty200 in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 42190 "parser_cocci_menhir.ml"
+# 42306 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
-# 42195 "parser_cocci_menhir.ml"
+# 42311 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
         let _startpos = _startpos_r0_ in
         let _endpos = _endpos_m_ in
@@ -42205,32 +42321,32 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let ty2 = ty20 in
             let ty1 = ty10 in
             
-# 669 "parser_cocci_menhir.mly"
+# 695 "parser_cocci_menhir.mly"
     ( Ast0.wrap
        (Ast0.BaseType
           (Ast.LongLongIntType,
            [P.clt2mcode "long" ty1;P.clt2mcode "long" ty2;
              P.clt2mcode "int" ty3])) )
-# 42215 "parser_cocci_menhir.ml"
+# 42331 "parser_cocci_menhir.ml"
             
           in
           
-# 722 "parser_cocci_menhir.mly"
+# 748 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Unsigned r,Some ty)) )
-# 42221 "parser_cocci_menhir.ml"
+# 42337 "parser_cocci_menhir.ml"
           
         in
         let cv =
           
 # 39 "standard.mly"
     ( None )
-# 42228 "parser_cocci_menhir.ml"
+# 42344 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 42234 "parser_cocci_menhir.ml"
+# 42350 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -42255,9 +42371,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty00 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 42261 "parser_cocci_menhir.ml"
+# 42377 "parser_cocci_menhir.ml"
         ) = Obj.magic ty00 in
         let _startpos = _startpos_ty00_ in
         let _endpos = _endpos_m_ in
@@ -42266,28 +42382,28 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty = ty0 in
             
-# 638 "parser_cocci_menhir.mly"
+# 664 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.CharType,[P.clt2mcode "char" ty])) )
-# 42272 "parser_cocci_menhir.ml"
+# 42388 "parser_cocci_menhir.ml"
             
           in
           
-# 723 "parser_cocci_menhir.mly"
+# 749 "parser_cocci_menhir.mly"
                     ( ty )
-# 42278 "parser_cocci_menhir.ml"
+# 42394 "parser_cocci_menhir.ml"
           
         in
         let cv =
           
 # 39 "standard.mly"
     ( None )
-# 42285 "parser_cocci_menhir.ml"
+# 42401 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 42291 "parser_cocci_menhir.ml"
+# 42407 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -42312,9 +42428,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty00 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 42318 "parser_cocci_menhir.ml"
+# 42434 "parser_cocci_menhir.ml"
         ) = Obj.magic ty00 in
         let _startpos = _startpos_ty00_ in
         let _endpos = _endpos_m_ in
@@ -42323,28 +42439,28 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty = ty0 in
             
-# 640 "parser_cocci_menhir.mly"
+# 666 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.ShortType,[P.clt2mcode "short" ty])) )
-# 42329 "parser_cocci_menhir.ml"
+# 42445 "parser_cocci_menhir.ml"
             
           in
           
-# 723 "parser_cocci_menhir.mly"
+# 749 "parser_cocci_menhir.mly"
                     ( ty )
-# 42335 "parser_cocci_menhir.ml"
+# 42451 "parser_cocci_menhir.ml"
           
         in
         let cv =
           
 # 39 "standard.mly"
     ( None )
-# 42342 "parser_cocci_menhir.ml"
+# 42458 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 42348 "parser_cocci_menhir.ml"
+# 42464 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -42374,14 +42490,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty200 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 42380 "parser_cocci_menhir.ml"
+# 42496 "parser_cocci_menhir.ml"
         ) = Obj.magic ty200 in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 42385 "parser_cocci_menhir.ml"
+# 42501 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
         let _startpos = _startpos_ty100_ in
         let _endpos = _endpos_m_ in
@@ -42392,30 +42508,30 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let ty2 = ty20 in
             let ty1 = ty10 in
             
-# 642 "parser_cocci_menhir.mly"
+# 668 "parser_cocci_menhir.mly"
     ( Ast0.wrap
        (Ast0.BaseType
           (Ast.ShortIntType,[P.clt2mcode "short" ty1;P.clt2mcode "int" ty2])) )
-# 42400 "parser_cocci_menhir.ml"
+# 42516 "parser_cocci_menhir.ml"
             
           in
           
-# 723 "parser_cocci_menhir.mly"
+# 749 "parser_cocci_menhir.mly"
                     ( ty )
-# 42406 "parser_cocci_menhir.ml"
+# 42522 "parser_cocci_menhir.ml"
           
         in
         let cv =
           
 # 39 "standard.mly"
     ( None )
-# 42413 "parser_cocci_menhir.ml"
+# 42529 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 42419 "parser_cocci_menhir.ml"
+# 42535 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -42440,9 +42556,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty00 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 42446 "parser_cocci_menhir.ml"
+# 42562 "parser_cocci_menhir.ml"
         ) = Obj.magic ty00 in
         let _startpos = _startpos_ty00_ in
         let _endpos = _endpos_m_ in
@@ -42451,28 +42567,28 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty = ty0 in
             
-# 646 "parser_cocci_menhir.mly"
+# 672 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.IntType,[P.clt2mcode "int" ty])) )
-# 42457 "parser_cocci_menhir.ml"
+# 42573 "parser_cocci_menhir.ml"
             
           in
           
-# 723 "parser_cocci_menhir.mly"
+# 749 "parser_cocci_menhir.mly"
                     ( ty )
-# 42463 "parser_cocci_menhir.ml"
+# 42579 "parser_cocci_menhir.ml"
           
         in
         let cv =
           
 # 39 "standard.mly"
     ( None )
-# 42470 "parser_cocci_menhir.ml"
+# 42586 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 42476 "parser_cocci_menhir.ml"
+# 42592 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -42497,9 +42613,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let p00 : (
-# 134 "parser_cocci_menhir.mly"
+# 160 "parser_cocci_menhir.mly"
        (Parse_aux.info)
-# 42503 "parser_cocci_menhir.ml"
+# 42619 "parser_cocci_menhir.ml"
         ) = Obj.magic p00 in
         let _startpos = _startpos_p00_ in
         let _endpos = _endpos_m_ in
@@ -42508,29 +42624,29 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let p = p0 in
             
-# 648 "parser_cocci_menhir.mly"
+# 674 "parser_cocci_menhir.mly"
     ( let (nm,pure,clt) = p in
       Ast0.wrap(Ast0.MetaType(P.clt2mcode nm clt,pure)) )
-# 42515 "parser_cocci_menhir.ml"
+# 42631 "parser_cocci_menhir.ml"
             
           in
           
-# 723 "parser_cocci_menhir.mly"
+# 749 "parser_cocci_menhir.mly"
                     ( ty )
-# 42521 "parser_cocci_menhir.ml"
+# 42637 "parser_cocci_menhir.ml"
           
         in
         let cv =
           
 # 39 "standard.mly"
     ( None )
-# 42528 "parser_cocci_menhir.ml"
+# 42644 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 42534 "parser_cocci_menhir.ml"
+# 42650 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -42564,14 +42680,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let p00 : (
-# 127 "parser_cocci_menhir.mly"
+# 153 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 42570 "parser_cocci_menhir.ml"
+# 42686 "parser_cocci_menhir.ml"
         ) = Obj.magic p00 in
         let r00 : (
-# 114 "parser_cocci_menhir.mly"
+# 140 "parser_cocci_menhir.mly"
       (string)
-# 42575 "parser_cocci_menhir.ml"
+# 42691 "parser_cocci_menhir.ml"
         ) = Obj.magic r00 in
         let _startpos = _startpos_r00_ in
         let _endpos = _endpos_m_ in
@@ -42582,33 +42698,33 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let p = p0 in
             let r = r0 in
             
-# 651 "parser_cocci_menhir.mly"
+# 677 "parser_cocci_menhir.mly"
     ( let nm = (r,P.id2name p) in
     (* this is only possible when we are in a metavar decl.  Otherwise,
        it will be represented already as a MetaType *)
     let _ = P.check_meta(Ast.MetaTypeDecl(Ast.NONE,nm)) in
     Ast0.wrap(Ast0.MetaType(P.clt2mcode nm (P.id2clt p),
                            Ast0.Impure (*will be ignored*))) )
-# 42593 "parser_cocci_menhir.ml"
+# 42709 "parser_cocci_menhir.ml"
             
           in
           
-# 723 "parser_cocci_menhir.mly"
+# 749 "parser_cocci_menhir.mly"
                     ( ty )
-# 42599 "parser_cocci_menhir.ml"
+# 42715 "parser_cocci_menhir.ml"
           
         in
         let cv =
           
 # 39 "standard.mly"
     ( None )
-# 42606 "parser_cocci_menhir.ml"
+# 42722 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 42612 "parser_cocci_menhir.ml"
+# 42728 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -42633,9 +42749,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 42639 "parser_cocci_menhir.ml"
+# 42755 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
         let _startpos = _startpos_ty100_ in
         let _endpos = _endpos_m_ in
@@ -42644,28 +42760,28 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty1 = ty10 in
             
-# 658 "parser_cocci_menhir.mly"
+# 684 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.LongType,[P.clt2mcode "long" ty1])) )
-# 42650 "parser_cocci_menhir.ml"
+# 42766 "parser_cocci_menhir.ml"
             
           in
           
-# 723 "parser_cocci_menhir.mly"
+# 749 "parser_cocci_menhir.mly"
                     ( ty )
-# 42656 "parser_cocci_menhir.ml"
+# 42772 "parser_cocci_menhir.ml"
           
         in
         let cv =
           
 # 39 "standard.mly"
     ( None )
-# 42663 "parser_cocci_menhir.ml"
+# 42779 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 42669 "parser_cocci_menhir.ml"
+# 42785 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -42695,14 +42811,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty200 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 42701 "parser_cocci_menhir.ml"
+# 42817 "parser_cocci_menhir.ml"
         ) = Obj.magic ty200 in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 42706 "parser_cocci_menhir.ml"
+# 42822 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
         let _startpos = _startpos_ty100_ in
         let _endpos = _endpos_m_ in
@@ -42713,30 +42829,30 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let ty2 = ty20 in
             let ty1 = ty10 in
             
-# 660 "parser_cocci_menhir.mly"
+# 686 "parser_cocci_menhir.mly"
     ( Ast0.wrap
        (Ast0.BaseType
           (Ast.LongIntType,[P.clt2mcode "long" ty1;P.clt2mcode "int" ty2])) )
-# 42721 "parser_cocci_menhir.ml"
+# 42837 "parser_cocci_menhir.ml"
             
           in
           
-# 723 "parser_cocci_menhir.mly"
+# 749 "parser_cocci_menhir.mly"
                     ( ty )
-# 42727 "parser_cocci_menhir.ml"
+# 42843 "parser_cocci_menhir.ml"
           
         in
         let cv =
           
 # 39 "standard.mly"
     ( None )
-# 42734 "parser_cocci_menhir.ml"
+# 42850 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 42740 "parser_cocci_menhir.ml"
+# 42856 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -42766,14 +42882,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty200 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 42772 "parser_cocci_menhir.ml"
+# 42888 "parser_cocci_menhir.ml"
         ) = Obj.magic ty200 in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 42777 "parser_cocci_menhir.ml"
+# 42893 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
         let _startpos = _startpos_ty100_ in
         let _endpos = _endpos_m_ in
@@ -42784,31 +42900,31 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let ty2 = ty20 in
             let ty1 = ty10 in
             
-# 664 "parser_cocci_menhir.mly"
+# 690 "parser_cocci_menhir.mly"
     ( Ast0.wrap
        (Ast0.BaseType
           (Ast.LongLongType,
            [P.clt2mcode "long" ty1;P.clt2mcode "long" ty2])) )
-# 42793 "parser_cocci_menhir.ml"
+# 42909 "parser_cocci_menhir.ml"
             
           in
           
-# 723 "parser_cocci_menhir.mly"
+# 749 "parser_cocci_menhir.mly"
                     ( ty )
-# 42799 "parser_cocci_menhir.ml"
+# 42915 "parser_cocci_menhir.ml"
           
         in
         let cv =
           
 # 39 "standard.mly"
     ( None )
-# 42806 "parser_cocci_menhir.ml"
+# 42922 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 42812 "parser_cocci_menhir.ml"
+# 42928 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -42843,19 +42959,19 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty300 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 42849 "parser_cocci_menhir.ml"
+# 42965 "parser_cocci_menhir.ml"
         ) = Obj.magic ty300 in
         let ty200 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 42854 "parser_cocci_menhir.ml"
+# 42970 "parser_cocci_menhir.ml"
         ) = Obj.magic ty200 in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 42859 "parser_cocci_menhir.ml"
+# 42975 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
         let _startpos = _startpos_ty100_ in
         let _endpos = _endpos_m_ in
@@ -42868,32 +42984,32 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let ty2 = ty20 in
             let ty1 = ty10 in
             
-# 669 "parser_cocci_menhir.mly"
+# 695 "parser_cocci_menhir.mly"
     ( Ast0.wrap
        (Ast0.BaseType
           (Ast.LongLongIntType,
            [P.clt2mcode "long" ty1;P.clt2mcode "long" ty2;
              P.clt2mcode "int" ty3])) )
-# 42878 "parser_cocci_menhir.ml"
+# 42994 "parser_cocci_menhir.ml"
             
           in
           
-# 723 "parser_cocci_menhir.mly"
+# 749 "parser_cocci_menhir.mly"
                     ( ty )
-# 42884 "parser_cocci_menhir.ml"
+# 43000 "parser_cocci_menhir.ml"
           
         in
         let cv =
           
 # 39 "standard.mly"
     ( None )
-# 42891 "parser_cocci_menhir.ml"
+# 43007 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 42897 "parser_cocci_menhir.ml"
+# 43013 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -42918,9 +43034,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty00 : (
-# 118 "parser_cocci_menhir.mly"
+# 144 "parser_cocci_menhir.mly"
       (Data.clt)
-# 42924 "parser_cocci_menhir.ml"
+# 43040 "parser_cocci_menhir.ml"
         ) = Obj.magic ty00 in
         let _startpos = _startpos_ty00_ in
         let _endpos = _endpos_m_ in
@@ -42929,28 +43045,28 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty = ty0 in
             
-# 678 "parser_cocci_menhir.mly"
+# 704 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.VoidType,[P.clt2mcode "void" ty])) )
-# 42935 "parser_cocci_menhir.ml"
+# 43051 "parser_cocci_menhir.ml"
             
           in
           
-# 724 "parser_cocci_menhir.mly"
+# 750 "parser_cocci_menhir.mly"
                         ( ty )
-# 42941 "parser_cocci_menhir.ml"
+# 43057 "parser_cocci_menhir.ml"
           
         in
         let cv =
           
 # 39 "standard.mly"
     ( None )
-# 42948 "parser_cocci_menhir.ml"
+# 43064 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 42954 "parser_cocci_menhir.ml"
+# 43070 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -42980,14 +43096,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty200 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 42986 "parser_cocci_menhir.ml"
+# 43102 "parser_cocci_menhir.ml"
         ) = Obj.magic ty200 in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 42991 "parser_cocci_menhir.ml"
+# 43107 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
         let _startpos = _startpos_ty100_ in
         let _endpos = _endpos_m_ in
@@ -42998,31 +43114,31 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let ty2 = ty20 in
             let ty1 = ty10 in
             
-# 680 "parser_cocci_menhir.mly"
+# 706 "parser_cocci_menhir.mly"
     ( Ast0.wrap
        (Ast0.BaseType
           (Ast.LongDoubleType,
            [P.clt2mcode "long" ty1;P.clt2mcode "double" ty2])) )
-# 43007 "parser_cocci_menhir.ml"
+# 43123 "parser_cocci_menhir.ml"
             
           in
           
-# 724 "parser_cocci_menhir.mly"
+# 750 "parser_cocci_menhir.mly"
                         ( ty )
-# 43013 "parser_cocci_menhir.ml"
+# 43129 "parser_cocci_menhir.ml"
           
         in
         let cv =
           
 # 39 "standard.mly"
     ( None )
-# 43020 "parser_cocci_menhir.ml"
+# 43136 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 43026 "parser_cocci_menhir.ml"
+# 43142 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -43047,9 +43163,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty00 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 43053 "parser_cocci_menhir.ml"
+# 43169 "parser_cocci_menhir.ml"
         ) = Obj.magic ty00 in
         let _startpos = _startpos_ty00_ in
         let _endpos = _endpos_m_ in
@@ -43058,28 +43174,28 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty = ty0 in
             
-# 685 "parser_cocci_menhir.mly"
+# 711 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.DoubleType,[P.clt2mcode "double" ty])) )
-# 43064 "parser_cocci_menhir.ml"
+# 43180 "parser_cocci_menhir.ml"
             
           in
           
-# 724 "parser_cocci_menhir.mly"
+# 750 "parser_cocci_menhir.mly"
                         ( ty )
-# 43070 "parser_cocci_menhir.ml"
+# 43186 "parser_cocci_menhir.ml"
           
         in
         let cv =
           
 # 39 "standard.mly"
     ( None )
-# 43077 "parser_cocci_menhir.ml"
+# 43193 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 43083 "parser_cocci_menhir.ml"
+# 43199 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -43104,9 +43220,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty00 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 43110 "parser_cocci_menhir.ml"
+# 43226 "parser_cocci_menhir.ml"
         ) = Obj.magic ty00 in
         let _startpos = _startpos_ty00_ in
         let _endpos = _endpos_m_ in
@@ -43115,28 +43231,28 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty = ty0 in
             
-# 687 "parser_cocci_menhir.mly"
+# 713 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.FloatType,[P.clt2mcode "float" ty])) )
-# 43121 "parser_cocci_menhir.ml"
+# 43237 "parser_cocci_menhir.ml"
             
           in
           
-# 724 "parser_cocci_menhir.mly"
+# 750 "parser_cocci_menhir.mly"
                         ( ty )
-# 43127 "parser_cocci_menhir.ml"
+# 43243 "parser_cocci_menhir.ml"
           
         in
         let cv =
           
 # 39 "standard.mly"
     ( None )
-# 43134 "parser_cocci_menhir.ml"
+# 43250 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 43140 "parser_cocci_menhir.ml"
+# 43256 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -43161,9 +43277,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty00 : (
-# 117 "parser_cocci_menhir.mly"
+# 143 "parser_cocci_menhir.mly"
       (Data.clt)
-# 43167 "parser_cocci_menhir.ml"
+# 43283 "parser_cocci_menhir.ml"
         ) = Obj.magic ty00 in
         let _startpos = _startpos_ty00_ in
         let _endpos = _endpos_m_ in
@@ -43172,28 +43288,28 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty = ty0 in
             
-# 689 "parser_cocci_menhir.mly"
+# 715 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.SizeType,[P.clt2mcode "size_t" ty])) )
-# 43178 "parser_cocci_menhir.ml"
+# 43294 "parser_cocci_menhir.ml"
             
           in
           
-# 724 "parser_cocci_menhir.mly"
+# 750 "parser_cocci_menhir.mly"
                         ( ty )
-# 43184 "parser_cocci_menhir.ml"
+# 43300 "parser_cocci_menhir.ml"
           
         in
         let cv =
           
 # 39 "standard.mly"
     ( None )
-# 43191 "parser_cocci_menhir.ml"
+# 43307 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 43197 "parser_cocci_menhir.ml"
+# 43313 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -43218,9 +43334,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty00 : (
-# 117 "parser_cocci_menhir.mly"
+# 143 "parser_cocci_menhir.mly"
       (Data.clt)
-# 43224 "parser_cocci_menhir.ml"
+# 43340 "parser_cocci_menhir.ml"
         ) = Obj.magic ty00 in
         let _startpos = _startpos_ty00_ in
         let _endpos = _endpos_m_ in
@@ -43229,28 +43345,28 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty = ty0 in
             
-# 691 "parser_cocci_menhir.mly"
+# 717 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.SSizeType,[P.clt2mcode "ssize_t" ty])) )
-# 43235 "parser_cocci_menhir.ml"
+# 43351 "parser_cocci_menhir.ml"
             
           in
           
-# 724 "parser_cocci_menhir.mly"
+# 750 "parser_cocci_menhir.mly"
                         ( ty )
-# 43241 "parser_cocci_menhir.ml"
+# 43357 "parser_cocci_menhir.ml"
           
         in
         let cv =
           
 # 39 "standard.mly"
     ( None )
-# 43248 "parser_cocci_menhir.ml"
+# 43364 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 43254 "parser_cocci_menhir.ml"
+# 43370 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -43275,9 +43391,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty00 : (
-# 117 "parser_cocci_menhir.mly"
+# 143 "parser_cocci_menhir.mly"
       (Data.clt)
-# 43281 "parser_cocci_menhir.ml"
+# 43397 "parser_cocci_menhir.ml"
         ) = Obj.magic ty00 in
         let _startpos = _startpos_ty00_ in
         let _endpos = _endpos_m_ in
@@ -43286,28 +43402,28 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty = ty0 in
             
-# 693 "parser_cocci_menhir.mly"
+# 719 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.PtrDiffType,[P.clt2mcode "ptrdiff_t" ty])) )
-# 43292 "parser_cocci_menhir.ml"
+# 43408 "parser_cocci_menhir.ml"
             
           in
           
-# 724 "parser_cocci_menhir.mly"
+# 750 "parser_cocci_menhir.mly"
                         ( ty )
-# 43298 "parser_cocci_menhir.ml"
+# 43414 "parser_cocci_menhir.ml"
           
         in
         let cv =
           
 # 39 "standard.mly"
     ( None )
-# 43305 "parser_cocci_menhir.ml"
+# 43421 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 43311 "parser_cocci_menhir.ml"
+# 43427 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -43338,9 +43454,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let m : 'tv_list_TMul_ = Obj.magic m in
         let i00 : 'tv_ident = Obj.magic i00 in
         let s00 : (
-# 118 "parser_cocci_menhir.mly"
+# 144 "parser_cocci_menhir.mly"
       (Data.clt)
-# 43344 "parser_cocci_menhir.ml"
+# 43460 "parser_cocci_menhir.ml"
         ) = Obj.magic s00 in
         let _startpos = _startpos_s00_ in
         let _endpos = _endpos_m_ in
@@ -43351,28 +43467,28 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let i = i0 in
             let s = s0 in
             
-# 695 "parser_cocci_menhir.mly"
+# 721 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.EnumName(P.clt2mcode "enum" s, Some i)) )
-# 43357 "parser_cocci_menhir.ml"
+# 43473 "parser_cocci_menhir.ml"
             
           in
           
-# 724 "parser_cocci_menhir.mly"
+# 750 "parser_cocci_menhir.mly"
                         ( ty )
-# 43363 "parser_cocci_menhir.ml"
+# 43479 "parser_cocci_menhir.ml"
           
         in
         let cv =
           
 # 39 "standard.mly"
     ( None )
-# 43370 "parser_cocci_menhir.ml"
+# 43486 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 43376 "parser_cocci_menhir.ml"
+# 43492 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -43412,20 +43528,20 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let r00 : (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
-# 43418 "parser_cocci_menhir.ml"
+# 43534 "parser_cocci_menhir.ml"
         ) = Obj.magic r00 in
         let ids00 : 'tv_enum_decl_list = Obj.magic ids00 in
         let l00 : (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
-# 43424 "parser_cocci_menhir.ml"
+# 43540 "parser_cocci_menhir.ml"
         ) = Obj.magic l00 in
         let s00 : (
-# 118 "parser_cocci_menhir.mly"
+# 144 "parser_cocci_menhir.mly"
       (Data.clt)
-# 43429 "parser_cocci_menhir.ml"
+# 43545 "parser_cocci_menhir.ml"
         ) = Obj.magic s00 in
         let _startpos = _startpos_s00_ in
         let _endpos = _endpos_m_ in
@@ -43443,35 +43559,35 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
               
 # 39 "standard.mly"
     ( None )
-# 43447 "parser_cocci_menhir.ml"
+# 43563 "parser_cocci_menhir.ml"
               
             in
             
-# 697 "parser_cocci_menhir.mly"
+# 723 "parser_cocci_menhir.mly"
     ( (if i = None && !Data.in_iso
     then failwith "enums must be named in the iso file");
       Ast0.wrap(Ast0.EnumDef(Ast0.wrap(Ast0.EnumName(P.clt2mcode "enum" s, i)),
                             P.clt2mcode "{" l, ids, P.clt2mcode "}" r)) )
-# 43456 "parser_cocci_menhir.ml"
+# 43572 "parser_cocci_menhir.ml"
             
           in
           
-# 724 "parser_cocci_menhir.mly"
+# 750 "parser_cocci_menhir.mly"
                         ( ty )
-# 43462 "parser_cocci_menhir.ml"
+# 43578 "parser_cocci_menhir.ml"
           
         in
         let cv =
           
 # 39 "standard.mly"
     ( None )
-# 43469 "parser_cocci_menhir.ml"
+# 43585 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 43475 "parser_cocci_menhir.ml"
+# 43591 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -43516,21 +43632,21 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let r00 : (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
-# 43522 "parser_cocci_menhir.ml"
+# 43638 "parser_cocci_menhir.ml"
         ) = Obj.magic r00 in
         let ids00 : 'tv_enum_decl_list = Obj.magic ids00 in
         let l00 : (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
-# 43528 "parser_cocci_menhir.ml"
+# 43644 "parser_cocci_menhir.ml"
         ) = Obj.magic l00 in
         let x000 : 'tv_ident = Obj.magic x000 in
         let s00 : (
-# 118 "parser_cocci_menhir.mly"
+# 144 "parser_cocci_menhir.mly"
       (Data.clt)
-# 43534 "parser_cocci_menhir.ml"
+# 43650 "parser_cocci_menhir.ml"
         ) = Obj.magic s00 in
         let _startpos = _startpos_s00_ in
         let _endpos = _endpos_m_ in
@@ -43551,35 +43667,35 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
               
 # 41 "standard.mly"
     ( Some x )
-# 43555 "parser_cocci_menhir.ml"
+# 43671 "parser_cocci_menhir.ml"
               
             in
             
-# 697 "parser_cocci_menhir.mly"
+# 723 "parser_cocci_menhir.mly"
     ( (if i = None && !Data.in_iso
     then failwith "enums must be named in the iso file");
       Ast0.wrap(Ast0.EnumDef(Ast0.wrap(Ast0.EnumName(P.clt2mcode "enum" s, i)),
                             P.clt2mcode "{" l, ids, P.clt2mcode "}" r)) )
-# 43564 "parser_cocci_menhir.ml"
+# 43680 "parser_cocci_menhir.ml"
             
           in
           
-# 724 "parser_cocci_menhir.mly"
+# 750 "parser_cocci_menhir.mly"
                         ( ty )
-# 43570 "parser_cocci_menhir.ml"
+# 43686 "parser_cocci_menhir.ml"
           
         in
         let cv =
           
 # 39 "standard.mly"
     ( None )
-# 43577 "parser_cocci_menhir.ml"
+# 43693 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 43583 "parser_cocci_menhir.ml"
+# 43699 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -43619,28 +43735,28 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let i = i0 in
             let s = s0 in
             
-# 702 "parser_cocci_menhir.mly"
+# 728 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.StructUnionName(s, Some i)) )
-# 43625 "parser_cocci_menhir.ml"
+# 43741 "parser_cocci_menhir.ml"
             
           in
           
-# 724 "parser_cocci_menhir.mly"
+# 750 "parser_cocci_menhir.mly"
                         ( ty )
-# 43631 "parser_cocci_menhir.ml"
+# 43747 "parser_cocci_menhir.ml"
           
         in
         let cv =
           
 # 39 "standard.mly"
     ( None )
-# 43638 "parser_cocci_menhir.ml"
+# 43754 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 43644 "parser_cocci_menhir.ml"
+# 43760 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -43680,15 +43796,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let r00 : (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
-# 43686 "parser_cocci_menhir.ml"
+# 43802 "parser_cocci_menhir.ml"
         ) = Obj.magic r00 in
         let d00 : 'tv_struct_decl_list = Obj.magic d00 in
         let l00 : (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
-# 43692 "parser_cocci_menhir.ml"
+# 43808 "parser_cocci_menhir.ml"
         ) = Obj.magic l00 in
         let s00 : 'tv_struct_or_union = Obj.magic s00 in
         let _startpos = _startpos_s00_ in
@@ -43707,36 +43823,36 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
               
 # 39 "standard.mly"
     ( None )
-# 43711 "parser_cocci_menhir.ml"
+# 43827 "parser_cocci_menhir.ml"
               
             in
             
-# 705 "parser_cocci_menhir.mly"
+# 731 "parser_cocci_menhir.mly"
     ( (if i = None && !Data.in_iso
     then failwith "structures must be named in the iso file");
       Ast0.wrap(Ast0.StructUnionDef(Ast0.wrap(Ast0.StructUnionName(s, i)),
                                    P.clt2mcode "{" l,
                                    d, P.clt2mcode "}" r)) )
-# 43721 "parser_cocci_menhir.ml"
+# 43837 "parser_cocci_menhir.ml"
             
           in
           
-# 724 "parser_cocci_menhir.mly"
+# 750 "parser_cocci_menhir.mly"
                         ( ty )
-# 43727 "parser_cocci_menhir.ml"
+# 43843 "parser_cocci_menhir.ml"
           
         in
         let cv =
           
 # 39 "standard.mly"
     ( None )
-# 43734 "parser_cocci_menhir.ml"
+# 43850 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 43740 "parser_cocci_menhir.ml"
+# 43856 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -43781,15 +43897,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let r00 : (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
-# 43787 "parser_cocci_menhir.ml"
+# 43903 "parser_cocci_menhir.ml"
         ) = Obj.magic r00 in
         let d00 : 'tv_struct_decl_list = Obj.magic d00 in
         let l00 : (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
-# 43793 "parser_cocci_menhir.ml"
+# 43909 "parser_cocci_menhir.ml"
         ) = Obj.magic l00 in
         let x000 : 'tv_type_ident = Obj.magic x000 in
         let s00 : 'tv_struct_or_union = Obj.magic s00 in
@@ -43812,36 +43928,36 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
               
 # 41 "standard.mly"
     ( Some x )
-# 43816 "parser_cocci_menhir.ml"
+# 43932 "parser_cocci_menhir.ml"
               
             in
             
-# 705 "parser_cocci_menhir.mly"
+# 731 "parser_cocci_menhir.mly"
     ( (if i = None && !Data.in_iso
     then failwith "structures must be named in the iso file");
       Ast0.wrap(Ast0.StructUnionDef(Ast0.wrap(Ast0.StructUnionName(s, i)),
                                    P.clt2mcode "{" l,
                                    d, P.clt2mcode "}" r)) )
-# 43826 "parser_cocci_menhir.ml"
+# 43942 "parser_cocci_menhir.ml"
             
           in
           
-# 724 "parser_cocci_menhir.mly"
+# 750 "parser_cocci_menhir.mly"
                         ( ty )
-# 43832 "parser_cocci_menhir.ml"
+# 43948 "parser_cocci_menhir.ml"
           
         in
         let cv =
           
 # 39 "standard.mly"
     ( None )
-# 43839 "parser_cocci_menhir.ml"
+# 43955 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 43845 "parser_cocci_menhir.ml"
+# 43961 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -43881,20 +43997,20 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let r00 : (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
-# 43887 "parser_cocci_menhir.ml"
+# 44003 "parser_cocci_menhir.ml"
         ) = Obj.magic r00 in
         let d00 : 'tv_struct_decl_list = Obj.magic d00 in
         let l00 : (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
-# 43893 "parser_cocci_menhir.ml"
+# 44009 "parser_cocci_menhir.ml"
         ) = Obj.magic l00 in
         let s00 : (
-# 134 "parser_cocci_menhir.mly"
+# 160 "parser_cocci_menhir.mly"
        (Parse_aux.info)
-# 43898 "parser_cocci_menhir.ml"
+# 44014 "parser_cocci_menhir.ml"
         ) = Obj.magic s00 in
         let _startpos = _startpos_s00_ in
         let _endpos = _endpos_m_ in
@@ -43909,30 +44025,30 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let l = l0 in
             let s = s0 in
             
-# 711 "parser_cocci_menhir.mly"
+# 737 "parser_cocci_menhir.mly"
     ( let (nm,pure,clt) = s in
     let ty = Ast0.wrap(Ast0.MetaType(P.clt2mcode nm clt,pure)) in
     Ast0.wrap(Ast0.StructUnionDef(ty,P.clt2mcode "{" l,d,P.clt2mcode "}" r)) )
-# 43917 "parser_cocci_menhir.ml"
+# 44033 "parser_cocci_menhir.ml"
             
           in
           
-# 724 "parser_cocci_menhir.mly"
+# 750 "parser_cocci_menhir.mly"
                         ( ty )
-# 43923 "parser_cocci_menhir.ml"
+# 44039 "parser_cocci_menhir.ml"
           
         in
         let cv =
           
 # 39 "standard.mly"
     ( None )
-# 43930 "parser_cocci_menhir.ml"
+# 44046 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 43936 "parser_cocci_menhir.ml"
+# 44052 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -43957,9 +44073,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let p00 : (
-# 127 "parser_cocci_menhir.mly"
+# 153 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 43963 "parser_cocci_menhir.ml"
+# 44079 "parser_cocci_menhir.ml"
         ) = Obj.magic p00 in
         let _startpos = _startpos_p00_ in
         let _endpos = _endpos_m_ in
@@ -43968,28 +44084,28 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let p = p0 in
             
-# 715 "parser_cocci_menhir.mly"
+# 741 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.TypeName(P.id2mcode p)) )
-# 43974 "parser_cocci_menhir.ml"
+# 44090 "parser_cocci_menhir.ml"
             
           in
           
-# 724 "parser_cocci_menhir.mly"
+# 750 "parser_cocci_menhir.mly"
                         ( ty )
-# 43980 "parser_cocci_menhir.ml"
+# 44096 "parser_cocci_menhir.ml"
           
         in
         let cv =
           
 # 39 "standard.mly"
     ( None )
-# 43987 "parser_cocci_menhir.ml"
+# 44103 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 43993 "parser_cocci_menhir.ml"
+# 44109 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -44024,14 +44140,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty00 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 44030 "parser_cocci_menhir.ml"
+# 44146 "parser_cocci_menhir.ml"
         ) = Obj.magic ty00 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
-# 44035 "parser_cocci_menhir.ml"
+# 44151 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
         let x0 : 'tv_const_vol = Obj.magic x0 in
         let _startpos = _startpos_x0_ in
@@ -44042,15 +44158,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty = ty0 in
             
-# 638 "parser_cocci_menhir.mly"
+# 664 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.CharType,[P.clt2mcode "char" ty])) )
-# 44048 "parser_cocci_menhir.ml"
+# 44164 "parser_cocci_menhir.ml"
             
           in
           
-# 720 "parser_cocci_menhir.mly"
+# 746 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Signed r,Some ty)) )
-# 44054 "parser_cocci_menhir.ml"
+# 44170 "parser_cocci_menhir.ml"
           
         in
         let cv =
@@ -44058,13 +44174,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 44062 "parser_cocci_menhir.ml"
+# 44178 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 44068 "parser_cocci_menhir.ml"
+# 44184 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -44099,14 +44215,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty00 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 44105 "parser_cocci_menhir.ml"
+# 44221 "parser_cocci_menhir.ml"
         ) = Obj.magic ty00 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
-# 44110 "parser_cocci_menhir.ml"
+# 44226 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
         let x0 : 'tv_const_vol = Obj.magic x0 in
         let _startpos = _startpos_x0_ in
@@ -44117,15 +44233,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty = ty0 in
             
-# 640 "parser_cocci_menhir.mly"
+# 666 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.ShortType,[P.clt2mcode "short" ty])) )
-# 44123 "parser_cocci_menhir.ml"
+# 44239 "parser_cocci_menhir.ml"
             
           in
           
-# 720 "parser_cocci_menhir.mly"
+# 746 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Signed r,Some ty)) )
-# 44129 "parser_cocci_menhir.ml"
+# 44245 "parser_cocci_menhir.ml"
           
         in
         let cv =
@@ -44133,13 +44249,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 44137 "parser_cocci_menhir.ml"
+# 44253 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 44143 "parser_cocci_menhir.ml"
+# 44259 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -44179,19 +44295,19 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty200 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 44185 "parser_cocci_menhir.ml"
+# 44301 "parser_cocci_menhir.ml"
         ) = Obj.magic ty200 in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 44190 "parser_cocci_menhir.ml"
+# 44306 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
-# 44195 "parser_cocci_menhir.ml"
+# 44311 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
         let x0 : 'tv_const_vol = Obj.magic x0 in
         let _startpos = _startpos_x0_ in
@@ -44204,17 +44320,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let ty2 = ty20 in
             let ty1 = ty10 in
             
-# 642 "parser_cocci_menhir.mly"
+# 668 "parser_cocci_menhir.mly"
     ( Ast0.wrap
        (Ast0.BaseType
           (Ast.ShortIntType,[P.clt2mcode "short" ty1;P.clt2mcode "int" ty2])) )
-# 44212 "parser_cocci_menhir.ml"
+# 44328 "parser_cocci_menhir.ml"
             
           in
           
-# 720 "parser_cocci_menhir.mly"
+# 746 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Signed r,Some ty)) )
-# 44218 "parser_cocci_menhir.ml"
+# 44334 "parser_cocci_menhir.ml"
           
         in
         let cv =
@@ -44222,13 +44338,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 44226 "parser_cocci_menhir.ml"
+# 44342 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 44232 "parser_cocci_menhir.ml"
+# 44348 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -44263,14 +44379,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty00 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 44269 "parser_cocci_menhir.ml"
+# 44385 "parser_cocci_menhir.ml"
         ) = Obj.magic ty00 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
-# 44274 "parser_cocci_menhir.ml"
+# 44390 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
         let x0 : 'tv_const_vol = Obj.magic x0 in
         let _startpos = _startpos_x0_ in
@@ -44281,15 +44397,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty = ty0 in
             
-# 646 "parser_cocci_menhir.mly"
+# 672 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.IntType,[P.clt2mcode "int" ty])) )
-# 44287 "parser_cocci_menhir.ml"
+# 44403 "parser_cocci_menhir.ml"
             
           in
           
-# 720 "parser_cocci_menhir.mly"
+# 746 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Signed r,Some ty)) )
-# 44293 "parser_cocci_menhir.ml"
+# 44409 "parser_cocci_menhir.ml"
           
         in
         let cv =
@@ -44297,13 +44413,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 44301 "parser_cocci_menhir.ml"
+# 44417 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 44307 "parser_cocci_menhir.ml"
+# 44423 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -44338,14 +44454,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let p00 : (
-# 134 "parser_cocci_menhir.mly"
+# 160 "parser_cocci_menhir.mly"
        (Parse_aux.info)
-# 44344 "parser_cocci_menhir.ml"
+# 44460 "parser_cocci_menhir.ml"
         ) = Obj.magic p00 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
-# 44349 "parser_cocci_menhir.ml"
+# 44465 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
         let x0 : 'tv_const_vol = Obj.magic x0 in
         let _startpos = _startpos_x0_ in
@@ -44356,16 +44472,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let p = p0 in
             
-# 648 "parser_cocci_menhir.mly"
+# 674 "parser_cocci_menhir.mly"
     ( let (nm,pure,clt) = p in
       Ast0.wrap(Ast0.MetaType(P.clt2mcode nm clt,pure)) )
-# 44363 "parser_cocci_menhir.ml"
+# 44479 "parser_cocci_menhir.ml"
             
           in
           
-# 720 "parser_cocci_menhir.mly"
+# 746 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Signed r,Some ty)) )
-# 44369 "parser_cocci_menhir.ml"
+# 44485 "parser_cocci_menhir.ml"
           
         in
         let cv =
@@ -44373,13 +44489,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 44377 "parser_cocci_menhir.ml"
+# 44493 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 44383 "parser_cocci_menhir.ml"
+# 44499 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -44423,19 +44539,19 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let p00 : (
-# 127 "parser_cocci_menhir.mly"
+# 153 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 44429 "parser_cocci_menhir.ml"
+# 44545 "parser_cocci_menhir.ml"
         ) = Obj.magic p00 in
         let r00 : (
-# 114 "parser_cocci_menhir.mly"
+# 140 "parser_cocci_menhir.mly"
       (string)
-# 44434 "parser_cocci_menhir.ml"
+# 44550 "parser_cocci_menhir.ml"
         ) = Obj.magic r00 in
         let r1 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
-# 44439 "parser_cocci_menhir.ml"
+# 44555 "parser_cocci_menhir.ml"
         ) = Obj.magic r1 in
         let x0 : 'tv_const_vol = Obj.magic x0 in
         let _startpos = _startpos_x0_ in
@@ -44448,20 +44564,20 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let p = p0 in
             let r = r0 in
             
-# 651 "parser_cocci_menhir.mly"
+# 677 "parser_cocci_menhir.mly"
     ( let nm = (r,P.id2name p) in
     (* this is only possible when we are in a metavar decl.  Otherwise,
        it will be represented already as a MetaType *)
     let _ = P.check_meta(Ast.MetaTypeDecl(Ast.NONE,nm)) in
     Ast0.wrap(Ast0.MetaType(P.clt2mcode nm (P.id2clt p),
                            Ast0.Impure (*will be ignored*))) )
-# 44459 "parser_cocci_menhir.ml"
+# 44575 "parser_cocci_menhir.ml"
             
           in
           
-# 720 "parser_cocci_menhir.mly"
+# 746 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Signed r,Some ty)) )
-# 44465 "parser_cocci_menhir.ml"
+# 44581 "parser_cocci_menhir.ml"
           
         in
         let cv =
@@ -44469,13 +44585,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 44473 "parser_cocci_menhir.ml"
+# 44589 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 44479 "parser_cocci_menhir.ml"
+# 44595 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -44510,14 +44626,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 44516 "parser_cocci_menhir.ml"
+# 44632 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
-# 44521 "parser_cocci_menhir.ml"
+# 44637 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
         let x0 : 'tv_const_vol = Obj.magic x0 in
         let _startpos = _startpos_x0_ in
@@ -44528,15 +44644,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty1 = ty10 in
             
-# 658 "parser_cocci_menhir.mly"
+# 684 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.LongType,[P.clt2mcode "long" ty1])) )
-# 44534 "parser_cocci_menhir.ml"
+# 44650 "parser_cocci_menhir.ml"
             
           in
           
-# 720 "parser_cocci_menhir.mly"
+# 746 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Signed r,Some ty)) )
-# 44540 "parser_cocci_menhir.ml"
+# 44656 "parser_cocci_menhir.ml"
           
         in
         let cv =
@@ -44544,13 +44660,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 44548 "parser_cocci_menhir.ml"
+# 44664 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 44554 "parser_cocci_menhir.ml"
+# 44670 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -44590,19 +44706,19 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty200 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 44596 "parser_cocci_menhir.ml"
+# 44712 "parser_cocci_menhir.ml"
         ) = Obj.magic ty200 in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 44601 "parser_cocci_menhir.ml"
+# 44717 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
-# 44606 "parser_cocci_menhir.ml"
+# 44722 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
         let x0 : 'tv_const_vol = Obj.magic x0 in
         let _startpos = _startpos_x0_ in
@@ -44615,17 +44731,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let ty2 = ty20 in
             let ty1 = ty10 in
             
-# 660 "parser_cocci_menhir.mly"
+# 686 "parser_cocci_menhir.mly"
     ( Ast0.wrap
        (Ast0.BaseType
           (Ast.LongIntType,[P.clt2mcode "long" ty1;P.clt2mcode "int" ty2])) )
-# 44623 "parser_cocci_menhir.ml"
+# 44739 "parser_cocci_menhir.ml"
             
           in
           
-# 720 "parser_cocci_menhir.mly"
+# 746 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Signed r,Some ty)) )
-# 44629 "parser_cocci_menhir.ml"
+# 44745 "parser_cocci_menhir.ml"
           
         in
         let cv =
@@ -44633,13 +44749,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 44637 "parser_cocci_menhir.ml"
+# 44753 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 44643 "parser_cocci_menhir.ml"
+# 44759 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -44679,19 +44795,19 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty200 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 44685 "parser_cocci_menhir.ml"
+# 44801 "parser_cocci_menhir.ml"
         ) = Obj.magic ty200 in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 44690 "parser_cocci_menhir.ml"
+# 44806 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
-# 44695 "parser_cocci_menhir.ml"
+# 44811 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
         let x0 : 'tv_const_vol = Obj.magic x0 in
         let _startpos = _startpos_x0_ in
@@ -44704,18 +44820,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let ty2 = ty20 in
             let ty1 = ty10 in
             
-# 664 "parser_cocci_menhir.mly"
+# 690 "parser_cocci_menhir.mly"
     ( Ast0.wrap
        (Ast0.BaseType
           (Ast.LongLongType,
            [P.clt2mcode "long" ty1;P.clt2mcode "long" ty2])) )
-# 44713 "parser_cocci_menhir.ml"
+# 44829 "parser_cocci_menhir.ml"
             
           in
           
-# 720 "parser_cocci_menhir.mly"
+# 746 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Signed r,Some ty)) )
-# 44719 "parser_cocci_menhir.ml"
+# 44835 "parser_cocci_menhir.ml"
           
         in
         let cv =
@@ -44723,13 +44839,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 44727 "parser_cocci_menhir.ml"
+# 44843 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 44733 "parser_cocci_menhir.ml"
+# 44849 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -44774,24 +44890,24 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty300 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 44780 "parser_cocci_menhir.ml"
+# 44896 "parser_cocci_menhir.ml"
         ) = Obj.magic ty300 in
         let ty200 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 44785 "parser_cocci_menhir.ml"
+# 44901 "parser_cocci_menhir.ml"
         ) = Obj.magic ty200 in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 44790 "parser_cocci_menhir.ml"
+# 44906 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
-# 44795 "parser_cocci_menhir.ml"
+# 44911 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
         let x0 : 'tv_const_vol = Obj.magic x0 in
         let _startpos = _startpos_x0_ in
@@ -44806,19 +44922,19 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let ty2 = ty20 in
             let ty1 = ty10 in
             
-# 669 "parser_cocci_menhir.mly"
+# 695 "parser_cocci_menhir.mly"
     ( Ast0.wrap
        (Ast0.BaseType
           (Ast.LongLongIntType,
            [P.clt2mcode "long" ty1;P.clt2mcode "long" ty2;
              P.clt2mcode "int" ty3])) )
-# 44816 "parser_cocci_menhir.ml"
+# 44932 "parser_cocci_menhir.ml"
             
           in
           
-# 720 "parser_cocci_menhir.mly"
+# 746 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Signed r,Some ty)) )
-# 44822 "parser_cocci_menhir.ml"
+# 44938 "parser_cocci_menhir.ml"
           
         in
         let cv =
@@ -44826,13 +44942,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 44830 "parser_cocci_menhir.ml"
+# 44946 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 44836 "parser_cocci_menhir.ml"
+# 44952 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -44867,14 +44983,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty00 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 44873 "parser_cocci_menhir.ml"
+# 44989 "parser_cocci_menhir.ml"
         ) = Obj.magic ty00 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
-# 44878 "parser_cocci_menhir.ml"
+# 44994 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
         let x0 : 'tv_const_vol = Obj.magic x0 in
         let _startpos = _startpos_x0_ in
@@ -44885,15 +45001,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty = ty0 in
             
-# 638 "parser_cocci_menhir.mly"
+# 664 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.CharType,[P.clt2mcode "char" ty])) )
-# 44891 "parser_cocci_menhir.ml"
+# 45007 "parser_cocci_menhir.ml"
             
           in
           
-# 722 "parser_cocci_menhir.mly"
+# 748 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Unsigned r,Some ty)) )
-# 44897 "parser_cocci_menhir.ml"
+# 45013 "parser_cocci_menhir.ml"
           
         in
         let cv =
@@ -44901,13 +45017,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 44905 "parser_cocci_menhir.ml"
+# 45021 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 44911 "parser_cocci_menhir.ml"
+# 45027 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -44942,14 +45058,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty00 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 44948 "parser_cocci_menhir.ml"
+# 45064 "parser_cocci_menhir.ml"
         ) = Obj.magic ty00 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
-# 44953 "parser_cocci_menhir.ml"
+# 45069 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
         let x0 : 'tv_const_vol = Obj.magic x0 in
         let _startpos = _startpos_x0_ in
@@ -44960,15 +45076,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty = ty0 in
             
-# 640 "parser_cocci_menhir.mly"
+# 666 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.ShortType,[P.clt2mcode "short" ty])) )
-# 44966 "parser_cocci_menhir.ml"
+# 45082 "parser_cocci_menhir.ml"
             
           in
           
-# 722 "parser_cocci_menhir.mly"
+# 748 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Unsigned r,Some ty)) )
-# 44972 "parser_cocci_menhir.ml"
+# 45088 "parser_cocci_menhir.ml"
           
         in
         let cv =
@@ -44976,13 +45092,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 44980 "parser_cocci_menhir.ml"
+# 45096 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 44986 "parser_cocci_menhir.ml"
+# 45102 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -45022,19 +45138,19 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty200 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 45028 "parser_cocci_menhir.ml"
+# 45144 "parser_cocci_menhir.ml"
         ) = Obj.magic ty200 in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 45033 "parser_cocci_menhir.ml"
+# 45149 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
-# 45038 "parser_cocci_menhir.ml"
+# 45154 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
         let x0 : 'tv_const_vol = Obj.magic x0 in
         let _startpos = _startpos_x0_ in
@@ -45047,17 +45163,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let ty2 = ty20 in
             let ty1 = ty10 in
             
-# 642 "parser_cocci_menhir.mly"
+# 668 "parser_cocci_menhir.mly"
     ( Ast0.wrap
        (Ast0.BaseType
           (Ast.ShortIntType,[P.clt2mcode "short" ty1;P.clt2mcode "int" ty2])) )
-# 45055 "parser_cocci_menhir.ml"
+# 45171 "parser_cocci_menhir.ml"
             
           in
           
-# 722 "parser_cocci_menhir.mly"
+# 748 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Unsigned r,Some ty)) )
-# 45061 "parser_cocci_menhir.ml"
+# 45177 "parser_cocci_menhir.ml"
           
         in
         let cv =
@@ -45065,13 +45181,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 45069 "parser_cocci_menhir.ml"
+# 45185 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 45075 "parser_cocci_menhir.ml"
+# 45191 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -45106,14 +45222,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty00 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 45112 "parser_cocci_menhir.ml"
+# 45228 "parser_cocci_menhir.ml"
         ) = Obj.magic ty00 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
-# 45117 "parser_cocci_menhir.ml"
+# 45233 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
         let x0 : 'tv_const_vol = Obj.magic x0 in
         let _startpos = _startpos_x0_ in
@@ -45124,15 +45240,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty = ty0 in
             
-# 646 "parser_cocci_menhir.mly"
+# 672 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.IntType,[P.clt2mcode "int" ty])) )
-# 45130 "parser_cocci_menhir.ml"
+# 45246 "parser_cocci_menhir.ml"
             
           in
           
-# 722 "parser_cocci_menhir.mly"
+# 748 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Unsigned r,Some ty)) )
-# 45136 "parser_cocci_menhir.ml"
+# 45252 "parser_cocci_menhir.ml"
           
         in
         let cv =
@@ -45140,13 +45256,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 45144 "parser_cocci_menhir.ml"
+# 45260 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 45150 "parser_cocci_menhir.ml"
+# 45266 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -45181,14 +45297,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let p00 : (
-# 134 "parser_cocci_menhir.mly"
+# 160 "parser_cocci_menhir.mly"
        (Parse_aux.info)
-# 45187 "parser_cocci_menhir.ml"
+# 45303 "parser_cocci_menhir.ml"
         ) = Obj.magic p00 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
-# 45192 "parser_cocci_menhir.ml"
+# 45308 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
         let x0 : 'tv_const_vol = Obj.magic x0 in
         let _startpos = _startpos_x0_ in
@@ -45199,16 +45315,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let p = p0 in
             
-# 648 "parser_cocci_menhir.mly"
+# 674 "parser_cocci_menhir.mly"
     ( let (nm,pure,clt) = p in
       Ast0.wrap(Ast0.MetaType(P.clt2mcode nm clt,pure)) )
-# 45206 "parser_cocci_menhir.ml"
+# 45322 "parser_cocci_menhir.ml"
             
           in
           
-# 722 "parser_cocci_menhir.mly"
+# 748 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Unsigned r,Some ty)) )
-# 45212 "parser_cocci_menhir.ml"
+# 45328 "parser_cocci_menhir.ml"
           
         in
         let cv =
@@ -45216,13 +45332,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 45220 "parser_cocci_menhir.ml"
+# 45336 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 45226 "parser_cocci_menhir.ml"
+# 45342 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -45266,19 +45382,19 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let p00 : (
-# 127 "parser_cocci_menhir.mly"
+# 153 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 45272 "parser_cocci_menhir.ml"
+# 45388 "parser_cocci_menhir.ml"
         ) = Obj.magic p00 in
         let r00 : (
-# 114 "parser_cocci_menhir.mly"
+# 140 "parser_cocci_menhir.mly"
       (string)
-# 45277 "parser_cocci_menhir.ml"
+# 45393 "parser_cocci_menhir.ml"
         ) = Obj.magic r00 in
         let r1 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
-# 45282 "parser_cocci_menhir.ml"
+# 45398 "parser_cocci_menhir.ml"
         ) = Obj.magic r1 in
         let x0 : 'tv_const_vol = Obj.magic x0 in
         let _startpos = _startpos_x0_ in
@@ -45291,20 +45407,20 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let p = p0 in
             let r = r0 in
             
-# 651 "parser_cocci_menhir.mly"
+# 677 "parser_cocci_menhir.mly"
     ( let nm = (r,P.id2name p) in
     (* this is only possible when we are in a metavar decl.  Otherwise,
        it will be represented already as a MetaType *)
     let _ = P.check_meta(Ast.MetaTypeDecl(Ast.NONE,nm)) in
     Ast0.wrap(Ast0.MetaType(P.clt2mcode nm (P.id2clt p),
                            Ast0.Impure (*will be ignored*))) )
-# 45302 "parser_cocci_menhir.ml"
+# 45418 "parser_cocci_menhir.ml"
             
           in
           
-# 722 "parser_cocci_menhir.mly"
+# 748 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Unsigned r,Some ty)) )
-# 45308 "parser_cocci_menhir.ml"
+# 45424 "parser_cocci_menhir.ml"
           
         in
         let cv =
@@ -45312,13 +45428,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 45316 "parser_cocci_menhir.ml"
+# 45432 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 45322 "parser_cocci_menhir.ml"
+# 45438 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -45353,14 +45469,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 45359 "parser_cocci_menhir.ml"
+# 45475 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
-# 45364 "parser_cocci_menhir.ml"
+# 45480 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
         let x0 : 'tv_const_vol = Obj.magic x0 in
         let _startpos = _startpos_x0_ in
@@ -45371,15 +45487,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty1 = ty10 in
             
-# 658 "parser_cocci_menhir.mly"
+# 684 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.LongType,[P.clt2mcode "long" ty1])) )
-# 45377 "parser_cocci_menhir.ml"
+# 45493 "parser_cocci_menhir.ml"
             
           in
           
-# 722 "parser_cocci_menhir.mly"
+# 748 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Unsigned r,Some ty)) )
-# 45383 "parser_cocci_menhir.ml"
+# 45499 "parser_cocci_menhir.ml"
           
         in
         let cv =
@@ -45387,13 +45503,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 45391 "parser_cocci_menhir.ml"
+# 45507 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 45397 "parser_cocci_menhir.ml"
+# 45513 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -45433,19 +45549,19 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty200 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 45439 "parser_cocci_menhir.ml"
+# 45555 "parser_cocci_menhir.ml"
         ) = Obj.magic ty200 in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 45444 "parser_cocci_menhir.ml"
+# 45560 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
-# 45449 "parser_cocci_menhir.ml"
+# 45565 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
         let x0 : 'tv_const_vol = Obj.magic x0 in
         let _startpos = _startpos_x0_ in
@@ -45458,17 +45574,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let ty2 = ty20 in
             let ty1 = ty10 in
             
-# 660 "parser_cocci_menhir.mly"
+# 686 "parser_cocci_menhir.mly"
     ( Ast0.wrap
        (Ast0.BaseType
           (Ast.LongIntType,[P.clt2mcode "long" ty1;P.clt2mcode "int" ty2])) )
-# 45466 "parser_cocci_menhir.ml"
+# 45582 "parser_cocci_menhir.ml"
             
           in
           
-# 722 "parser_cocci_menhir.mly"
+# 748 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Unsigned r,Some ty)) )
-# 45472 "parser_cocci_menhir.ml"
+# 45588 "parser_cocci_menhir.ml"
           
         in
         let cv =
@@ -45476,13 +45592,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 45480 "parser_cocci_menhir.ml"
+# 45596 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 45486 "parser_cocci_menhir.ml"
+# 45602 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -45522,19 +45638,19 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty200 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 45528 "parser_cocci_menhir.ml"
+# 45644 "parser_cocci_menhir.ml"
         ) = Obj.magic ty200 in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 45533 "parser_cocci_menhir.ml"
+# 45649 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
-# 45538 "parser_cocci_menhir.ml"
+# 45654 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
         let x0 : 'tv_const_vol = Obj.magic x0 in
         let _startpos = _startpos_x0_ in
@@ -45547,18 +45663,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let ty2 = ty20 in
             let ty1 = ty10 in
             
-# 664 "parser_cocci_menhir.mly"
+# 690 "parser_cocci_menhir.mly"
     ( Ast0.wrap
        (Ast0.BaseType
           (Ast.LongLongType,
            [P.clt2mcode "long" ty1;P.clt2mcode "long" ty2])) )
-# 45556 "parser_cocci_menhir.ml"
+# 45672 "parser_cocci_menhir.ml"
             
           in
           
-# 722 "parser_cocci_menhir.mly"
+# 748 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Unsigned r,Some ty)) )
-# 45562 "parser_cocci_menhir.ml"
+# 45678 "parser_cocci_menhir.ml"
           
         in
         let cv =
@@ -45566,13 +45682,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 45570 "parser_cocci_menhir.ml"
+# 45686 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 45576 "parser_cocci_menhir.ml"
+# 45692 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -45617,24 +45733,24 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty300 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 45623 "parser_cocci_menhir.ml"
+# 45739 "parser_cocci_menhir.ml"
         ) = Obj.magic ty300 in
         let ty200 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 45628 "parser_cocci_menhir.ml"
+# 45744 "parser_cocci_menhir.ml"
         ) = Obj.magic ty200 in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 45633 "parser_cocci_menhir.ml"
+# 45749 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
         let r0 : (
-# 119 "parser_cocci_menhir.mly"
+# 145 "parser_cocci_menhir.mly"
       (Data.clt)
-# 45638 "parser_cocci_menhir.ml"
+# 45754 "parser_cocci_menhir.ml"
         ) = Obj.magic r0 in
         let x0 : 'tv_const_vol = Obj.magic x0 in
         let _startpos = _startpos_x0_ in
@@ -45649,19 +45765,19 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let ty2 = ty20 in
             let ty1 = ty10 in
             
-# 669 "parser_cocci_menhir.mly"
+# 695 "parser_cocci_menhir.mly"
     ( Ast0.wrap
        (Ast0.BaseType
           (Ast.LongLongIntType,
            [P.clt2mcode "long" ty1;P.clt2mcode "long" ty2;
              P.clt2mcode "int" ty3])) )
-# 45659 "parser_cocci_menhir.ml"
+# 45775 "parser_cocci_menhir.ml"
             
           in
           
-# 722 "parser_cocci_menhir.mly"
+# 748 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.Signed(P.clt2mcode Ast.Unsigned r,Some ty)) )
-# 45665 "parser_cocci_menhir.ml"
+# 45781 "parser_cocci_menhir.ml"
           
         in
         let cv =
@@ -45669,13 +45785,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 45673 "parser_cocci_menhir.ml"
+# 45789 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 45679 "parser_cocci_menhir.ml"
+# 45795 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -45705,9 +45821,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty00 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 45711 "parser_cocci_menhir.ml"
+# 45827 "parser_cocci_menhir.ml"
         ) = Obj.magic ty00 in
         let x0 : 'tv_const_vol = Obj.magic x0 in
         let _startpos = _startpos_x0_ in
@@ -45717,15 +45833,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty = ty0 in
             
-# 638 "parser_cocci_menhir.mly"
+# 664 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.CharType,[P.clt2mcode "char" ty])) )
-# 45723 "parser_cocci_menhir.ml"
+# 45839 "parser_cocci_menhir.ml"
             
           in
           
-# 723 "parser_cocci_menhir.mly"
+# 749 "parser_cocci_menhir.mly"
                     ( ty )
-# 45729 "parser_cocci_menhir.ml"
+# 45845 "parser_cocci_menhir.ml"
           
         in
         let cv =
@@ -45733,13 +45849,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 45737 "parser_cocci_menhir.ml"
+# 45853 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 45743 "parser_cocci_menhir.ml"
+# 45859 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -45769,9 +45885,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty00 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 45775 "parser_cocci_menhir.ml"
+# 45891 "parser_cocci_menhir.ml"
         ) = Obj.magic ty00 in
         let x0 : 'tv_const_vol = Obj.magic x0 in
         let _startpos = _startpos_x0_ in
@@ -45781,15 +45897,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty = ty0 in
             
-# 640 "parser_cocci_menhir.mly"
+# 666 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.ShortType,[P.clt2mcode "short" ty])) )
-# 45787 "parser_cocci_menhir.ml"
+# 45903 "parser_cocci_menhir.ml"
             
           in
           
-# 723 "parser_cocci_menhir.mly"
+# 749 "parser_cocci_menhir.mly"
                     ( ty )
-# 45793 "parser_cocci_menhir.ml"
+# 45909 "parser_cocci_menhir.ml"
           
         in
         let cv =
@@ -45797,13 +45913,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 45801 "parser_cocci_menhir.ml"
+# 45917 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 45807 "parser_cocci_menhir.ml"
+# 45923 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -45838,14 +45954,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty200 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 45844 "parser_cocci_menhir.ml"
+# 45960 "parser_cocci_menhir.ml"
         ) = Obj.magic ty200 in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 45849 "parser_cocci_menhir.ml"
+# 45965 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
         let x0 : 'tv_const_vol = Obj.magic x0 in
         let _startpos = _startpos_x0_ in
@@ -45857,17 +45973,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let ty2 = ty20 in
             let ty1 = ty10 in
             
-# 642 "parser_cocci_menhir.mly"
+# 668 "parser_cocci_menhir.mly"
     ( Ast0.wrap
        (Ast0.BaseType
           (Ast.ShortIntType,[P.clt2mcode "short" ty1;P.clt2mcode "int" ty2])) )
-# 45865 "parser_cocci_menhir.ml"
+# 45981 "parser_cocci_menhir.ml"
             
           in
           
-# 723 "parser_cocci_menhir.mly"
+# 749 "parser_cocci_menhir.mly"
                     ( ty )
-# 45871 "parser_cocci_menhir.ml"
+# 45987 "parser_cocci_menhir.ml"
           
         in
         let cv =
@@ -45875,13 +45991,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 45879 "parser_cocci_menhir.ml"
+# 45995 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 45885 "parser_cocci_menhir.ml"
+# 46001 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -45911,9 +46027,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty00 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 45917 "parser_cocci_menhir.ml"
+# 46033 "parser_cocci_menhir.ml"
         ) = Obj.magic ty00 in
         let x0 : 'tv_const_vol = Obj.magic x0 in
         let _startpos = _startpos_x0_ in
@@ -45923,15 +46039,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty = ty0 in
             
-# 646 "parser_cocci_menhir.mly"
+# 672 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.IntType,[P.clt2mcode "int" ty])) )
-# 45929 "parser_cocci_menhir.ml"
+# 46045 "parser_cocci_menhir.ml"
             
           in
           
-# 723 "parser_cocci_menhir.mly"
+# 749 "parser_cocci_menhir.mly"
                     ( ty )
-# 45935 "parser_cocci_menhir.ml"
+# 46051 "parser_cocci_menhir.ml"
           
         in
         let cv =
@@ -45939,13 +46055,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 45943 "parser_cocci_menhir.ml"
+# 46059 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 45949 "parser_cocci_menhir.ml"
+# 46065 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -45975,9 +46091,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let p00 : (
-# 134 "parser_cocci_menhir.mly"
+# 160 "parser_cocci_menhir.mly"
        (Parse_aux.info)
-# 45981 "parser_cocci_menhir.ml"
+# 46097 "parser_cocci_menhir.ml"
         ) = Obj.magic p00 in
         let x0 : 'tv_const_vol = Obj.magic x0 in
         let _startpos = _startpos_x0_ in
@@ -45987,16 +46103,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let p = p0 in
             
-# 648 "parser_cocci_menhir.mly"
+# 674 "parser_cocci_menhir.mly"
     ( let (nm,pure,clt) = p in
       Ast0.wrap(Ast0.MetaType(P.clt2mcode nm clt,pure)) )
-# 45994 "parser_cocci_menhir.ml"
+# 46110 "parser_cocci_menhir.ml"
             
           in
           
-# 723 "parser_cocci_menhir.mly"
+# 749 "parser_cocci_menhir.mly"
                     ( ty )
-# 46000 "parser_cocci_menhir.ml"
+# 46116 "parser_cocci_menhir.ml"
           
         in
         let cv =
@@ -46004,13 +46120,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 46008 "parser_cocci_menhir.ml"
+# 46124 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 46014 "parser_cocci_menhir.ml"
+# 46130 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -46049,14 +46165,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let p00 : (
-# 127 "parser_cocci_menhir.mly"
+# 153 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 46055 "parser_cocci_menhir.ml"
+# 46171 "parser_cocci_menhir.ml"
         ) = Obj.magic p00 in
         let r00 : (
-# 114 "parser_cocci_menhir.mly"
+# 140 "parser_cocci_menhir.mly"
       (string)
-# 46060 "parser_cocci_menhir.ml"
+# 46176 "parser_cocci_menhir.ml"
         ) = Obj.magic r00 in
         let x0 : 'tv_const_vol = Obj.magic x0 in
         let _startpos = _startpos_x0_ in
@@ -46068,20 +46184,20 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let p = p0 in
             let r = r0 in
             
-# 651 "parser_cocci_menhir.mly"
+# 677 "parser_cocci_menhir.mly"
     ( let nm = (r,P.id2name p) in
     (* this is only possible when we are in a metavar decl.  Otherwise,
        it will be represented already as a MetaType *)
     let _ = P.check_meta(Ast.MetaTypeDecl(Ast.NONE,nm)) in
     Ast0.wrap(Ast0.MetaType(P.clt2mcode nm (P.id2clt p),
                            Ast0.Impure (*will be ignored*))) )
-# 46079 "parser_cocci_menhir.ml"
+# 46195 "parser_cocci_menhir.ml"
             
           in
           
-# 723 "parser_cocci_menhir.mly"
+# 749 "parser_cocci_menhir.mly"
                     ( ty )
-# 46085 "parser_cocci_menhir.ml"
+# 46201 "parser_cocci_menhir.ml"
           
         in
         let cv =
@@ -46089,13 +46205,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 46093 "parser_cocci_menhir.ml"
+# 46209 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 46099 "parser_cocci_menhir.ml"
+# 46215 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -46125,9 +46241,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 46131 "parser_cocci_menhir.ml"
+# 46247 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
         let x0 : 'tv_const_vol = Obj.magic x0 in
         let _startpos = _startpos_x0_ in
@@ -46137,15 +46253,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty1 = ty10 in
             
-# 658 "parser_cocci_menhir.mly"
+# 684 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.LongType,[P.clt2mcode "long" ty1])) )
-# 46143 "parser_cocci_menhir.ml"
+# 46259 "parser_cocci_menhir.ml"
             
           in
           
-# 723 "parser_cocci_menhir.mly"
+# 749 "parser_cocci_menhir.mly"
                     ( ty )
-# 46149 "parser_cocci_menhir.ml"
+# 46265 "parser_cocci_menhir.ml"
           
         in
         let cv =
@@ -46153,13 +46269,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 46157 "parser_cocci_menhir.ml"
+# 46273 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 46163 "parser_cocci_menhir.ml"
+# 46279 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -46194,14 +46310,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty200 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 46200 "parser_cocci_menhir.ml"
+# 46316 "parser_cocci_menhir.ml"
         ) = Obj.magic ty200 in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 46205 "parser_cocci_menhir.ml"
+# 46321 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
         let x0 : 'tv_const_vol = Obj.magic x0 in
         let _startpos = _startpos_x0_ in
@@ -46213,17 +46329,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let ty2 = ty20 in
             let ty1 = ty10 in
             
-# 660 "parser_cocci_menhir.mly"
+# 686 "parser_cocci_menhir.mly"
     ( Ast0.wrap
        (Ast0.BaseType
           (Ast.LongIntType,[P.clt2mcode "long" ty1;P.clt2mcode "int" ty2])) )
-# 46221 "parser_cocci_menhir.ml"
+# 46337 "parser_cocci_menhir.ml"
             
           in
           
-# 723 "parser_cocci_menhir.mly"
+# 749 "parser_cocci_menhir.mly"
                     ( ty )
-# 46227 "parser_cocci_menhir.ml"
+# 46343 "parser_cocci_menhir.ml"
           
         in
         let cv =
@@ -46231,13 +46347,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 46235 "parser_cocci_menhir.ml"
+# 46351 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 46241 "parser_cocci_menhir.ml"
+# 46357 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -46272,14 +46388,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty200 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 46278 "parser_cocci_menhir.ml"
+# 46394 "parser_cocci_menhir.ml"
         ) = Obj.magic ty200 in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 46283 "parser_cocci_menhir.ml"
+# 46399 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
         let x0 : 'tv_const_vol = Obj.magic x0 in
         let _startpos = _startpos_x0_ in
@@ -46291,18 +46407,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let ty2 = ty20 in
             let ty1 = ty10 in
             
-# 664 "parser_cocci_menhir.mly"
+# 690 "parser_cocci_menhir.mly"
     ( Ast0.wrap
        (Ast0.BaseType
           (Ast.LongLongType,
            [P.clt2mcode "long" ty1;P.clt2mcode "long" ty2])) )
-# 46300 "parser_cocci_menhir.ml"
+# 46416 "parser_cocci_menhir.ml"
             
           in
           
-# 723 "parser_cocci_menhir.mly"
+# 749 "parser_cocci_menhir.mly"
                     ( ty )
-# 46306 "parser_cocci_menhir.ml"
+# 46422 "parser_cocci_menhir.ml"
           
         in
         let cv =
@@ -46310,13 +46426,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 46314 "parser_cocci_menhir.ml"
+# 46430 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 46320 "parser_cocci_menhir.ml"
+# 46436 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -46356,19 +46472,19 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty300 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 46362 "parser_cocci_menhir.ml"
+# 46478 "parser_cocci_menhir.ml"
         ) = Obj.magic ty300 in
         let ty200 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 46367 "parser_cocci_menhir.ml"
+# 46483 "parser_cocci_menhir.ml"
         ) = Obj.magic ty200 in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 46372 "parser_cocci_menhir.ml"
+# 46488 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
         let x0 : 'tv_const_vol = Obj.magic x0 in
         let _startpos = _startpos_x0_ in
@@ -46382,19 +46498,19 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let ty2 = ty20 in
             let ty1 = ty10 in
             
-# 669 "parser_cocci_menhir.mly"
+# 695 "parser_cocci_menhir.mly"
     ( Ast0.wrap
        (Ast0.BaseType
           (Ast.LongLongIntType,
            [P.clt2mcode "long" ty1;P.clt2mcode "long" ty2;
              P.clt2mcode "int" ty3])) )
-# 46392 "parser_cocci_menhir.ml"
+# 46508 "parser_cocci_menhir.ml"
             
           in
           
-# 723 "parser_cocci_menhir.mly"
+# 749 "parser_cocci_menhir.mly"
                     ( ty )
-# 46398 "parser_cocci_menhir.ml"
+# 46514 "parser_cocci_menhir.ml"
           
         in
         let cv =
@@ -46402,13 +46518,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 46406 "parser_cocci_menhir.ml"
+# 46522 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 46412 "parser_cocci_menhir.ml"
+# 46528 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -46438,9 +46554,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty00 : (
-# 118 "parser_cocci_menhir.mly"
+# 144 "parser_cocci_menhir.mly"
       (Data.clt)
-# 46444 "parser_cocci_menhir.ml"
+# 46560 "parser_cocci_menhir.ml"
         ) = Obj.magic ty00 in
         let x0 : 'tv_const_vol = Obj.magic x0 in
         let _startpos = _startpos_x0_ in
@@ -46450,15 +46566,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty = ty0 in
             
-# 678 "parser_cocci_menhir.mly"
+# 704 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.VoidType,[P.clt2mcode "void" ty])) )
-# 46456 "parser_cocci_menhir.ml"
+# 46572 "parser_cocci_menhir.ml"
             
           in
           
-# 724 "parser_cocci_menhir.mly"
+# 750 "parser_cocci_menhir.mly"
                         ( ty )
-# 46462 "parser_cocci_menhir.ml"
+# 46578 "parser_cocci_menhir.ml"
           
         in
         let cv =
@@ -46466,13 +46582,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 46470 "parser_cocci_menhir.ml"
+# 46586 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 46476 "parser_cocci_menhir.ml"
+# 46592 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -46507,14 +46623,14 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty200 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 46513 "parser_cocci_menhir.ml"
+# 46629 "parser_cocci_menhir.ml"
         ) = Obj.magic ty200 in
         let ty100 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 46518 "parser_cocci_menhir.ml"
+# 46634 "parser_cocci_menhir.ml"
         ) = Obj.magic ty100 in
         let x0 : 'tv_const_vol = Obj.magic x0 in
         let _startpos = _startpos_x0_ in
@@ -46526,18 +46642,18 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let ty2 = ty20 in
             let ty1 = ty10 in
             
-# 680 "parser_cocci_menhir.mly"
+# 706 "parser_cocci_menhir.mly"
     ( Ast0.wrap
        (Ast0.BaseType
           (Ast.LongDoubleType,
            [P.clt2mcode "long" ty1;P.clt2mcode "double" ty2])) )
-# 46535 "parser_cocci_menhir.ml"
+# 46651 "parser_cocci_menhir.ml"
             
           in
           
-# 724 "parser_cocci_menhir.mly"
+# 750 "parser_cocci_menhir.mly"
                         ( ty )
-# 46541 "parser_cocci_menhir.ml"
+# 46657 "parser_cocci_menhir.ml"
           
         in
         let cv =
@@ -46545,13 +46661,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 46549 "parser_cocci_menhir.ml"
+# 46665 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 46555 "parser_cocci_menhir.ml"
+# 46671 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -46581,9 +46697,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty00 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 46587 "parser_cocci_menhir.ml"
+# 46703 "parser_cocci_menhir.ml"
         ) = Obj.magic ty00 in
         let x0 : 'tv_const_vol = Obj.magic x0 in
         let _startpos = _startpos_x0_ in
@@ -46593,15 +46709,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty = ty0 in
             
-# 685 "parser_cocci_menhir.mly"
+# 711 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.DoubleType,[P.clt2mcode "double" ty])) )
-# 46599 "parser_cocci_menhir.ml"
+# 46715 "parser_cocci_menhir.ml"
             
           in
           
-# 724 "parser_cocci_menhir.mly"
+# 750 "parser_cocci_menhir.mly"
                         ( ty )
-# 46605 "parser_cocci_menhir.ml"
+# 46721 "parser_cocci_menhir.ml"
           
         in
         let cv =
@@ -46609,13 +46725,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 46613 "parser_cocci_menhir.ml"
+# 46729 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 46619 "parser_cocci_menhir.ml"
+# 46735 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -46645,9 +46761,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty00 : (
-# 116 "parser_cocci_menhir.mly"
+# 142 "parser_cocci_menhir.mly"
       (Data.clt)
-# 46651 "parser_cocci_menhir.ml"
+# 46767 "parser_cocci_menhir.ml"
         ) = Obj.magic ty00 in
         let x0 : 'tv_const_vol = Obj.magic x0 in
         let _startpos = _startpos_x0_ in
@@ -46657,15 +46773,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty = ty0 in
             
-# 687 "parser_cocci_menhir.mly"
+# 713 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.FloatType,[P.clt2mcode "float" ty])) )
-# 46663 "parser_cocci_menhir.ml"
+# 46779 "parser_cocci_menhir.ml"
             
           in
           
-# 724 "parser_cocci_menhir.mly"
+# 750 "parser_cocci_menhir.mly"
                         ( ty )
-# 46669 "parser_cocci_menhir.ml"
+# 46785 "parser_cocci_menhir.ml"
           
         in
         let cv =
@@ -46673,13 +46789,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 46677 "parser_cocci_menhir.ml"
+# 46793 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 46683 "parser_cocci_menhir.ml"
+# 46799 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -46709,9 +46825,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty00 : (
-# 117 "parser_cocci_menhir.mly"
+# 143 "parser_cocci_menhir.mly"
       (Data.clt)
-# 46715 "parser_cocci_menhir.ml"
+# 46831 "parser_cocci_menhir.ml"
         ) = Obj.magic ty00 in
         let x0 : 'tv_const_vol = Obj.magic x0 in
         let _startpos = _startpos_x0_ in
@@ -46721,15 +46837,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty = ty0 in
             
-# 689 "parser_cocci_menhir.mly"
+# 715 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.SizeType,[P.clt2mcode "size_t" ty])) )
-# 46727 "parser_cocci_menhir.ml"
+# 46843 "parser_cocci_menhir.ml"
             
           in
           
-# 724 "parser_cocci_menhir.mly"
+# 750 "parser_cocci_menhir.mly"
                         ( ty )
-# 46733 "parser_cocci_menhir.ml"
+# 46849 "parser_cocci_menhir.ml"
           
         in
         let cv =
@@ -46737,13 +46853,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 46741 "parser_cocci_menhir.ml"
+# 46857 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 46747 "parser_cocci_menhir.ml"
+# 46863 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -46773,9 +46889,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty00 : (
-# 117 "parser_cocci_menhir.mly"
+# 143 "parser_cocci_menhir.mly"
       (Data.clt)
-# 46779 "parser_cocci_menhir.ml"
+# 46895 "parser_cocci_menhir.ml"
         ) = Obj.magic ty00 in
         let x0 : 'tv_const_vol = Obj.magic x0 in
         let _startpos = _startpos_x0_ in
@@ -46785,15 +46901,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty = ty0 in
             
-# 691 "parser_cocci_menhir.mly"
+# 717 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.SSizeType,[P.clt2mcode "ssize_t" ty])) )
-# 46791 "parser_cocci_menhir.ml"
+# 46907 "parser_cocci_menhir.ml"
             
           in
           
-# 724 "parser_cocci_menhir.mly"
+# 750 "parser_cocci_menhir.mly"
                         ( ty )
-# 46797 "parser_cocci_menhir.ml"
+# 46913 "parser_cocci_menhir.ml"
           
         in
         let cv =
@@ -46801,13 +46917,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 46805 "parser_cocci_menhir.ml"
+# 46921 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 46811 "parser_cocci_menhir.ml"
+# 46927 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -46837,9 +46953,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let ty00 : (
-# 117 "parser_cocci_menhir.mly"
+# 143 "parser_cocci_menhir.mly"
       (Data.clt)
-# 46843 "parser_cocci_menhir.ml"
+# 46959 "parser_cocci_menhir.ml"
         ) = Obj.magic ty00 in
         let x0 : 'tv_const_vol = Obj.magic x0 in
         let _startpos = _startpos_x0_ in
@@ -46849,15 +46965,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let ty = ty0 in
             
-# 693 "parser_cocci_menhir.mly"
+# 719 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.BaseType(Ast.PtrDiffType,[P.clt2mcode "ptrdiff_t" ty])) )
-# 46855 "parser_cocci_menhir.ml"
+# 46971 "parser_cocci_menhir.ml"
             
           in
           
-# 724 "parser_cocci_menhir.mly"
+# 750 "parser_cocci_menhir.mly"
                         ( ty )
-# 46861 "parser_cocci_menhir.ml"
+# 46977 "parser_cocci_menhir.ml"
           
         in
         let cv =
@@ -46865,13 +46981,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 46869 "parser_cocci_menhir.ml"
+# 46985 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 46875 "parser_cocci_menhir.ml"
+# 46991 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -46907,9 +47023,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let m : 'tv_list_TMul_ = Obj.magic m in
         let i00 : 'tv_ident = Obj.magic i00 in
         let s00 : (
-# 118 "parser_cocci_menhir.mly"
+# 144 "parser_cocci_menhir.mly"
       (Data.clt)
-# 46913 "parser_cocci_menhir.ml"
+# 47029 "parser_cocci_menhir.ml"
         ) = Obj.magic s00 in
         let x0 : 'tv_const_vol = Obj.magic x0 in
         let _startpos = _startpos_x0_ in
@@ -46921,15 +47037,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let i = i0 in
             let s = s0 in
             
-# 695 "parser_cocci_menhir.mly"
+# 721 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.EnumName(P.clt2mcode "enum" s, Some i)) )
-# 46927 "parser_cocci_menhir.ml"
+# 47043 "parser_cocci_menhir.ml"
             
           in
           
-# 724 "parser_cocci_menhir.mly"
+# 750 "parser_cocci_menhir.mly"
                         ( ty )
-# 46933 "parser_cocci_menhir.ml"
+# 47049 "parser_cocci_menhir.ml"
           
         in
         let cv =
@@ -46937,13 +47053,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 46941 "parser_cocci_menhir.ml"
+# 47057 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 46947 "parser_cocci_menhir.ml"
+# 47063 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -46988,20 +47104,20 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let r00 : (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
-# 46994 "parser_cocci_menhir.ml"
+# 47110 "parser_cocci_menhir.ml"
         ) = Obj.magic r00 in
         let ids00 : 'tv_enum_decl_list = Obj.magic ids00 in
         let l00 : (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
-# 47000 "parser_cocci_menhir.ml"
+# 47116 "parser_cocci_menhir.ml"
         ) = Obj.magic l00 in
         let s00 : (
-# 118 "parser_cocci_menhir.mly"
+# 144 "parser_cocci_menhir.mly"
       (Data.clt)
-# 47005 "parser_cocci_menhir.ml"
+# 47121 "parser_cocci_menhir.ml"
         ) = Obj.magic s00 in
         let x0 : 'tv_const_vol = Obj.magic x0 in
         let _startpos = _startpos_x0_ in
@@ -47020,22 +47136,22 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
               
 # 39 "standard.mly"
     ( None )
-# 47024 "parser_cocci_menhir.ml"
+# 47140 "parser_cocci_menhir.ml"
               
             in
             
-# 697 "parser_cocci_menhir.mly"
+# 723 "parser_cocci_menhir.mly"
     ( (if i = None && !Data.in_iso
     then failwith "enums must be named in the iso file");
       Ast0.wrap(Ast0.EnumDef(Ast0.wrap(Ast0.EnumName(P.clt2mcode "enum" s, i)),
                             P.clt2mcode "{" l, ids, P.clt2mcode "}" r)) )
-# 47033 "parser_cocci_menhir.ml"
+# 47149 "parser_cocci_menhir.ml"
             
           in
           
-# 724 "parser_cocci_menhir.mly"
+# 750 "parser_cocci_menhir.mly"
                         ( ty )
-# 47039 "parser_cocci_menhir.ml"
+# 47155 "parser_cocci_menhir.ml"
           
         in
         let cv =
@@ -47043,13 +47159,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 47047 "parser_cocci_menhir.ml"
+# 47163 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 47053 "parser_cocci_menhir.ml"
+# 47169 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -47099,21 +47215,21 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let r00 : (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
-# 47105 "parser_cocci_menhir.ml"
+# 47221 "parser_cocci_menhir.ml"
         ) = Obj.magic r00 in
         let ids00 : 'tv_enum_decl_list = Obj.magic ids00 in
         let l00 : (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
-# 47111 "parser_cocci_menhir.ml"
+# 47227 "parser_cocci_menhir.ml"
         ) = Obj.magic l00 in
         let x000 : 'tv_ident = Obj.magic x000 in
         let s00 : (
-# 118 "parser_cocci_menhir.mly"
+# 144 "parser_cocci_menhir.mly"
       (Data.clt)
-# 47117 "parser_cocci_menhir.ml"
+# 47233 "parser_cocci_menhir.ml"
         ) = Obj.magic s00 in
         let x0 : 'tv_const_vol = Obj.magic x0 in
         let _startpos = _startpos_x0_ in
@@ -47135,22 +47251,22 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
               
 # 41 "standard.mly"
     ( Some x )
-# 47139 "parser_cocci_menhir.ml"
+# 47255 "parser_cocci_menhir.ml"
               
             in
             
-# 697 "parser_cocci_menhir.mly"
+# 723 "parser_cocci_menhir.mly"
     ( (if i = None && !Data.in_iso
     then failwith "enums must be named in the iso file");
       Ast0.wrap(Ast0.EnumDef(Ast0.wrap(Ast0.EnumName(P.clt2mcode "enum" s, i)),
                             P.clt2mcode "{" l, ids, P.clt2mcode "}" r)) )
-# 47148 "parser_cocci_menhir.ml"
+# 47264 "parser_cocci_menhir.ml"
             
           in
           
-# 724 "parser_cocci_menhir.mly"
+# 750 "parser_cocci_menhir.mly"
                         ( ty )
-# 47154 "parser_cocci_menhir.ml"
+# 47270 "parser_cocci_menhir.ml"
           
         in
         let cv =
@@ -47158,13 +47274,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 47162 "parser_cocci_menhir.ml"
+# 47278 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 47168 "parser_cocci_menhir.ml"
+# 47284 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -47210,15 +47326,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let i = i0 in
             let s = s0 in
             
-# 702 "parser_cocci_menhir.mly"
+# 728 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.StructUnionName(s, Some i)) )
-# 47216 "parser_cocci_menhir.ml"
+# 47332 "parser_cocci_menhir.ml"
             
           in
           
-# 724 "parser_cocci_menhir.mly"
+# 750 "parser_cocci_menhir.mly"
                         ( ty )
-# 47222 "parser_cocci_menhir.ml"
+# 47338 "parser_cocci_menhir.ml"
           
         in
         let cv =
@@ -47226,13 +47342,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 47230 "parser_cocci_menhir.ml"
+# 47346 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 47236 "parser_cocci_menhir.ml"
+# 47352 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -47277,15 +47393,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let r00 : (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
-# 47283 "parser_cocci_menhir.ml"
+# 47399 "parser_cocci_menhir.ml"
         ) = Obj.magic r00 in
         let d00 : 'tv_struct_decl_list = Obj.magic d00 in
         let l00 : (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
-# 47289 "parser_cocci_menhir.ml"
+# 47405 "parser_cocci_menhir.ml"
         ) = Obj.magic l00 in
         let s00 : 'tv_struct_or_union = Obj.magic s00 in
         let x0 : 'tv_const_vol = Obj.magic x0 in
@@ -47305,23 +47421,23 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
               
 # 39 "standard.mly"
     ( None )
-# 47309 "parser_cocci_menhir.ml"
+# 47425 "parser_cocci_menhir.ml"
               
             in
             
-# 705 "parser_cocci_menhir.mly"
+# 731 "parser_cocci_menhir.mly"
     ( (if i = None && !Data.in_iso
     then failwith "structures must be named in the iso file");
       Ast0.wrap(Ast0.StructUnionDef(Ast0.wrap(Ast0.StructUnionName(s, i)),
                                    P.clt2mcode "{" l,
                                    d, P.clt2mcode "}" r)) )
-# 47319 "parser_cocci_menhir.ml"
+# 47435 "parser_cocci_menhir.ml"
             
           in
           
-# 724 "parser_cocci_menhir.mly"
+# 750 "parser_cocci_menhir.mly"
                         ( ty )
-# 47325 "parser_cocci_menhir.ml"
+# 47441 "parser_cocci_menhir.ml"
           
         in
         let cv =
@@ -47329,13 +47445,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 47333 "parser_cocci_menhir.ml"
+# 47449 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 47339 "parser_cocci_menhir.ml"
+# 47455 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -47385,15 +47501,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let r00 : (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
-# 47391 "parser_cocci_menhir.ml"
+# 47507 "parser_cocci_menhir.ml"
         ) = Obj.magic r00 in
         let d00 : 'tv_struct_decl_list = Obj.magic d00 in
         let l00 : (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
-# 47397 "parser_cocci_menhir.ml"
+# 47513 "parser_cocci_menhir.ml"
         ) = Obj.magic l00 in
         let x000 : 'tv_type_ident = Obj.magic x000 in
         let s00 : 'tv_struct_or_union = Obj.magic s00 in
@@ -47417,23 +47533,23 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
               
 # 41 "standard.mly"
     ( Some x )
-# 47421 "parser_cocci_menhir.ml"
+# 47537 "parser_cocci_menhir.ml"
               
             in
             
-# 705 "parser_cocci_menhir.mly"
+# 731 "parser_cocci_menhir.mly"
     ( (if i = None && !Data.in_iso
     then failwith "structures must be named in the iso file");
       Ast0.wrap(Ast0.StructUnionDef(Ast0.wrap(Ast0.StructUnionName(s, i)),
                                    P.clt2mcode "{" l,
                                    d, P.clt2mcode "}" r)) )
-# 47431 "parser_cocci_menhir.ml"
+# 47547 "parser_cocci_menhir.ml"
             
           in
           
-# 724 "parser_cocci_menhir.mly"
+# 750 "parser_cocci_menhir.mly"
                         ( ty )
-# 47437 "parser_cocci_menhir.ml"
+# 47553 "parser_cocci_menhir.ml"
           
         in
         let cv =
@@ -47441,13 +47557,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 47445 "parser_cocci_menhir.ml"
+# 47561 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 47451 "parser_cocci_menhir.ml"
+# 47567 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -47492,20 +47608,20 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let r00 : (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
-# 47498 "parser_cocci_menhir.ml"
+# 47614 "parser_cocci_menhir.ml"
         ) = Obj.magic r00 in
         let d00 : 'tv_struct_decl_list = Obj.magic d00 in
         let l00 : (
-# 173 "parser_cocci_menhir.mly"
+# 199 "parser_cocci_menhir.mly"
        (Data.clt)
-# 47504 "parser_cocci_menhir.ml"
+# 47620 "parser_cocci_menhir.ml"
         ) = Obj.magic l00 in
         let s00 : (
-# 134 "parser_cocci_menhir.mly"
+# 160 "parser_cocci_menhir.mly"
        (Parse_aux.info)
-# 47509 "parser_cocci_menhir.ml"
+# 47625 "parser_cocci_menhir.ml"
         ) = Obj.magic s00 in
         let x0 : 'tv_const_vol = Obj.magic x0 in
         let _startpos = _startpos_x0_ in
@@ -47521,17 +47637,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             let l = l0 in
             let s = s0 in
             
-# 711 "parser_cocci_menhir.mly"
+# 737 "parser_cocci_menhir.mly"
     ( let (nm,pure,clt) = s in
     let ty = Ast0.wrap(Ast0.MetaType(P.clt2mcode nm clt,pure)) in
     Ast0.wrap(Ast0.StructUnionDef(ty,P.clt2mcode "{" l,d,P.clt2mcode "}" r)) )
-# 47529 "parser_cocci_menhir.ml"
+# 47645 "parser_cocci_menhir.ml"
             
           in
           
-# 724 "parser_cocci_menhir.mly"
+# 750 "parser_cocci_menhir.mly"
                         ( ty )
-# 47535 "parser_cocci_menhir.ml"
+# 47651 "parser_cocci_menhir.ml"
           
         in
         let cv =
@@ -47539,13 +47655,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 47543 "parser_cocci_menhir.ml"
+# 47659 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 47549 "parser_cocci_menhir.ml"
+# 47665 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -47575,9 +47691,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let m : 'tv_list_TMul_ = Obj.magic m in
         let p00 : (
-# 127 "parser_cocci_menhir.mly"
+# 153 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 47581 "parser_cocci_menhir.ml"
+# 47697 "parser_cocci_menhir.ml"
         ) = Obj.magic p00 in
         let x0 : 'tv_const_vol = Obj.magic x0 in
         let _startpos = _startpos_x0_ in
@@ -47587,15 +47703,15 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           let ty =
             let p = p0 in
             
-# 715 "parser_cocci_menhir.mly"
+# 741 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.TypeName(P.id2mcode p)) )
-# 47593 "parser_cocci_menhir.ml"
+# 47709 "parser_cocci_menhir.ml"
             
           in
           
-# 724 "parser_cocci_menhir.mly"
+# 750 "parser_cocci_menhir.mly"
                         ( ty )
-# 47599 "parser_cocci_menhir.ml"
+# 47715 "parser_cocci_menhir.ml"
           
         in
         let cv =
@@ -47603,13 +47719,13 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           
 # 41 "standard.mly"
     ( Some x )
-# 47607 "parser_cocci_menhir.ml"
+# 47723 "parser_cocci_menhir.ml"
           
         in
         
-# 745 "parser_cocci_menhir.mly"
+# 771 "parser_cocci_menhir.mly"
     ( P.pointerify (P.make_cv cv ty) m )
-# 47613 "parser_cocci_menhir.ml"
+# 47729 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -47638,24 +47754,24 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let rp : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
-# 47644 "parser_cocci_menhir.ml"
+# 47760 "parser_cocci_menhir.ml"
         ) = Obj.magic rp in
         let t : 'tv_midzero_list_mctype_mctype_ = Obj.magic t in
         let lp : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
-# 47650 "parser_cocci_menhir.ml"
+# 47766 "parser_cocci_menhir.ml"
         ) = Obj.magic lp in
         let _startpos = _startpos_lp_ in
         let _endpos = _endpos_rp_ in
         let _v : 'tv_typedef_ctype = 
-# 747 "parser_cocci_menhir.mly"
+# 773 "parser_cocci_menhir.mly"
     ( let (mids,code) = t in
       Ast0.wrap
        (Ast0.DisjType(P.clt2mcode "(" lp,code,mids, P.clt2mcode ")" rp)) )
-# 47659 "parser_cocci_menhir.ml"
+# 47775 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -47674,16 +47790,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 135 "parser_cocci_menhir.mly"
+# 161 "parser_cocci_menhir.mly"
        (Parse_aux.info)
-# 47680 "parser_cocci_menhir.ml"
+# 47796 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_typedef_ctype = 
-# 750 "parser_cocci_menhir.mly"
+# 776 "parser_cocci_menhir.mly"
         ( tmeta_to_type _1 )
-# 47687 "parser_cocci_menhir.ml"
+# 47803 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -47705,9 +47821,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_typedef_ident = 
-# 2059 "parser_cocci_menhir.mly"
+# 2096 "parser_cocci_menhir.mly"
          ( Ast0.wrap(Ast0.TypeName(P.id2mcode _1)) )
-# 47711 "parser_cocci_menhir.ml"
+# 47827 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -47726,16 +47842,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 135 "parser_cocci_menhir.mly"
+# 161 "parser_cocci_menhir.mly"
        (Parse_aux.info)
-# 47732 "parser_cocci_menhir.ml"
+# 47848 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_typedef_ident = 
-# 2060 "parser_cocci_menhir.mly"
+# 2097 "parser_cocci_menhir.mly"
              ( tmeta_to_type _1 )
-# 47739 "parser_cocci_menhir.ml"
+# 47855 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -47754,17 +47870,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 134 "parser_cocci_menhir.mly"
+# 160 "parser_cocci_menhir.mly"
        (Parse_aux.info)
-# 47760 "parser_cocci_menhir.ml"
+# 47876 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_typedef_ident = 
-# 2062 "parser_cocci_menhir.mly"
+# 2099 "parser_cocci_menhir.mly"
          ( let (nm,pure,clt) = _1 in
         Ast0.wrap(Ast0.MetaType(P.clt2mcode nm clt,pure)) )
-# 47768 "parser_cocci_menhir.ml"
+# 47884 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -47786,9 +47902,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_unary_expr_eexpr_dot_expressions_ = 
-# 1611 "parser_cocci_menhir.mly"
+# 1648 "parser_cocci_menhir.mly"
                                          ( _1 )
-# 47792 "parser_cocci_menhir.ml"
+# 47908 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -47813,16 +47929,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _2 : 'tv_unary_expr_bis = Obj.magic _2 in
         let _1 : (
-# 157 "parser_cocci_menhir.mly"
+# 183 "parser_cocci_menhir.mly"
        (Data.clt)
-# 47819 "parser_cocci_menhir.ml"
+# 47935 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_unary_expr_eexpr_dot_expressions_ = 
-# 1613 "parser_cocci_menhir.mly"
+# 1650 "parser_cocci_menhir.mly"
       ( Ast0.wrap(Ast0.Infix (_2, P.clt2mcode Ast.Inc _1)) )
-# 47826 "parser_cocci_menhir.ml"
+# 47942 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -47847,16 +47963,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _2 : 'tv_unary_expr_bis = Obj.magic _2 in
         let _1 : (
-# 157 "parser_cocci_menhir.mly"
+# 183 "parser_cocci_menhir.mly"
        (Data.clt)
-# 47853 "parser_cocci_menhir.ml"
+# 47969 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_unary_expr_eexpr_dot_expressions_ = 
-# 1615 "parser_cocci_menhir.mly"
+# 1652 "parser_cocci_menhir.mly"
       ( Ast0.wrap(Ast0.Infix (_2, P.clt2mcode Ast.Dec _1)) )
-# 47860 "parser_cocci_menhir.ml"
+# 47976 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -47884,9 +48000,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_unary_expr_eexpr_dot_expressions_ = 
-# 1617 "parser_cocci_menhir.mly"
+# 1654 "parser_cocci_menhir.mly"
       ( let mcode = _1 in Ast0.wrap(Ast0.Unary(_2, mcode)) )
-# 47890 "parser_cocci_menhir.ml"
+# 48006 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -47911,17 +48027,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _2 : 'tv_unary_expr_bis = Obj.magic _2 in
         let _1 : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
-# 47917 "parser_cocci_menhir.ml"
+# 48033 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_unary_expr_eexpr_dot_expressions_ = 
-# 1619 "parser_cocci_menhir.mly"
+# 1656 "parser_cocci_menhir.mly"
       ( let mcode = P.clt2mcode Ast.Not _1 in
       Ast0.wrap(Ast0.Unary(_2, mcode)) )
-# 47925 "parser_cocci_menhir.ml"
+# 48041 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -47946,16 +48062,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _2 : 'tv_unary_expr_bis = Obj.magic _2 in
         let _1 : (
-# 126 "parser_cocci_menhir.mly"
+# 152 "parser_cocci_menhir.mly"
        (Data.clt)
-# 47952 "parser_cocci_menhir.ml"
+# 48068 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_unary_expr_eexpr_dot_expressions_ = 
-# 1622 "parser_cocci_menhir.mly"
+# 1659 "parser_cocci_menhir.mly"
       ( Ast0.wrap(Ast0.SizeOfExpr (P.clt2mcode "sizeof" _1, _2)) )
-# 47959 "parser_cocci_menhir.ml"
+# 48075 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -47989,29 +48105,29 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let rp : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
-# 47995 "parser_cocci_menhir.ml"
+# 48111 "parser_cocci_menhir.ml"
         ) = Obj.magic rp in
         let t : 'tv_ctype = Obj.magic t in
         let lp : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
-# 48001 "parser_cocci_menhir.ml"
+# 48117 "parser_cocci_menhir.ml"
         ) = Obj.magic lp in
         let s : (
-# 126 "parser_cocci_menhir.mly"
+# 152 "parser_cocci_menhir.mly"
        (Data.clt)
-# 48006 "parser_cocci_menhir.ml"
+# 48122 "parser_cocci_menhir.ml"
         ) = Obj.magic s in
         let _startpos = _startpos_s_ in
         let _endpos = _endpos_rp_ in
         let _v : 'tv_unary_expr_eexpr_dot_expressions_ = 
-# 1624 "parser_cocci_menhir.mly"
+# 1661 "parser_cocci_menhir.mly"
       ( Ast0.wrap(Ast0.SizeOfType (P.clt2mcode "sizeof" s,
                                    P.clt2mcode "(" lp,t,
                                    P.clt2mcode ")" rp)) )
-# 48015 "parser_cocci_menhir.ml"
+# 48131 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -48033,9 +48149,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_unary_expr_eexpr_invalid_ = 
-# 1611 "parser_cocci_menhir.mly"
+# 1648 "parser_cocci_menhir.mly"
                                          ( _1 )
-# 48039 "parser_cocci_menhir.ml"
+# 48155 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -48060,16 +48176,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _2 : 'tv_unary_expr_bis = Obj.magic _2 in
         let _1 : (
-# 157 "parser_cocci_menhir.mly"
+# 183 "parser_cocci_menhir.mly"
        (Data.clt)
-# 48066 "parser_cocci_menhir.ml"
+# 48182 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_unary_expr_eexpr_invalid_ = 
-# 1613 "parser_cocci_menhir.mly"
+# 1650 "parser_cocci_menhir.mly"
       ( Ast0.wrap(Ast0.Infix (_2, P.clt2mcode Ast.Inc _1)) )
-# 48073 "parser_cocci_menhir.ml"
+# 48189 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -48094,16 +48210,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _2 : 'tv_unary_expr_bis = Obj.magic _2 in
         let _1 : (
-# 157 "parser_cocci_menhir.mly"
+# 183 "parser_cocci_menhir.mly"
        (Data.clt)
-# 48100 "parser_cocci_menhir.ml"
+# 48216 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_unary_expr_eexpr_invalid_ = 
-# 1615 "parser_cocci_menhir.mly"
+# 1652 "parser_cocci_menhir.mly"
       ( Ast0.wrap(Ast0.Infix (_2, P.clt2mcode Ast.Dec _1)) )
-# 48107 "parser_cocci_menhir.ml"
+# 48223 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -48131,9 +48247,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_unary_expr_eexpr_invalid_ = 
-# 1617 "parser_cocci_menhir.mly"
+# 1654 "parser_cocci_menhir.mly"
       ( let mcode = _1 in Ast0.wrap(Ast0.Unary(_2, mcode)) )
-# 48137 "parser_cocci_menhir.ml"
+# 48253 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -48158,17 +48274,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _2 : 'tv_unary_expr_bis = Obj.magic _2 in
         let _1 : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
-# 48164 "parser_cocci_menhir.ml"
+# 48280 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_unary_expr_eexpr_invalid_ = 
-# 1619 "parser_cocci_menhir.mly"
+# 1656 "parser_cocci_menhir.mly"
       ( let mcode = P.clt2mcode Ast.Not _1 in
       Ast0.wrap(Ast0.Unary(_2, mcode)) )
-# 48172 "parser_cocci_menhir.ml"
+# 48288 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -48193,16 +48309,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _2 : 'tv_unary_expr_bis = Obj.magic _2 in
         let _1 : (
-# 126 "parser_cocci_menhir.mly"
+# 152 "parser_cocci_menhir.mly"
        (Data.clt)
-# 48199 "parser_cocci_menhir.ml"
+# 48315 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_unary_expr_eexpr_invalid_ = 
-# 1622 "parser_cocci_menhir.mly"
+# 1659 "parser_cocci_menhir.mly"
       ( Ast0.wrap(Ast0.SizeOfExpr (P.clt2mcode "sizeof" _1, _2)) )
-# 48206 "parser_cocci_menhir.ml"
+# 48322 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -48236,29 +48352,29 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let rp : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
-# 48242 "parser_cocci_menhir.ml"
+# 48358 "parser_cocci_menhir.ml"
         ) = Obj.magic rp in
         let t : 'tv_ctype = Obj.magic t in
         let lp : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
-# 48248 "parser_cocci_menhir.ml"
+# 48364 "parser_cocci_menhir.ml"
         ) = Obj.magic lp in
         let s : (
-# 126 "parser_cocci_menhir.mly"
+# 152 "parser_cocci_menhir.mly"
        (Data.clt)
-# 48253 "parser_cocci_menhir.ml"
+# 48369 "parser_cocci_menhir.ml"
         ) = Obj.magic s in
         let _startpos = _startpos_s_ in
         let _endpos = _endpos_rp_ in
         let _v : 'tv_unary_expr_eexpr_invalid_ = 
-# 1624 "parser_cocci_menhir.mly"
+# 1661 "parser_cocci_menhir.mly"
       ( Ast0.wrap(Ast0.SizeOfType (P.clt2mcode "sizeof" s,
                                    P.clt2mcode "(" lp,t,
                                    P.clt2mcode ")" rp)) )
-# 48262 "parser_cocci_menhir.ml"
+# 48378 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -48280,9 +48396,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_unary_expr_eexpr_nest_expressions_ = 
-# 1611 "parser_cocci_menhir.mly"
+# 1648 "parser_cocci_menhir.mly"
                                          ( _1 )
-# 48286 "parser_cocci_menhir.ml"
+# 48402 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -48307,16 +48423,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _2 : 'tv_unary_expr_bis = Obj.magic _2 in
         let _1 : (
-# 157 "parser_cocci_menhir.mly"
+# 183 "parser_cocci_menhir.mly"
        (Data.clt)
-# 48313 "parser_cocci_menhir.ml"
+# 48429 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_unary_expr_eexpr_nest_expressions_ = 
-# 1613 "parser_cocci_menhir.mly"
+# 1650 "parser_cocci_menhir.mly"
       ( Ast0.wrap(Ast0.Infix (_2, P.clt2mcode Ast.Inc _1)) )
-# 48320 "parser_cocci_menhir.ml"
+# 48436 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -48341,16 +48457,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _2 : 'tv_unary_expr_bis = Obj.magic _2 in
         let _1 : (
-# 157 "parser_cocci_menhir.mly"
+# 183 "parser_cocci_menhir.mly"
        (Data.clt)
-# 48347 "parser_cocci_menhir.ml"
+# 48463 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_unary_expr_eexpr_nest_expressions_ = 
-# 1615 "parser_cocci_menhir.mly"
+# 1652 "parser_cocci_menhir.mly"
       ( Ast0.wrap(Ast0.Infix (_2, P.clt2mcode Ast.Dec _1)) )
-# 48354 "parser_cocci_menhir.ml"
+# 48470 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -48378,9 +48494,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_unary_expr_eexpr_nest_expressions_ = 
-# 1617 "parser_cocci_menhir.mly"
+# 1654 "parser_cocci_menhir.mly"
       ( let mcode = _1 in Ast0.wrap(Ast0.Unary(_2, mcode)) )
-# 48384 "parser_cocci_menhir.ml"
+# 48500 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -48405,17 +48521,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _2 : 'tv_unary_expr_bis = Obj.magic _2 in
         let _1 : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
-# 48411 "parser_cocci_menhir.ml"
+# 48527 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_unary_expr_eexpr_nest_expressions_ = 
-# 1619 "parser_cocci_menhir.mly"
+# 1656 "parser_cocci_menhir.mly"
       ( let mcode = P.clt2mcode Ast.Not _1 in
       Ast0.wrap(Ast0.Unary(_2, mcode)) )
-# 48419 "parser_cocci_menhir.ml"
+# 48535 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -48440,16 +48556,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _2 : 'tv_unary_expr_bis = Obj.magic _2 in
         let _1 : (
-# 126 "parser_cocci_menhir.mly"
+# 152 "parser_cocci_menhir.mly"
        (Data.clt)
-# 48446 "parser_cocci_menhir.ml"
+# 48562 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_unary_expr_eexpr_nest_expressions_ = 
-# 1622 "parser_cocci_menhir.mly"
+# 1659 "parser_cocci_menhir.mly"
       ( Ast0.wrap(Ast0.SizeOfExpr (P.clt2mcode "sizeof" _1, _2)) )
-# 48453 "parser_cocci_menhir.ml"
+# 48569 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -48483,29 +48599,29 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let rp : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
-# 48489 "parser_cocci_menhir.ml"
+# 48605 "parser_cocci_menhir.ml"
         ) = Obj.magic rp in
         let t : 'tv_ctype = Obj.magic t in
         let lp : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
-# 48495 "parser_cocci_menhir.ml"
+# 48611 "parser_cocci_menhir.ml"
         ) = Obj.magic lp in
         let s : (
-# 126 "parser_cocci_menhir.mly"
+# 152 "parser_cocci_menhir.mly"
        (Data.clt)
-# 48500 "parser_cocci_menhir.ml"
+# 48616 "parser_cocci_menhir.ml"
         ) = Obj.magic s in
         let _startpos = _startpos_s_ in
         let _endpos = _endpos_rp_ in
         let _v : 'tv_unary_expr_eexpr_nest_expressions_ = 
-# 1624 "parser_cocci_menhir.mly"
+# 1661 "parser_cocci_menhir.mly"
       ( Ast0.wrap(Ast0.SizeOfType (P.clt2mcode "sizeof" s,
                                    P.clt2mcode "(" lp,t,
                                    P.clt2mcode ")" rp)) )
-# 48509 "parser_cocci_menhir.ml"
+# 48625 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -48527,9 +48643,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_unary_expr_expr_invalid_ = 
-# 1611 "parser_cocci_menhir.mly"
+# 1648 "parser_cocci_menhir.mly"
                                          ( _1 )
-# 48533 "parser_cocci_menhir.ml"
+# 48649 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -48554,16 +48670,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _2 : 'tv_unary_expr_bis = Obj.magic _2 in
         let _1 : (
-# 157 "parser_cocci_menhir.mly"
+# 183 "parser_cocci_menhir.mly"
        (Data.clt)
-# 48560 "parser_cocci_menhir.ml"
+# 48676 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_unary_expr_expr_invalid_ = 
-# 1613 "parser_cocci_menhir.mly"
+# 1650 "parser_cocci_menhir.mly"
       ( Ast0.wrap(Ast0.Infix (_2, P.clt2mcode Ast.Inc _1)) )
-# 48567 "parser_cocci_menhir.ml"
+# 48683 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -48588,16 +48704,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _2 : 'tv_unary_expr_bis = Obj.magic _2 in
         let _1 : (
-# 157 "parser_cocci_menhir.mly"
+# 183 "parser_cocci_menhir.mly"
        (Data.clt)
-# 48594 "parser_cocci_menhir.ml"
+# 48710 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_unary_expr_expr_invalid_ = 
-# 1615 "parser_cocci_menhir.mly"
+# 1652 "parser_cocci_menhir.mly"
       ( Ast0.wrap(Ast0.Infix (_2, P.clt2mcode Ast.Dec _1)) )
-# 48601 "parser_cocci_menhir.ml"
+# 48717 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -48625,9 +48741,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_unary_expr_expr_invalid_ = 
-# 1617 "parser_cocci_menhir.mly"
+# 1654 "parser_cocci_menhir.mly"
       ( let mcode = _1 in Ast0.wrap(Ast0.Unary(_2, mcode)) )
-# 48631 "parser_cocci_menhir.ml"
+# 48747 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -48652,17 +48768,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _2 : 'tv_unary_expr_bis = Obj.magic _2 in
         let _1 : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
-# 48658 "parser_cocci_menhir.ml"
+# 48774 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_unary_expr_expr_invalid_ = 
-# 1619 "parser_cocci_menhir.mly"
+# 1656 "parser_cocci_menhir.mly"
       ( let mcode = P.clt2mcode Ast.Not _1 in
       Ast0.wrap(Ast0.Unary(_2, mcode)) )
-# 48666 "parser_cocci_menhir.ml"
+# 48782 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -48687,16 +48803,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _2 : 'tv_unary_expr_bis = Obj.magic _2 in
         let _1 : (
-# 126 "parser_cocci_menhir.mly"
+# 152 "parser_cocci_menhir.mly"
        (Data.clt)
-# 48693 "parser_cocci_menhir.ml"
+# 48809 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_unary_expr_expr_invalid_ = 
-# 1622 "parser_cocci_menhir.mly"
+# 1659 "parser_cocci_menhir.mly"
       ( Ast0.wrap(Ast0.SizeOfExpr (P.clt2mcode "sizeof" _1, _2)) )
-# 48700 "parser_cocci_menhir.ml"
+# 48816 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -48730,29 +48846,29 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let rp : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
-# 48736 "parser_cocci_menhir.ml"
+# 48852 "parser_cocci_menhir.ml"
         ) = Obj.magic rp in
         let t : 'tv_ctype = Obj.magic t in
         let lp : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
-# 48742 "parser_cocci_menhir.ml"
+# 48858 "parser_cocci_menhir.ml"
         ) = Obj.magic lp in
         let s : (
-# 126 "parser_cocci_menhir.mly"
+# 152 "parser_cocci_menhir.mly"
        (Data.clt)
-# 48747 "parser_cocci_menhir.ml"
+# 48863 "parser_cocci_menhir.ml"
         ) = Obj.magic s in
         let _startpos = _startpos_s_ in
         let _endpos = _endpos_rp_ in
         let _v : 'tv_unary_expr_expr_invalid_ = 
-# 1624 "parser_cocci_menhir.mly"
+# 1661 "parser_cocci_menhir.mly"
       ( Ast0.wrap(Ast0.SizeOfType (P.clt2mcode "sizeof" s,
                                    P.clt2mcode "(" lp,t,
                                    P.clt2mcode ")" rp)) )
-# 48756 "parser_cocci_menhir.ml"
+# 48872 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -48774,9 +48890,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_unary_expr_bis = 
-# 1630 "parser_cocci_menhir.mly"
+# 1667 "parser_cocci_menhir.mly"
                                                           ( _1 )
-# 48780 "parser_cocci_menhir.ml"
+# 48896 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -48801,16 +48917,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _2 : 'tv_unary_expr_bis = Obj.magic _2 in
         let _1 : (
-# 157 "parser_cocci_menhir.mly"
+# 183 "parser_cocci_menhir.mly"
        (Data.clt)
-# 48807 "parser_cocci_menhir.ml"
+# 48923 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_unary_expr_bis = 
-# 1632 "parser_cocci_menhir.mly"
+# 1669 "parser_cocci_menhir.mly"
       ( Ast0.wrap(Ast0.Infix (_2, P.clt2mcode Ast.Inc _1)) )
-# 48814 "parser_cocci_menhir.ml"
+# 48930 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -48835,16 +48951,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _2 : 'tv_unary_expr_bis = Obj.magic _2 in
         let _1 : (
-# 157 "parser_cocci_menhir.mly"
+# 183 "parser_cocci_menhir.mly"
        (Data.clt)
-# 48841 "parser_cocci_menhir.ml"
+# 48957 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_unary_expr_bis = 
-# 1634 "parser_cocci_menhir.mly"
+# 1671 "parser_cocci_menhir.mly"
       ( Ast0.wrap(Ast0.Infix (_2, P.clt2mcode Ast.Dec _1)) )
-# 48848 "parser_cocci_menhir.ml"
+# 48964 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -48872,9 +48988,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_unary_expr_bis = 
-# 1636 "parser_cocci_menhir.mly"
+# 1673 "parser_cocci_menhir.mly"
       ( let mcode = _1 in Ast0.wrap(Ast0.Unary(_2, mcode)) )
-# 48878 "parser_cocci_menhir.ml"
+# 48994 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -48899,17 +49015,17 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _2 : 'tv_unary_expr_bis = Obj.magic _2 in
         let _1 : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
-# 48905 "parser_cocci_menhir.ml"
+# 49021 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_unary_expr_bis = 
-# 1638 "parser_cocci_menhir.mly"
+# 1675 "parser_cocci_menhir.mly"
       ( let mcode = P.clt2mcode Ast.Not _1 in
       Ast0.wrap(Ast0.Unary(_2, mcode)) )
-# 48913 "parser_cocci_menhir.ml"
+# 49029 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -48934,16 +49050,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           } = _menhir_stack in
         let _2 : 'tv_unary_expr_bis = Obj.magic _2 in
         let _1 : (
-# 126 "parser_cocci_menhir.mly"
+# 152 "parser_cocci_menhir.mly"
        (Data.clt)
-# 48940 "parser_cocci_menhir.ml"
+# 49056 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_unary_expr_bis = 
-# 1641 "parser_cocci_menhir.mly"
+# 1678 "parser_cocci_menhir.mly"
       ( Ast0.wrap(Ast0.SizeOfExpr (P.clt2mcode "sizeof" _1, _2)) )
-# 48947 "parser_cocci_menhir.ml"
+# 49063 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -48977,29 +49093,29 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
             };
           } = _menhir_stack in
         let rp : (
-# 149 "parser_cocci_menhir.mly"
+# 175 "parser_cocci_menhir.mly"
        (Data.clt)
-# 48983 "parser_cocci_menhir.ml"
+# 49099 "parser_cocci_menhir.ml"
         ) = Obj.magic rp in
         let t : 'tv_ctype = Obj.magic t in
         let lp : (
-# 148 "parser_cocci_menhir.mly"
+# 174 "parser_cocci_menhir.mly"
        (Data.clt)
-# 48989 "parser_cocci_menhir.ml"
+# 49105 "parser_cocci_menhir.ml"
         ) = Obj.magic lp in
         let s : (
-# 126 "parser_cocci_menhir.mly"
+# 152 "parser_cocci_menhir.mly"
        (Data.clt)
-# 48994 "parser_cocci_menhir.ml"
+# 49110 "parser_cocci_menhir.ml"
         ) = Obj.magic s in
         let _startpos = _startpos_s_ in
         let _endpos = _endpos_rp_ in
         let _v : 'tv_unary_expr_bis = 
-# 1643 "parser_cocci_menhir.mly"
+# 1680 "parser_cocci_menhir.mly"
       ( Ast0.wrap(Ast0.SizeOfType (P.clt2mcode "sizeof" s,
                                    P.clt2mcode "(" lp,t,
                                    P.clt2mcode ")" rp)) )
-# 49003 "parser_cocci_menhir.ml"
+# 49119 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -49018,16 +49134,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 165 "parser_cocci_menhir.mly"
+# 191 "parser_cocci_menhir.mly"
        (Data.clt)
-# 49024 "parser_cocci_menhir.ml"
+# 49140 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_unary_op = 
-# 1647 "parser_cocci_menhir.mly"
+# 1684 "parser_cocci_menhir.mly"
                   ( P.clt2mcode Ast.GetRef _1 )
-# 49031 "parser_cocci_menhir.ml"
+# 49147 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -49046,16 +49162,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 171 "parser_cocci_menhir.mly"
+# 197 "parser_cocci_menhir.mly"
        (Data.clt)
-# 49052 "parser_cocci_menhir.ml"
+# 49168 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_unary_op = 
-# 1648 "parser_cocci_menhir.mly"
+# 1685 "parser_cocci_menhir.mly"
            ( P.clt2mcode Ast.DeRef _1 )
-# 49059 "parser_cocci_menhir.ml"
+# 49175 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -49074,16 +49190,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 170 "parser_cocci_menhir.mly"
+# 196 "parser_cocci_menhir.mly"
        (Data.clt)
-# 49080 "parser_cocci_menhir.ml"
+# 49196 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_unary_op = 
-# 1649 "parser_cocci_menhir.mly"
+# 1686 "parser_cocci_menhir.mly"
            ( P.clt2mcode Ast.UnPlus _1 )
-# 49087 "parser_cocci_menhir.ml"
+# 49203 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -49102,16 +49218,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 170 "parser_cocci_menhir.mly"
+# 196 "parser_cocci_menhir.mly"
        (Data.clt)
-# 49108 "parser_cocci_menhir.ml"
+# 49224 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_unary_op = 
-# 1650 "parser_cocci_menhir.mly"
+# 1687 "parser_cocci_menhir.mly"
            ( P.clt2mcode Ast.UnMinus _1 )
-# 49115 "parser_cocci_menhir.ml"
+# 49231 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -49130,16 +49246,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 171 "parser_cocci_menhir.mly"
+# 197 "parser_cocci_menhir.mly"
        (Data.clt)
-# 49136 "parser_cocci_menhir.ml"
+# 49252 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_unary_op = 
-# 1651 "parser_cocci_menhir.mly"
+# 1688 "parser_cocci_menhir.mly"
            ( P.clt2mcode Ast.Tilde _1 )
-# 49143 "parser_cocci_menhir.ml"
+# 49259 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -49167,9 +49283,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_when_start = 
-# 2312 "parser_cocci_menhir.mly"
+# 2349 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.DOTS((Ast0.wrap(Ast0.Exp(_1)))::_2)) )
-# 49173 "parser_cocci_menhir.ml"
+# 49289 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -49197,9 +49313,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__2_ in
         let _v : 'tv_when_start = 
-# 2314 "parser_cocci_menhir.mly"
+# 2351 "parser_cocci_menhir.mly"
     ( Ast0.wrap(Ast0.DOTS(_1@_2)) )
-# 49203 "parser_cocci_menhir.ml"
+# 49319 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -49221,9 +49337,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos_w_ in
         let _endpos = _endpos_w_ in
         let _v : 'tv_whenppdecs = 
-# 1156 "parser_cocci_menhir.mly"
+# 1182 "parser_cocci_menhir.mly"
     ( w )
-# 49227 "parser_cocci_menhir.ml"
+# 49343 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -49257,9 +49373,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__4_ in
         let _v : 'tv_whens_when_start_rule_elem_statement_any_strict_ = 
-# 2359 "parser_cocci_menhir.mly"
+# 2396 "parser_cocci_menhir.mly"
                                          ( [Ast0.WhenNot w] )
-# 49263 "parser_cocci_menhir.ml"
+# 49379 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -49293,9 +49409,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__4_ in
         let _v : 'tv_whens_when_start_rule_elem_statement_any_strict_ = 
-# 2360 "parser_cocci_menhir.mly"
+# 2397 "parser_cocci_menhir.mly"
                                              ( [Ast0.WhenAlways w] )
-# 49299 "parser_cocci_menhir.ml"
+# 49415 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -49325,9 +49441,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__3_ in
         let _v : 'tv_whens_when_start_rule_elem_statement_any_strict_ = 
-# 2362 "parser_cocci_menhir.mly"
+# 2399 "parser_cocci_menhir.mly"
       ( List.map (function x -> Ast0.WhenModifier(x)) _2 )
-# 49331 "parser_cocci_menhir.ml"
+# 49447 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -49361,9 +49477,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__4_ in
         let _v : 'tv_whens_when_start_rule_elem_statement_any_strict_ = 
-# 2363 "parser_cocci_menhir.mly"
+# 2400 "parser_cocci_menhir.mly"
                                         ( [Ast0.WhenNotTrue e] )
-# 49367 "parser_cocci_menhir.ml"
+# 49483 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -49397,9 +49513,9 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__4_ in
         let _v : 'tv_whens_when_start_rule_elem_statement_any_strict_ = 
-# 2364 "parser_cocci_menhir.mly"
+# 2401 "parser_cocci_menhir.mly"
                                          ( [Ast0.WhenNotFalse e] )
-# 49403 "parser_cocci_menhir.ml"
+# 49519 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -49418,16 +49534,16 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
           MenhirLib.EngineTypes.next = _menhir_stack;
           } = _menhir_stack in
         let _1 : (
-# 127 "parser_cocci_menhir.mly"
+# 153 "parser_cocci_menhir.mly"
        (string * Data.clt)
-# 49424 "parser_cocci_menhir.ml"
+# 49540 "parser_cocci_menhir.ml"
         ) = Obj.magic _1 in
         let _startpos = _startpos__1_ in
         let _endpos = _endpos__1_ in
         let _v : 'tv_wrapped_sym_ident = 
-# 1785 "parser_cocci_menhir.mly"
+# 1822 "parser_cocci_menhir.mly"
          ( Ast0.wrap(Ast0.Id(P.sym2mcode _1)) )
-# 49431 "parser_cocci_menhir.ml"
+# 49547 "parser_cocci_menhir.ml"
          in
         _menhir_env.MenhirLib.EngineTypes.stack <- {
           MenhirLib.EngineTypes.state = _menhir_s;
@@ -49448,106 +49564,106 @@ module MenhirInterpreter = MenhirLib.TableInterpreter.Make (struct
 
 let rec script_meta_main =
   fun lexer lexbuf ->
-    (Obj.magic (MenhirInterpreter.entry 2195 lexer lexbuf) : (
-# 233 "parser_cocci_menhir.mly"
+    (Obj.magic (MenhirInterpreter.entry 2202 lexer lexbuf) : (
+# 259 "parser_cocci_menhir.mly"
        ((string option (*string*) * string option (*ast*)) * (Ast_cocci.meta_name * Ast_cocci.metavar) option)
-# 49455 "parser_cocci_menhir.ml"
+# 49571 "parser_cocci_menhir.ml"
     ))
 
 and rule_name =
   fun lexer lexbuf ->
-    (Obj.magic (MenhirInterpreter.entry 2118 lexer lexbuf) : (
-# 227 "parser_cocci_menhir.mly"
+    (Obj.magic (MenhirInterpreter.entry 2125 lexer lexbuf) : (
+# 253 "parser_cocci_menhir.mly"
       (Ast_cocci.rulename)
-# 49463 "parser_cocci_menhir.ml"
+# 49579 "parser_cocci_menhir.ml"
     ))
 
 and reinit =
   fun lexer lexbuf ->
-    (Obj.magic (MenhirInterpreter.entry 2116 lexer lexbuf) : (
-# 205 "parser_cocci_menhir.mly"
+    (Obj.magic (MenhirInterpreter.entry 2123 lexer lexbuf) : (
+# 231 "parser_cocci_menhir.mly"
       (unit)
-# 49471 "parser_cocci_menhir.ml"
+# 49587 "parser_cocci_menhir.ml"
     ))
 
 and plus_main =
   fun lexer lexbuf ->
-    (Obj.magic (MenhirInterpreter.entry 2080 lexer lexbuf) : (
-# 214 "parser_cocci_menhir.mly"
+    (Obj.magic (MenhirInterpreter.entry 2087 lexer lexbuf) : (
+# 240 "parser_cocci_menhir.mly"
       (Ast0_cocci.rule)
-# 49479 "parser_cocci_menhir.ml"
+# 49595 "parser_cocci_menhir.ml"
     ))
 
 and plus_exp_main =
   fun lexer lexbuf ->
-    (Obj.magic (MenhirInterpreter.entry 2072 lexer lexbuf) : (
-# 217 "parser_cocci_menhir.mly"
+    (Obj.magic (MenhirInterpreter.entry 2079 lexer lexbuf) : (
+# 243 "parser_cocci_menhir.mly"
       (Ast0_cocci.rule)
-# 49487 "parser_cocci_menhir.ml"
+# 49603 "parser_cocci_menhir.ml"
     ))
 
 and never_used =
   fun lexer lexbuf ->
-    (Obj.magic (MenhirInterpreter.entry 2066 lexer lexbuf) : (
-# 242 "parser_cocci_menhir.mly"
+    (Obj.magic (MenhirInterpreter.entry 2073 lexer lexbuf) : (
+# 268 "parser_cocci_menhir.mly"
       (unit)
-# 49495 "parser_cocci_menhir.ml"
+# 49611 "parser_cocci_menhir.ml"
     ))
 
 and minus_main =
   fun lexer lexbuf ->
-    (Obj.magic (MenhirInterpreter.entry 1981 lexer lexbuf) : (
-# 208 "parser_cocci_menhir.mly"
+    (Obj.magic (MenhirInterpreter.entry 1988 lexer lexbuf) : (
+# 234 "parser_cocci_menhir.mly"
       (Ast0_cocci.rule)
-# 49503 "parser_cocci_menhir.ml"
+# 49619 "parser_cocci_menhir.ml"
     ))
 
 and minus_exp_main =
   fun lexer lexbuf ->
-    (Obj.magic (MenhirInterpreter.entry 1969 lexer lexbuf) : (
-# 211 "parser_cocci_menhir.mly"
+    (Obj.magic (MenhirInterpreter.entry 1976 lexer lexbuf) : (
+# 237 "parser_cocci_menhir.mly"
       (Ast0_cocci.rule)
-# 49511 "parser_cocci_menhir.ml"
+# 49627 "parser_cocci_menhir.ml"
     ))
 
 and meta_main =
   fun lexer lexbuf ->
-    (Obj.magic (MenhirInterpreter.entry 1966 lexer lexbuf) : (
-# 231 "parser_cocci_menhir.mly"
+    (Obj.magic (MenhirInterpreter.entry 1973 lexer lexbuf) : (
+# 257 "parser_cocci_menhir.mly"
       ((Ast_cocci.metavar,Ast_cocci.metavar) Common.either list)
-# 49519 "parser_cocci_menhir.ml"
+# 49635 "parser_cocci_menhir.ml"
     ))
 
 and iso_rule_name =
   fun lexer lexbuf ->
-    (Obj.magic (MenhirInterpreter.entry 1962 lexer lexbuf) : (
-# 223 "parser_cocci_menhir.mly"
+    (Obj.magic (MenhirInterpreter.entry 1969 lexer lexbuf) : (
+# 249 "parser_cocci_menhir.mly"
       (Ast_cocci.rulename)
-# 49527 "parser_cocci_menhir.ml"
+# 49643 "parser_cocci_menhir.ml"
     ))
 
 and iso_meta_main =
   fun lexer lexbuf ->
-    (Obj.magic (MenhirInterpreter.entry 1667 lexer lexbuf) : (
-# 239 "parser_cocci_menhir.mly"
+    (Obj.magic (MenhirInterpreter.entry 1674 lexer lexbuf) : (
+# 265 "parser_cocci_menhir.mly"
       ((Ast_cocci.metavar,Ast_cocci.metavar) Common.either list)
-# 49535 "parser_cocci_menhir.ml"
+# 49651 "parser_cocci_menhir.ml"
     ))
 
 and iso_main =
   fun lexer lexbuf ->
     (Obj.magic (MenhirInterpreter.entry 18 lexer lexbuf) : (
-# 236 "parser_cocci_menhir.mly"
+# 262 "parser_cocci_menhir.mly"
       (Ast0_cocci.anything list list)
-# 49543 "parser_cocci_menhir.ml"
+# 49659 "parser_cocci_menhir.ml"
     ))
 
 and include_main =
   fun lexer lexbuf ->
     (Obj.magic (MenhirInterpreter.entry 0 lexer lexbuf) : (
-# 220 "parser_cocci_menhir.mly"
+# 246 "parser_cocci_menhir.mly"
       (Data.incl_iso list)
-# 49551 "parser_cocci_menhir.ml"
+# 49667 "parser_cocci_menhir.ml"
     ))
 
 
index 448662c..2a6a7c7 100644 (file)
  */
 
 
+/*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ */
+
+
 %{
 
 (* Not clear how to allow function declarations to specify a return type
@@ -1358,6 +1384,7 @@ initialize2:
   /*arithexpr and not eexpr because can have ambiguity with comma*/
   /*dots and nests probably not allowed at top level, haven't looked into why*/
   arith_expr(eexpr,invalid) { Ast0.wrap(Ast0.InitExpr($1)) }
+| nest_expressions_only     { Ast0.wrap(Ast0.InitExpr($1)) }
 | TOBrace initialize_list TCBrace
     { if P.struct_initializer $2
     then
@@ -1497,6 +1524,16 @@ nest_expressions:
                              P.clt2mcode "...+>" c, None, true)) }
 | TMeta { tmeta_to_exp $1 }
 
+nest_expressions_only:
+  TOEllipsis e=expr_dots(TEllipsis) c=TCEllipsis
+    { Ast0.wrap(Ast0.NestExpr(P.clt2mcode "<..." $1,
+                             Ast0.wrap(Ast0.DOTS(e (P.mkedots "..."))),
+                             P.clt2mcode "...>" c, None, false)) }
+| TPOEllipsis e=expr_dots(TEllipsis) c=TPCEllipsis
+    { Ast0.wrap(Ast0.NestExpr(P.clt2mcode "<+..." $1,
+                             Ast0.wrap(Ast0.DOTS(e (P.mkedots "..."))),
+                             P.clt2mcode "...+>" c, None, true)) }
+
 //whenexp: TWhen TNotEq w=eexpr TLineEnd { w }
 
 pre_basic_expr(recurser,primary_extra):
index 76324a0..4ee2ac7 100644 (file)
  *)
 
 
+# 0 "./plus.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./plus.ml"
 (* The plus fragments are converted to a list of lists of lists.
 Innermost list: Elements have type anything.  For any pair of successive
index e5d9941..95a7c56 100644 (file)
  *)
 
 
+# 0 "./plus.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./plus.mli"
 val plus :
     Ast_cocci.rule ->
index ed7e160..8edff75 100644 (file)
  *)
 
 
+# 0 "./pretty_print_cocci.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./pretty_print_cocci.ml"
 open Format
 module Ast = Ast_cocci
@@ -210,6 +237,7 @@ let rec ident i =
   | Ast.MetaId(name,_,keep,inherited) -> mcode print_meta name
   | Ast.MetaFunc(name,_,_,_) -> mcode print_meta name
   | Ast.MetaLocalFunc(name,_,_,_) -> mcode print_meta name
+  | Ast.AsIdent(id,asid) -> ident id; print_string "@"; ident asid
   | Ast.DisjId(id_list) -> print_disj_list ident id_list
   | Ast.OptIdent(id) -> print_string "?"; ident id
   | Ast.UniqueIdent(id) -> print_string "!"; ident id
@@ -901,6 +929,9 @@ let script_header str lang deps code =
   force_newline();
   print_string "@@";
   force_newline();
+  let code =
+    String.concat "\n"
+      (Str.split (Str.regexp "[\n\r\011\012]#.*[\n\r\011\012]") code) in
   print_string code;
   force_newline()
 
index 9c26dcd..b5f9fa9 100644 (file)
  *)
 
 
+# 0 "./pretty_print_cocci.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./pretty_print_cocci.mli"
 val unparse : Ast_cocci.rule -> unit
 val unparse_to_string : Ast_cocci.rule -> string
index 6a8bc8e..699f50a 100644 (file)
  *)
 
 
+# 0 "./safe_for_multi_decls.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./safe_for_multi_decls.ml"
 (* This phase sets the safe_for_multi_decls field, which is normally false,
 to true for transformations on declarations where the only change is on the
index c961945..36b4e32 100644 (file)
  *)
 
 
+# 0 "./safe_for_multi_decls.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./safe_for_multi_decls.mli"
 val safe_for_multi_decls :
     Ast_cocci.rule_with_metavars list ->
index 6f588de..e5b9a04 100644 (file)
  *)
 
 
+# 0 "./semantic_cocci.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./semantic_cocci.ml"
 exception Semantic of string
index 7530d17..9e932ff 100644 (file)
  *)
 
 
+# 0 "./simple_assignments.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./simple_assignments.ml"
 module Ast0 = Ast0_cocci
 module Ast = Ast_cocci
index 0285031..0bbde93 100644 (file)
  *)
 
 
+# 0 "./simple_assignments.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./simple_assignments.mli"
 val simple_assignments : Ast0_cocci.rule -> Ast0_cocci.rule
index 51d6a9e..6647e44 100644 (file)
  *)
 
 
+# 0 "./single_statement.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./single_statement.ml"
 (* detect statements that are between dots in the minus code, because they
 may need a special treatment if they are if branches *)
@@ -123,6 +150,7 @@ let rec left_ident i =
   | Ast0.DisjId(_,id_list,_,_) -> List.exists left_ident id_list
   | Ast0.OptIdent(id) -> left_ident id
   | Ast0.UniqueIdent(id) -> left_ident id
+  | Ast0.AsIdent _ -> failwith "not possible"
 
 let rec right_ident i =
   modif_after i or
@@ -134,6 +162,7 @@ let rec right_ident i =
   | Ast0.DisjId(_,id_list,_,_) -> List.exists right_ident id_list
   | Ast0.OptIdent(id) -> right_ident id
   | Ast0.UniqueIdent(id) -> right_ident id
+  | Ast0.AsIdent _ -> failwith "not possible"
 
 (* --------------------------------------------------------------------- *)
 (* Expression *)
index aca701c..3c18d60 100644 (file)
  *)
 
 
+# 0 "./single_statement.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./single_statement.mli"
 val single_statement : Ast0_cocci.rule -> Ast0_cocci.rule
index df6985f..b39b86b 100644 (file)
  *)
 
 
+# 0 "./test_exps.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./test_exps.ml"
 module Ast = Ast_cocci
 module Ast0 = Ast0_cocci
index 103fad4..6b8e2cc 100644 (file)
  *)
 
 
+# 0 "./test_exps.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./test_exps.mli"
 val process : Ast0_cocci.rule -> Ast0_cocci.rule
 
index 9cf774f..57ce4cd 100644 (file)
  *)
 
 
+# 0 "./top_level.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./top_level.ml"
 (* Reorganize the top level of a rule to be a list of either top-level
 declarations or code dots.  A function declaration is always considered top
index ee91264..f4f7675 100644 (file)
  *)
 
 
+# 0 "./top_level.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./top_level.mli"
 val top_level :
     bool (* true if must be code *) -> Ast0_cocci.rule -> Ast0_cocci.rule
index 4e61e10..782a442 100644 (file)
  *)
 
 
+# 0 "./type_cocci.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./type_cocci.ml"
 (* for metavariables in general, but here because needed for metatypes *)
 type inherited = bool (* true if inherited *)
index f5f92d4..ff0cf80 100644 (file)
  *)
 
 
+# 0 "./type_cocci.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./type_cocci.mli"
 type inherited = bool (* true if inherited *)
 type keep_binding = Unitary (* need no info *)
index e49b9a4..e453424 100644 (file)
  *)
 
 
+# 0 "./type_infer.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./type_infer.ml"
 module T = Type_cocci
 module Ast = Ast_cocci
@@ -119,6 +146,7 @@ let rec propagate_types env =
        | Some t ->
            List.iter (function i -> Ast0.set_type i (Some t)) id_list;
            Some t)
+    | Ast0.AsIdent _ -> failwith "not possible"
     | _ -> k i in
 
   let strip_cv = function
@@ -130,6 +158,7 @@ let rec propagate_types env =
       T.BaseType(T.IntType)
     | T.BaseType(T.LongType)
     | T.BaseType(T.ShortType)
+    | T.BaseType(T.SizeType)
     | T.MetaType(_,_,_)
     | T.TypeName _
     | T.EnumName _
@@ -296,7 +325,8 @@ let rec propagate_types env =
     | Ast0.MetaLocalFunc(name,_,_) -> [Meta(Ast0.unwrap_mcode name)]
     | Ast0.DisjId(_,id_list,_,_)   -> List.concat (List.map strip id_list)
     | Ast0.OptIdent(id)            -> strip id
-    | Ast0.UniqueIdent(id)         -> strip id in
+    | Ast0.UniqueIdent(id)         -> strip id
+    | Ast0.AsIdent _ -> failwith "not possible" in
 
   let process_whencode notfn allfn exp = function
       Ast0.WhenNot(x) -> let _ = notfn x in ()
index aca5264..3650a98 100644 (file)
  *)
 
 
+# 0 "./type_infer.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./type_infer.mli"
 val type_infer : Ast0_cocci.rule -> unit
index 586fc8f..9a2689e 100644 (file)
  *)
 
 
+# 0 "./unify_ast.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./unify_ast.ml"
 (* --------------------------------------------------------------------- *)
 (* Given two patterns, A and B, determine whether B can match any matched
@@ -134,6 +161,13 @@ let rec unify_ident i1 i2 =
   | (_,Ast.MetaFunc(_,_,_,_))
   | (_,Ast.MetaLocalFunc(_,_,_,_)) -> return true
 
+  | (Ast.AsIdent(id1,asid1),_) ->
+      disjunct_all_bindings
+       (List.map (function x -> unify_ident x i2) [id1;asid1])
+  | (_,Ast.AsIdent(id2,asid2)) ->
+      disjunct_all_bindings
+       (List.map (function x -> unify_ident x i1) [id2;asid2])
+
   | (Ast.DisjId(i1),_) ->
       disjunct_all_bindings (List.map (function x -> unify_ident x i2) i1)
   | (_,Ast.DisjId(i2)) ->
index 1a878df..3497f9a 100644 (file)
  *)
 
 
+# 0 "./unify_ast.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./unify_ast.mli"
 type res = NO | MAYBE
 
index 976914a..e3f7499 100644 (file)
  *)
 
 
+# 0 "./unitary_ast0.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./unitary_ast0.ml"
 (* find unitary metavariables *)
 module Ast0 = Ast0_cocci
index 7d56889..2db73e8 100644 (file)
  *)
 
 
+# 0 "./unitary_ast0.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./unitary_ast0.mli"
 (* 'iso is the return type of parse_iso, which currently is
 (Ast_cocci.metavar list * Ast0_cocci.anything list list) list *)
index 8e3698e..889ece1 100644 (file)
  *)
 
 
+# 0 "./unparse_ast0.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./unparse_ast0.ml"
 open Format
 module Ast = Ast_cocci
@@ -164,7 +191,8 @@ let rec ident i =
       | Ast0.MetaLocalFunc(name,_,_) -> mcode print_meta name
       | Ast0.DisjId(_,id_list,_,_) -> do_disj id_list ident
       | Ast0.OptIdent(id) -> print_string "?"; ident id
-      | Ast0.UniqueIdent(id) -> print_string "!"; ident id)
+      | Ast0.UniqueIdent(id) -> print_string "!"; ident id
+      | Ast0.AsIdent(id,asid) -> ident id; print_string "@"; ident asid)
 
 (* --------------------------------------------------------------------- *)
 (* Expression *)
index 171c173..dd212ed 100644 (file)
  *)
 
 
+# 0 "./unparse_ast0.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./unparse_ast0.mli"
 val expression_dots : Ast0_cocci.expression Ast0_cocci.dots -> unit
 val parameter_list : Ast0_cocci.parameterTypeDef Ast0_cocci.dots -> unit
index ea01b7b..8076870 100644 (file)
  *)
 
 
+# 0 "./visitor_ast.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./visitor_ast.ml"
 module Ast0 = Ast0_cocci
 module Ast = Ast_cocci
@@ -110,6 +137,7 @@ let combiner bind option_default
       | Ast.MetaId(name,_,_,_) -> meta_mcode name
       | Ast.MetaFunc(name,_,_,_) -> meta_mcode name
       | Ast.MetaLocalFunc(name,_,_,_) -> meta_mcode name
+      |        Ast.AsIdent(id,asid) -> bind (ident id) (ident asid)
       | Ast.DisjId(id_list) -> multibind (List.map ident id_list)
       | Ast.OptIdent(id) -> ident id
       | Ast.UniqueIdent(id) -> ident id in
@@ -635,6 +663,7 @@ let rebuilder
            Ast.MetaFunc(meta_mcode name,constraints,keep,inherited)
        | Ast.MetaLocalFunc(name,constraints,keep,inherited) ->
            Ast.MetaLocalFunc(meta_mcode name,constraints,keep,inherited)
+       | Ast.AsIdent(id,asid) -> Ast.AsIdent(ident id,ident asid)
        | Ast.DisjId(id_list) -> Ast.DisjId(List.map ident id_list)
        | Ast.OptIdent(id) -> Ast.OptIdent(ident id)
        | Ast.UniqueIdent(id) -> Ast.UniqueIdent(ident id)) in
index a7acd2d..9424cbd 100644 (file)
  *)
 
 
+# 0 "./visitor_ast.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./visitor_ast.mli"
 type 'a combiner =
     {combiner_ident : Ast_cocci.ident -> 'a;
index e192694..0a26f0c 100644 (file)
  *)
 
 
+# 0 "./visitor_ast0.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./visitor_ast0.ml"
 (* --------------------------------------------------------------------- *)
 (* Generic traversal: rebuilder *)
@@ -160,7 +187,11 @@ let visitor mode bind option_default
        | Ast0.OptIdent(id) ->
            let (n,id) = ident id in (n,Ast0.OptIdent(id))
        | Ast0.UniqueIdent(id) ->
-           let (n,id) = ident id in (n,Ast0.UniqueIdent(id))) in
+           let (n,id) = ident id in (n,Ast0.UniqueIdent(id))
+       | Ast0.AsIdent(id,asid) ->
+           let (id_n,id) = ident id in
+           let (asid_n,asid) = ident asid in
+           (bind id_n asid_n, Ast0.AsIdent(id,asid))) in
     identfn all_functions k i
 
   and expression e =
index 819caf0..f32dedc 100644 (file)
  *)
 
 
+# 0 "./visitor_ast0.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./visitor_ast0.mli"
 val combiner_functions : 'a Visitor_ast0_types.combiner_functions
 val combiner :
index bca7f8e..18767cd 100644 (file)
  *)
 
 
+# 0 "./visitor_ast0_types.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./visitor_ast0_types.ml"
 module Ast0 = Ast0_cocci
 module Ast = Ast_cocci
index 215c5a7..265b17e 100644 (file)
@@ -30,6 +30,9 @@ endif
 
 TARGET = popl
 
+OCAMLCFLAGS ?= -g -dtypes
+OPTFLAGS ?= -g -dtypes
+
 SRC = ast_popl.ml asttopopl.ml insert_quantifiers.ml insert_befaft.ml \
 pretty_print_popl.ml popltoctl.ml popl.ml flag_popl.ml
 
@@ -42,12 +45,11 @@ INCLUDE_PATH = -I ../commons -I ../globals \
 #The Caml compilers.
 #for warning:  -w A
 #for profiling:  -p -inline 0   with OCAMLOPT
-OCAMLC_CMD=$(OCAMLC) -dtypes -g
-OCAMLOPT_CMD=$(OCAMLOPT) $(OPTFLAGS)
+OCAMLC_CMD=$(OCAMLC) -thread $(OCAMLCFLAGS)
+OCAMLOPT_CMD=$(OCAMLOPT) -thread $(OPTFLAGS)
 OCAMLDEP_CMD=$(OCAMLDEP)
 OCAMLMKTOP_CMD=$(OCAMLMKTOP) -g -custom
 
-
 LIB=$(TARGET).cma
 OPTLIB=$(LIB:.cma=.cmxa)
 
@@ -55,20 +57,21 @@ OBJS = $(SRC:.ml=.cmo)
 OPTOBJS = $(SRC:.ml=.cmx)
 
 all: $(LIB)
-all.opt: $(OPTLIB)
+all.opt:
+       @$(MAKE) $(OPTLIB) BUILD_OPT=yes
 
 $(TARGET).top: $(LIB)
-       $(CAMLMKTOP_CMD) -o $(TARGET).top $(SYSLIBS) $(LIBS) $(OBJS)
+       $(OCAMLMKTOP_CMD) -o $(TARGET).top $(SYSLIBS) $(LIBS) $(OBJS)
 
 $(LIB):  $(OBJS)
-       $(CAMLC_CMD) -a -o $(LIB) $(OBJS)
+       $(OCAMLC_CMD) -a -o $(LIB) $(OBJS)
 
 clean::
        rm -f $(LIB) $(TARGET).top
 
 
 $(OPTLIB): $(OPTOBJS)
-       $(CAMLOPT_CMD) -a -o $(OPTLIB) $(OPTOBJS)
+       $(OCAMLOPT_CMD) -a -o $(OPTLIB) $(OPTOBJS)
 
 # clean rule for LIB.opt
 clean::
@@ -79,13 +82,13 @@ clean::
 .SUFFIXES: .ml .mli .cmo .cmi .cmx
 
 .ml.cmo:
-       $(CAMLC_CMD) $(INCLUDE_PATH) -c $<
+       $(OCAMLC_CMD) $(INCLUDE_PATH) -c $<
 
 .mli.cmi:
-       $(CAMLC_CMD) $(INCLUDE_PATH) -c $<
+       $(OCAMLC_CMD) $(INCLUDE_PATH) -c $<
 
 .ml.cmx:
-       $(CAMLOPT_CMD) $(INCLUDE_PATH) -c $<
+       $(OCAMLOPT_CMD) $(INCLUDE_PATH) -c $<
 
 
 # clean rule for others files
@@ -98,10 +101,12 @@ distclean: clean
 
 .PHONEY: depend
 .depend depend:
-       $(CAMLDEP_CMD) $(INCLUDE_PATH) *.mli *.ml > .depend
+       $(OCAMLDEP_CMD) $(INCLUDE_PATH) *.mli *.ml > .depend
 
 ifneq ($(MAKECMDGOALS),clean)
 ifneq ($(MAKECMDGOALS),distclean)
 -include .depend
 endif
 endif
+
+include ../Makefile.common
index 09fa70f..2b507d2 100644 (file)
  *)
 
 
+# 0 "./ast_popl.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./ast_popl.ml"
 type sequence =
     Seq of element * sequence
index d02ca6a..fdd3ce4 100644 (file)
  *)
 
 
+# 0 "./asttopopl.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./asttopopl.ml"
 module Ast = Ast_cocci
 module Past = Ast_popl
index e787957..5466811 100644 (file)
  *)
 
 
+# 0 "./asttopopl.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./asttopopl.mli"
 val top : Ast_cocci.top_level -> Ast_popl.sequence
index 9358719..3ad1105 100644 (file)
  *)
 
 
+# 0 "./insert_befaft.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./insert_befaft.ml"
 module Past = Ast_popl
 
index 31f0c83..7322acb 100644 (file)
  *)
 
 
+# 0 "./insert_befaft.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./insert_befaft.mli"
 val insert_befaft : Ast_popl.sequence -> Ast_popl.sequence
index a82695f..df1d85b 100644 (file)
  *)
 
 
+# 0 "./insert_quantifiers.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./insert_quantifiers.ml"
 module Ast = Ast_cocci
 module Past = Ast_popl
index 0df0cab..05a244b 100644 (file)
  *)
 
 
+# 0 "./insert_quantifiers.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./insert_quantifiers.mli"
 val insert_quantifiers : Ast_popl.sequence -> Ast_popl.sequence
index 63c75d9..5e12fa9 100644 (file)
  *)
 
 
+# 0 "./popl.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./popl.ml"
 type cocci_predicate = Lib_engine.predicate * Ast_cocci.meta_name Ast_ctl.modif
 type formula =
index 0572d47..87b7d13 100644 (file)
  *)
 
 
+# 0 "./popl.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./popl.mli"
 type cocci_predicate = Lib_engine.predicate * Ast_cocci.meta_name Ast_ctl.modif
 type formula =
index 8134396..c972c70 100644 (file)
  *)
 
 
+# 0 "./popltoctl.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./popltoctl.ml"
 module Past = Ast_popl
 module Ast = Ast_cocci
index 96d88e3..b7b3dc1 100644 (file)
  *)
 
 
+# 0 "./popltoctl.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./popltoctl.mli"
 type cocci_predicate = Lib_engine.predicate * Ast_cocci.meta_name Ast_ctl.modif
 type formula =
index d0e9b9f..3a9e352 100644 (file)
  *)
 
 
+# 0 "./pretty_print_popl.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./pretty_print_popl.ml"
 open Format
 module Past = Ast_popl
index d62c4c6..04a3c08 100644 (file)
  *)
 
 
+# 0 "./pretty_print_popl.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./pretty_print_popl.mli"
 val pretty_print : Ast_popl.sequence -> unit
 val pretty_print_e : Ast_popl.element -> unit
index 5cfc0b5..631e9b9 100644 (file)
@@ -30,6 +30,9 @@ endif
 
 TARGET = popl
 
+OCAMLCFLAGS ?= -g -dtypes
+OPTFLAGS ?= -g -dtypes
+
 SRC = ast_popl.ml asttopopl.ml insert_quantifiers.ml \
 pretty_print_popl.ml flag_popl.ml popltoctl.ml popl.ml
 
@@ -42,9 +45,8 @@ INCLUDES = -I ../commons -I ../globals \
 #The Caml compilers.
 #for warning:  -w A
 #for profiling:  -p -inline 0   with OCAMLOPT
-OCAMLCFLAGS ?= -g -dtypes
-OCAMLC_CMD=$(OCAMLC) $(OCAMLCFLAGS) $(INCLUDES)
-OCAMLOPT_CMD=$(OCAMLOPT) $(OPTFLAGS) $(INCLUDES)
+OCAMLC_CMD=$(OCAMLC) -thread $(OCAMLCFLAGS) $(INCLUDES)
+OCAMLOPT_CMD=$(OCAMLOPT) -thread $(OPTFLAGS) $(INCLUDES)
 OCAMLDEP_CMD=$(OCAMLDEP) $(INCLUDES)
 OCAMLMKTOP_CMD=$(OCAMLMKTOP) -g -custom $(INCLUDES)
 
@@ -55,7 +57,8 @@ OBJS = $(SRC:.ml=.cmo)
 OPTOBJS = $(SRC:.ml=.cmx)
 
 all: $(LIB)
-all.opt: $(OPTLIB)
+all.opt:
+       @$(MAKE) $(OPTLIB) BUILD_OPT=yes
 
 $(TARGET).top: $(LIB)
        $(OCAMLMKTOP_CMD) -o $(TARGET).top $(SYSLIBS) $(LIBS) $(OBJS)
@@ -105,3 +108,5 @@ ifneq ($(MAKECMDGOALS),distclean)
 -include .depend
 endif
 endif
+
+include ../Makefile.common
index 4b3a62f..9d1fa5b 100644 (file)
  *)
 
 
+# 0 "./ast_popl.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./ast_popl.ml"
 type sequence =
     Seq of element * sequence
index b86b1d4..0707a89 100644 (file)
  *)
 
 
+# 0 "./asttopopl.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./asttopopl.ml"
 module Ast = Ast_cocci
 module Past = Ast_popl
index e787957..5466811 100644 (file)
  *)
 
 
+# 0 "./asttopopl.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./asttopopl.mli"
 val top : Ast_cocci.top_level -> Ast_popl.sequence
index e7a15c3..1bc7cde 100644 (file)
  *)
 
 
+# 0 "./flag_popl.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./flag_popl.ml"
 let mark_all = ref false
 let keep_all_wits = ref false
index badef2c..6e70919 100644 (file)
  *)
 
 
+# 0 "./insert_quantifiers.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./insert_quantifiers.ml"
 module Ast = Ast_cocci
 module Past = Ast_popl
index 0df0cab..05a244b 100644 (file)
  *)
 
 
+# 0 "./insert_quantifiers.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./insert_quantifiers.mli"
 val insert_quantifiers : Ast_popl.sequence -> Ast_popl.sequence
index fb4eff5..7f8da5a 100644 (file)
  *)
 
 
+# 0 "./popl.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./popl.ml"
 type cocci_predicate = Lib_engine.predicate * Ast_cocci.meta_name Ast_ctl.modif
 type formula =
index 0572d47..87b7d13 100644 (file)
  *)
 
 
+# 0 "./popl.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./popl.mli"
 type cocci_predicate = Lib_engine.predicate * Ast_cocci.meta_name Ast_ctl.modif
 type formula =
index 46f4ed6..d91d761 100644 (file)
  *)
 
 
+# 0 "./popltoctl.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./popltoctl.ml"
 module Past = Ast_popl
 module Ast = Ast_cocci
index 96d88e3..b7b3dc1 100644 (file)
  *)
 
 
+# 0 "./popltoctl.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./popltoctl.mli"
 type cocci_predicate = Lib_engine.predicate * Ast_cocci.meta_name Ast_ctl.modif
 type formula =
index fc595e1..ff8495f 100644 (file)
  *)
 
 
+# 0 "./pretty_print_popl.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./pretty_print_popl.ml"
 open Format
 module Past = Ast_popl
index d62c4c6..04a3c08 100644 (file)
  *)
 
 
+# 0 "./pretty_print_popl.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./pretty_print_popl.mli"
 val pretty_print : Ast_popl.sequence -> unit
 val pretty_print_e : Ast_popl.element -> unit
index c935e33..3981f56 100644 (file)
@@ -34,6 +34,9 @@ endif
 ##############################################################################
 TARGET=coccipython
 
+OCAMLCFLAGS ?= -g -dtypes
+OPTFLAGS ?= -g -dtypes
+
 SOURCES= pycocci_aux.ml $(PYCOCCI_FILE) pycocci.ml
 
 INCLUDEDIRS_LOCAL = ../commons ../commons/ocamlextra ../globals \
@@ -56,9 +59,8 @@ INCLUDES_DEPEND=$(INCLUDEDIRS_LOCAL:%=-I %) $(INCLUDESEXTRA)
 ##############################################################################
 
 # The Caml compilers.
-OCAMLCFLAGS ?= -g -dtypes
-OCAMLC_CMD=$(OCAMLC) $(OCAMLCFLAGS) $(INCLUDES)
-OCAMLOPT_CMD=$(OCAMLOPT) $(OPTFLAGS) $(INCLUDES)
+OCAMLC_CMD=$(OCAMLC) -thread $(OCAMLCFLAGS) $(INCLUDES)
+OCAMLOPT_CMD=$(OCAMLOPT) -thread $(OPTFLAGS) $(INCLUDES)
 OCAMLDEP_CMD=$(OCAMLDEP) $(INCLUDES_DEPEND)
 OCAMLMKTOP_CMD=$(OCAMLMKTOP) -g -custom $(INCLUDES)
 
@@ -80,7 +82,8 @@ CTLOPTOBJS = $(CTLOBJS:.cmo=.cmx)
 
 all: $(LIB)
 
-all.opt: $(OPTLIB)
+all.opt:
+       @$(MAKE) $(OPTLIB) BUILD_OPT=yes
 
 ctl: $(CTLEXEC)
 
@@ -145,3 +148,5 @@ ifneq ($(MAKECMDGOALS),distclean)
 -include .depend
 endif
 endif
+
+include ../Makefile.common
index 6b27918..e4a9462 100644 (file)
@@ -1,5 +1,9 @@
 MAKESUBDIRS=coccigui
 
+ifneq ($(MAKECMDGOALS),distclean)
+include ../../Makefile.config
+endif
+
 all:
 all.opt:
 
@@ -7,6 +11,9 @@ depend:
 
 clean:
        set -e; for i in $(MAKESUBDIRS); do $(MAKE) -C $$i clean; done
+       rm -rf __pycache__
        rm -f *.pyc
 
 distclean: clean
+
+include ../../Makefile.common
index 0fb9ff3..b17aa16 100644 (file)
@@ -97,7 +97,7 @@ class VimCallback(object):
         p = Project(self.svc.boss.cmd('buffer', 'get_current').directory)
         c = PythonCodeAssist(p)
         co = c.assist(buffer, offset).completions
-        print co
+        print(co)
         for comp in co:
             self.svc._com.add_completion(server, comp.name)
         # do this a few times
index a72a464..67b9b08 100644 (file)
@@ -609,7 +609,7 @@ class communication_window(gtk.Window):
         self.send_ex(server, 'w')
 
     def save_as(self, server, filename):
-        print filename
+        print(filename)
         self.send_ex(server, 'saveas %s' % filename)
 
     def undo(self, server):
@@ -715,14 +715,14 @@ class communication_window(gtk.Window):
             evt, d = data.split(sep, 1)
             self.vim_event(server, evt, d)
         else:
-            print 'bad async reply', data
+            print('bad async reply', data)
 
     def vim_event(self, server, evt, d):
         funcname = 'vim_%s' % evt
         if hasattr(self.cb, funcname):
             getattr(self.cb, funcname)(server, *d.split(chr(4)))
         else:
-            print 'unhandled event', evt
+            print('unhandled event', evt)
 
 VimCom = communication_window
 
index 43a797e..3bc8fff 100644 (file)
@@ -228,7 +228,7 @@ class vim_editor(object):
                                             document=doc, dorefresh=True)
 
     def vim_started(self, server):
-        print 'started'
+        print('started')
 
     def vim_filesave(self, server, *args):
         self.boss.call_command('buffermanager', 'reset_current_document')
index 0394a3b..96e6531 100644 (file)
@@ -4,7 +4,7 @@ def build_link(p, msg, color) :
 def print_todo(p, msg="", color="ovl-face1") :
        if msg == "" : msg = "%s::%s" % (p.file,p.line)
        link = build_link(p, msg, color)
-       print "* TODO %s" % (link)
+       print ("* TODO %s" % (link))
 
 def print_link(p, msg="", color="ovl-face1") :
        if msg == "" : msg = "%s::%s" % (p.file,p.line)
index 089e1e5..3c56d79 100644 (file)
@@ -47,7 +47,7 @@ class Console(Output):
                self.include_match(include)
                if include:
                        for variable, message in messages:
-                               print "%s:%s:%s: %s - %s" % (variable.location.file, variable.location.line, variable.location.column, message, variable)
+                               print("%s:%s:%s: %s - %s" % (variable.location.file, variable.location.line, variable.location.column, message, variable))
 
 from threading import Thread
 class GtkRunner(Thread):
index ac6ccf2..1a16dcd 100644 (file)
@@ -2,4 +2,4 @@ def build_report(p, msg) :
        return "%s:%s:%s-%s: %s" % (p.file,p.line,p.column,p.column_end,msg)
 
 def print_report(p, msg="ERROR") :
-       print build_report(p, msg)
+       print(build_report(p, msg))
index 1eb427c..7d01c3c 100644 (file)
  *)
 
 
+# 0 "./no_pycocci.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./no_pycocci.ml"
 open Ast_c
 open Common
index 270ef71..b23448a 100644 (file)
  *)
 
 
+# 0 "./pycocci.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./pycocci.mli"
 val build_classes : Ast_cocci.meta_name list -> unit
 val construct_variables :
index 72f1884..5ba7a9c 100644 (file)
  *)
 
 
+# 0 "./pycocci_aux.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./pycocci_aux.ml"
 open Ast_c
 open Common
index 2b5c2e6..c821436 100644 (file)
  *)
 
 
+# 0 "./pycocci_aux.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./pycocci_aux.mli"
 val exprlistrep : Ast_c.argument Ast_c.wrap2 list -> string * string list
 val paramlistrep : Ast_c.parameterType Ast_c.wrap2 list -> string * string list
index f36eebf..cc6eda4 100644 (file)
  *)
 
 
+# 0 "./yes_pycocci.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./yes_pycocci.ml"
 open Ast_c
 open Common
@@ -57,14 +84,16 @@ let _pycocci_tuple6 (a,b,c,d,e,f) =
 
 (* ------------------------------------------------------------------- *)
 
-let check_return_value v =
+let check_return_value msg v =
   if v =*= (pynull ()) then
          (pyerr_print ();
+         Common.pr2 ("while " ^ msg ^ ":");
          raise Pycocciexception)
   else ()
-let check_int_return_value v =
+let check_int_return_value msg v =
   if v =|= -1 then
          (pyerr_print ();
+          Common.pr2 ("while " ^ msg ^ ":");
          raise Pycocciexception)
   else ()
 
@@ -87,8 +116,9 @@ let is_module_loaded module_name =
 
 let load_module module_name =
   if not (is_module_loaded module_name) then
+    (* let _ = Sys.command("python3 -c 'import " ^ module_name ^ "'") in *)
     let m = pyimport_importmodule module_name in
-    check_return_value m;
+    check_return_value ("importing module " ^ module_name) m;
     (module_map := (StringMap.add module_name m (!module_map));
     m)
   else get_module module_name
@@ -105,14 +135,14 @@ let pycocci_get_class_type fqn =
   let (module_name, class_name) = split_fqn fqn in
   let m = get_module module_name in
   let attr = pyobject_getattrstring(m, class_name) in
-  check_return_value attr;
+  check_return_value "obtaining a python class type" attr;
   attr
 
 let pycocci_instantiate_class fqn args =
   let class_type = pycocci_get_class_type fqn in
   let obj =
     pyeval_callobjectwithkeywords(class_type, args, pynull()) in
-  check_return_value obj;
+  check_return_value "instantiating a python class" obj;
   obj
 
 (* end python interaction *)
@@ -122,7 +152,7 @@ let exited = ref false
 
 let include_match v =
   let truth = pyobject_istrue (pytuple_getitem (v, 1)) in
-  check_int_return_value truth;
+  check_int_return_value "testing include_match" truth;
   inc_match := truth != 0;
   _pycocci_none ()
 
@@ -133,18 +163,18 @@ let sp_exit _ =
 let build_method (mname, camlfunc, args) pymodule classx classdict =
   let cmx = pymethod_new(pywrap_closure camlfunc, args, classx) in
   let v = pydict_setitemstring(classdict, mname, cmx) in
-  check_int_return_value v;
+  check_int_return_value ("building python method " ^ mname) v;
   ()
 
 let build_class cname parent methods pymodule =
   let cd = pydict_new() in
-  check_return_value cd;
+  check_return_value "creating a new python dictionary" cd;
   let cx = pyclass_new(pytuple_fromsingle (pycocci_get_class_type parent), cd,
                       pystring_fromstring cname) in
-  check_return_value cx;
+  check_return_value "creating a new python class" cx;
   List.iter (function meth -> build_method meth pymodule cx cd) methods;
   let v = pydict_setitemstring(pymodule_getdict pymodule, cname, cx) in
-  check_int_return_value v;
+  check_int_return_value ("adding python class " ^ cname) v;
   (cd, cx)
 
 let the_environment = ref []
@@ -175,14 +205,17 @@ let pycocci_init () =
   (* initialize *)
   if not !initialised then (
   initialised := true;
-  Unix.putenv "PYTHONPATH"
-      (Printf.sprintf "%s/coccinelle" (Unix.getenv "HOME"));
+  (* use python_path_base as default (overridable) dir for coccilib *)
+  let python_path_base = Printf.sprintf "%s/coccinelle" (Unix.getenv "HOME") in
+  let python_path = try Unix.getenv "PYTHONPATH" ^ ":" ^ python_path_base
+                    with Not_found -> python_path_base in
+  Unix.putenv "PYTHONPATH" python_path;
   let _ = if not (py_isinitialized () != 0) then
        (if !Flag.show_misc then Common.pr2 "Initializing python\n%!";
        py_initialize()) in
 
   (* set argv *)
-  let argv0 = Printf.sprintf "%s%sspatch" (Sys.getcwd ()) (match Sys.os_type with "Win32" -> "\\" | _ -> "/") in
+  let argv0 = Sys.executable_name in
   let _ = _pycocci_setargs argv0 in
 
   coccinelle_module := (pymodule_new "coccinelle");
@@ -200,10 +233,10 @@ let pycocci_init () =
   pyoutputinstance := cx;
   pyoutputdict := cd;
   let v1 = pydict_setitemstring(module_dictionary, "coccinelle", mx) in
-  check_int_return_value v1;
+  check_int_return_value "adding coccinelle python module" v1;
   let mypystring = pystring_fromstring !cocci_file_name in
   let v2 = pydict_setitemstring(cd, "cocci_file", mypystring) in
-  check_int_return_value v2;
+  check_int_return_value "adding python field cocci_file" v2;
   ()) else
   ()
 
@@ -224,7 +257,7 @@ let build_classes env =
        "include_match" | "has_env_binding" | "exit" -> ()
       | name ->
          let v = pydict_delitemstring(dict,name) in
-         check_int_return_value v)
+         check_int_return_value ("removing " ^ name ^ " from python coccinelle module") v)
     !added_variables;
   added_variables := [];
   ()
@@ -232,7 +265,7 @@ let build_classes env =
 let build_variable name value =
   let mx = !coccinelle_module in
   added_variables := name :: !added_variables;
-  check_int_return_value
+  check_int_return_value ("build python variable " ^ name)
     (pydict_setitemstring(pymodule_getdict mx, name, value))
 
 let get_variable name =
@@ -342,7 +375,7 @@ let set_coccifile cocci_file =
 
 let pyrun_simplestring s =
   let res = Pycaml.pyrun_simplestring s in
-  check_int_return_value res;
+  check_int_return_value ("running simple python string: " ^ s) res;
   res
 
 let py_isinitialized () =
index 8a50449..d60d263 100644 (file)
@@ -6,9 +6,12 @@ style-preserving source-to-source transformations on C source code,
 like for instance to perform some refactorings.
 
 To install Coccinelle from its source, see the instructions in install.txt.
-Once you have installed Coccinelle (either from the source or from one
-of the binary form available on the Coccinelle website), You may have
-to setup a few environment variables so that the Coccinelle program
+Once you have installed coccinelle, there is a script 'spatch' in /usr/bin
+or /usr/local/bin that invokes the Coccinelle program.
+
+If you want to run Coccinelle without installing it, you can run the
+Coccinelle program directly from the download/build directory. You may then
+have to setup a few environment variables so that the Coccinelle program
 knows where to find its configuration files.
 For bash do:
 
@@ -18,10 +21,12 @@ For tcsh do:
 
   $ source env.csh 
 
-You can then test coccinelle with:
+
+You can test coccinelle with:
 
   $ spatch -sp_file demos/simple.cocci demos/simple.c -o /tmp/new_simple.c
 
+If you haven't installed coccinelle, run then ./spatch or ./spatch.opt 
 
 
 
@@ -32,7 +37,6 @@ the equivalent of 'java', the Java virtual machine, but for OCaml) and then do:
   $ ocamlrun spatch -sp_file demos/simple.cocci demos/simple.c -o /tmp/new_simple.c
 
 
-
 For more information on Coccinelle, type 'make docs' and have a look at the 
 files in the docs/ directory. You may need to install the texlive-fonts-extra
 packages from your distribution to compile some of the LaTeX documentation
index e7df4b8..9c9bb41 100644 (file)
@@ -4,7 +4,7 @@
 , cocciSrc ? { outPath = ./.; revCount = 1234; gitTag = "abcdef"; }
 , testsSrc ? { outPath = ../big-tests; rev = 1234; }
 , officialRelease ? false
-, performRegress ? false
+, performRegress ? true
 }:
 
 
@@ -55,6 +55,206 @@ let
     };
 
 
+  #
+  # Helper functions for building configurations
+  #
+
+  selOcamlDefault = orig: orig.ocamlPackages;
+  selOcaml312 = orig: orig.ocamlPackages_3_12_1;
+  selOcaml311 = orig: orig.ocamlPackages_3_11_2;
+  selOcaml310 = orig: orig.ocamlPackages_3_10_0;
+
+  selCommonOcamlPkgs = ocamlPackages: with ocamlPackages; [
+    findlib menhir ocaml_sexplib ocaml_extlib
+  ];
+
+  selMinimalOcamlPkgs = ocamlPackages: with ocamlPackages; [
+    findlib menhir
+  ];
+
+  selAllOcamlPkgs = ocamlPackages: with ocamlPackages; [
+    findlib menhir ocaml_sexplib ocaml_extlib ocaml_pcre pycaml
+  ];
+
+  selCommonInputs = pkgs: [ pkgs.pkgconfig pkgs.pcre ];
+
+  selDefaultShell = pkgs: pkgs.stdenv.shell;
+
+  selPythonNone = pkgs: [];
+  selPythonDefault = pkgs: [ pkgs.python ];
+  selPython2 = pkgs: [ pkgs.python27 ];
+  selPython3 = pkgs: [ pkgs.python3 ];
+
+  # creates a configuration for a given python version
+  mkCfgPython = f: pkgs: with (f pkgs); {
+    inherit name pythons flags;
+
+    ocamls = selCommonOcamlPkgs pkgs.ocamlPackages ++ [ pkgs.ocamlPackages.pycaml ];
+    selOcaml = selOcamlDefault;
+    extras = selCommonInputs pkgs;
+    shell = selDefaultShell pkgs;
+  };
+
+  # creates a configuration for a given ocaml version
+  mkCfgOcaml = { name, selOcaml, flags }: pkgs: {
+      inherit flags selOcaml;
+
+    name = "ocaml-${name}";
+    pythons = selPythonDefault pkgs;
+    ocamls = selMinimalOcamlPkgs pkgs.ocamlPackages;
+    extras = selCommonInputs pkgs;
+    shell = selDefaultShell pkgs;
+  };
+
+  # creates a default configuration with additional flags
+  mkCfgDefault = { name, flags }: pkgs: {
+    inherit name flags;
+    pythons = selPythonDefault pkgs;
+    ocamls = selAllOcamlPkgs pkgs.ocamlPackages;
+    selOcaml = selOcamlDefault;
+    extras = selCommonInputs pkgs;
+    shell = selDefaultShell pkgs;
+  };
+
+  # creates a minimal configuration with additional flags
+  mkCfgMinimal = { name, flags }: pkgs: {
+    inherit name flags;
+    pythons = [];
+    ocamls = [];
+    selOcaml = selOcamlDefault;
+    extras = [];
+    shell = selDefaultShell pkgs;
+  };
+
+  # creates a configuration for the given ocaml packages
+  mkCfgPackage = { name, ocamls, flags }: pkgs: {
+    inherit name flags;
+    pythons = selPythonDefault pkgs;
+    ocamls = selMinimalOcamlPkgs pkgs.ocamlPackages ++ ocamls pkgs.ocamlPackages;
+    selOcaml = selOcamlDefault;
+    extras = selCommonInputs pkgs;
+    shell = selDefaultShell pkgs;
+  };
+
+  # build the project using the given shell
+  # it takes a minimal configuration, but then with all the
+  # libraries that trigger features of coccinelle to be enabled.
+  mkCfgShell = { name, selShell }: pkgs: {
+    inherit name;
+    pythons = selPythonDefault pkgs;
+    ocamls = selMinimalOcamlPkgs pkgs.ocamlPackages;
+    selOcaml = selOcamlDefault;
+    flags = [];
+    extras = [ pkgs.pcre ];
+    shell = selShell pkgs;
+  };
+
+  # creates a configuration with multiple ocaml versions: this gives
+  # conflicts. This is just a test to see whether our build system is
+  # not too much confused in this case. It seems at least that ocamlfind
+  # cannot be used in this setting.
+  mkCfgManyOcaml =
+    let
+      selOcaml = pkgs: ocamlPkgSel: with (ocamlPkgSel pkgs); ocaml;
+      selPkgs = pkgs: ocamlPkgSel: with (ocamlPkgSel pkgs); [ menhir ];
+    in sels: pkgs: {
+      name = "many-ocaml";
+      pythons = [];
+      ocamls = pkgs.lib.concatMap (selPkgs pkgs) sels;
+      selOcaml = selOcamlDefault;
+      flags = [];
+      extras = selCommonInputs pkgs ++ map (selOcaml pkgs) sels;
+      shell = selDefaultShell pkgs;
+    };
+
+
+  #
+  # Configurations
+  #
+
+  defaultCfg = mkCfgDefault { name = "default"; flags = []; };
+  debugCfg = mkCfgDefault { name = "debug"; flags = [ "--enable-release=no" ]; };
+  wrappersCfg = mkCfgDefault { name = "wrappers"; flags = [ "--enable-python" "--enable-ocaml" "--without-pkg-config" "--without-ocamlfind" ]; };
+  manyOcamlCfg = mkCfgManyOcaml [ selOcaml312 selOcaml311 selOcaml310 ];
+
+  minimalCfgs = map mkCfgMinimal [
+    { name = "minimal"; flags = []; }
+    { name = "noocamlscripting"; flags = [ "--disable-ocaml" ]; }
+  ];
+
+  # Several configurations testing different python versions.
+  # We exlicitly pass the "--enable-python" flag so that the
+  # build should fail if no suitable python can be detected.
+  pythonCfgs = 
+    map mkCfgPython [
+      ( _ : { name = "no-python"; pythons = []; flags = []; })
+
+      (pkgs: {
+        name = "python2-local";
+        pythons = selPython2 pkgs;
+        flags = [ "--enable-python" "--disable-pycaml" ];
+      })
+
+      (pkgs: {
+        name = "python3-local";
+        pythons = selPython3 pkgs;
+        flags = [ "--enable-python" "--disable-pycaml" ];
+      })
+
+      (pkgs: {
+        name = "python3-global";
+        pythons = selPython3 pkgs;
+        flags = [ "--enable-python" ];
+      })
+
+      (pkgs: {
+        name = "python-nopkgconfig";
+        pythons = selPython2 pkgs;
+        flags = [ "--enable-python" "--without-pkg-config" ];
+      })
+
+#  disabled because this combination does not work in NixOS
+#      (pkgs: {
+#        name = "many-pythons";
+#        pythons = selPython3 pkgs ++ selPython2 pkgs;
+#        flags = [ "--with-python=python3" ];
+#      })
+    ];
+
+  # Several configurations testing different OCaml versions.
+  # These versions ship with minimal global packages in order
+  # to thest the bundled packages with these ocaml versions.
+  ocamlCfgs = map mkCfgOcaml [
+    { name = "312"; selOcaml = selOcaml312; flags = []; }
+    { name = "311"; selOcaml = selOcaml311; flags = [ "--enable-release=yes" ]; }
+    { name = "310"; selOcaml = selOcaml310; flags = []; }
+  ];
+
+  # Several configurations testing different available
+  # ocaml packages.
+  pkgCfgs = map mkCfgPackage [
+    { name = "extlib"; ocamls = ps: [ ps.ocaml_extlib ]; flags = [ "--enable-extlib" ]; }
+    { name = "pcre"; ocamls = ps: [ ps.ocaml_pcre ]; flags = [ "--enable-pcre-syntax" ]; }
+    { name = "sexplib"; ocamls = ps: [ ps.ocaml_sexplib ]; flags = [ "--enable-sexplib" ]; }
+    { name = "pycaml"; ocamls = ps: [ ps.pycaml ]; flags = [ "--enable-pycaml" ]; }
+  ];
+
+  shellCfgs = map mkCfgShell [
+    { name = "bash"; selShell = pkgs: "${pkgs.bash}/bin/bash"; }
+    { name = "dash"; selShell = pkgs: "${pkgs.dash}/bin/dash"; }
+    { name = "zsh"; selShell = pkgs: "${pkgs.zsh}/bin/zsh"; }
+
+    # the configure script is not compatible with tcsh
+    # { name = "tcsh"; selShell = pkgs: "${pkgs.tcsh}/bin/tcsh"; }
+  ];
+
+  altCfgs =
+    [ debugCfg manyOcamlCfg ]
+    ++ minimalCfgs
+    ++ ocamlCfgs ++ pythonCfgs
+    ++ pkgCfgs ++ shellCfgs;
+
+
   #
   # Builds for specific configurations
   #
@@ -64,10 +264,10 @@ let
 
   # mkConfiguration is a function that takes the nix package collection of the build
   # (called 'pkgs') and results in a record containing:
-  #  name of the configuration, python packages, ocaml packages selection function
-  #  (which takes the original 'pkgs' as parameter), and ocaml packages. The selection
-  #  function is used by 'mkConfiguration' to determine the appropriate ocamlPackages
-  #  field in 'pkgs'.
+  # name of the configuration, python packages, ocaml packages selection function
+  # (which takes the original 'pkgs' as parameter), and ocaml packages. The selection
+  # function is used by 'mkConfiguration' to determine the appropriate ocamlPackages
+  # field in 'pkgs'.
   mkBuild = mkConfiguration: { system ? builtins.currentSystem }:
     let pkgs = import nixpkgs {
           inherit system;
@@ -76,11 +276,16 @@ let
           };
         };
         cfg = mkConfiguration pkgs;
+        flags = [ "--enable-release=world" ] ++ cfg.flags;
     in with pkgs; releaseTools.nixBuild {
+      inherit (cfg) shell;
       name = "cocci-build-${cfg.name}";
       src = tarball;
-      buildInputs = [ pkgconfig pcre ncurses ocamlPackages.ocaml ] ++ cfg.ocamls ++ cfg.pythons;
-      configureFlagsArray = cfg.flags ++ [ "--enable-release=world" ];
+      enableParallelBuilding = true;
+      buildInputs = cfg.extras ++ [ ncurses ocamlPackages.ocaml ] ++ cfg.ocamls ++ cfg.pythons;
+      configureFlags = pkgs.lib.concatStringsSep " " flags; # hmm, flags are now not allowed to contain spaces
+      doCheck = true;
+      
       buildPhase = ''
         mkdir -p "$out/nix-support/"
         touch "$out/nix-support/make.log"
@@ -88,55 +293,20 @@ let
 
         make all 2> >(tee -a "$out/nix-support/make.log" >&2)
       '';
-    };
 
-  build = mkBuild defaultCfg;
-  defaultCfg = pkgs: with pkgs; {
-    name = "default";
-    pythons = [ python3 ];
-    ocamls = with ocamlPackages; [
-      findlib menhir ocaml_sexplib ocaml_extlib ocaml_pcre pycaml
-    ];
-    flags = [];
-    selOcaml = orig: orig.ocamlPackages;
-  };
-
-
-  /*
-  # selects which version of ocaml and ocamlPackages to use in nixpkgs.
-  selOcaml312 = pkgs:
-    { ocaml = pkgs.ocaml_3_12_1;
-      ocamlPackages = pkgs.ocamlPackages_3_12_1;
-    };
-  selOcaml310 = pkgs:
-    { ocaml = pkgs.ocaml_3_10_0;
-      ocamlPackages = pkgs.ocamlPackages_3_10_0;
-    };
-
-  # builds an environment with the ocaml packages needed to build coccinelle
-  # the mkList function selects which additional packages to include
-  mkOcamlEnv = mkList: pkgs:
-    pkgs.buildEnv {
-      name = "cocci-ocamlenv";
-      paths = with pkgs.ocamlPackages; [ pkgs.ocaml findlib menhir ] ++ mkList pkgs.ocamlPackages;
+      # changes the shell in some of the scripts to the configured one
+      prePatch = ''
+        echo "patching the shell in scripts to: ${cfg.shell}"
+        for script in configure scripts/spatch.sh.in scripts/genversion.sh \
+          setup/fake-subst.sh setup/fake-menhir.sh setup/fake-pdflatex.sh; do
+          substituteInPlace $script --replace '#! /bin/sh' '#! ${cfg.shell}'
+        done
+      '';
     };
 
-  # selections of ocaml libraries
-  libs_full = mkOcamlEnv (libs: with libs; [ ocaml_pcre ocaml_sexplib ocaml_extlib pycaml ]);
-  libs_rse  = mkOcamlEnv (libs: with libs; [ ocaml_pcre ocaml_sexplib ocaml_extlib ]);
-  libs_se   = mkOcamlEnv (libs: with libs; [ ocaml_sexplib ocaml_extlib ]);
-  libs_null = mkOcamlEnv (libs: []);
-
-  # different configurations of coccinelle builds based on different ocamls/available libraries
-  build = mkBuild { name = "coccinelle"; ocamlVer = selOcaml312; mkEnv = libs_full; inclPython = true; };
-  build_rse = mkBuild { name = "coccinelle_config1"; ocamlVer = selOcaml312; mkEnv = libs_rse; inclPython = true; };
-  build_se = mkBuild { name = "coccinelle_config2"; ocamlVer = selOcaml312; mkEnv = libs_se; inclPython = true; };
-  build_null_12 = mkBuild { name = "coccinelle_config3"; ocamlVer = selOcaml312; mkEnv = libs_null; inclPython = true; };
-  # build_null_10 = mkBuild { name = "coccinelle_config4"; ocamlVer = selOcaml310; mkEnv = libs_null; inclPython = true; };
-  build_null_12_np = mkBuild { name = "coccinelle_config5"; ocamlVer = selOcaml312; mkEnv = libs_null; inclPython = false; };
-  # build_null_10_np = mkBuild { name = "coccinelle_config6"; ocamlVer = selOcaml310; mkEnv = libs_null; inclPython = false; };
-  build_rse_np = mkBuild { name = "coccinelle_config7"; ocamlVer = selOcaml312; mkEnv = libs_rse; inclPython = false; };
-  */
+  build = mkBuild defaultCfg;
+  altBuilds = map mkBuild altCfgs;
+  allBuilds = [ build ] ++ altBuilds;
 
 
   #
@@ -201,35 +371,34 @@ let
       };
     } // args // { inherit name; });
 
-  mkReport = inputs: mkTask (pkgs: _: with pkgs; {
-    name = "report";
-    builds = map (i: i {}) inputs;
-
-    execPhase = ''
-      echo "collecting logs"
-      for build in $builds; do
-        echo "$build/nix-support/make.log"
-        cat "$build/nix-support/make.log"
-      done
-
-      echo "grepping OCaml warnings"
-      if grep -2 "Warning " "$TMPDIR/result.log"
-      then
-        echo "found warnings!"
-        false
-      else
-        echo "there are apparently no significant warnings"
-      fi
-    '';
-
-    meta = {
-      description = "Analysis of the coccinelle build reports";
-      schedulingPriority = 5;
-    };
-  });
+  mkReport = inputs: mkTask (pkgs: _: with pkgs;
+    let builds = map (i: i { inherit (pkgs.stdenv) system; }) inputs; in {
+      name = "report";
+
+      execPhase = ''
+        echo "collecting logs"
+        for build in ${lib.concatStringsSep " " builds}; do
+          echo "log: $build/nix-support/make.log"
+          cat "$build/nix-support/make.log"
+        done
+
+        echo "grepping OCaml warnings"
+        if grep -2 "Warning " "$TMPDIR/result.log"
+        then
+          echo "found warnings!"
+          false
+        else
+          echo "there are apparently no significant warnings"
+        fi
+      '';
 
-  report = mkReport [ build ];
-  # build_rse build_se build_null_12 build_null_12_np build_rse_np
+      meta = {
+        description = "Analysis of the coccinelle build reports";
+        schedulingPriority = 5;
+      };
+    });
+
+  report = mkReport allBuilds;
 
 
   #
@@ -259,17 +428,21 @@ let
 
        # initialize essential environment variables
         # for the makefile
+       export COCCINELLE_HOME=${coccinelle}/share/coccinelle
         export COCCIDIR=$TMPDIR
         export SPATCH=${coccinelle}/bin/spatch.opt
         export ISO=${coccinelle}/share/coccinelle/standard.iso
         export DEFS=${coccinelle}/share/coccinelle/standard.h
 
-       # generate the test outcomes
-        make -e all
+       # generate the test outcomes using a parallel build
+        make -e all -j$NIX_BUILD_CORES -l$NIX_BUILD_CORES
 
         # collect the results
        # note: the tarball is likely to contain useless
-        # symbolic links to files in the nix store. So be it.
+        # symbolic links to files in the nix store. We therefore
+        # delete these symlinks. As a result, you should be able
+        # to unpack the tarball in the tests directory.
+        find "$TMPDIR/tests" -depth -type l -delete
         cd "$TMPDIR"
         tar -czf "$out/results.tar.gz" ./tests
        echo "file binary-dist $out/results.tar.gz" >> "$out/nix-support/hydra-build-products"
@@ -317,7 +490,7 @@ let
       };
     });
 
-  regress = assert performRegress; mkRegress build;
+  regress = mkRegress build;
   test = checkRegress regress;
 
 
@@ -334,21 +507,23 @@ let
       buildInputs = with ocamlPackages; [
         pkgconfig ncurses texLiveFull
         ocaml findlib menhir
-        python
+        python pcre patchelf
       ];
-      configureFlagsArray = [ "--enable-release=world" ];
-      
+      configureFlagsArray = [ "--enable-release" ];
+
       buildPhase = ''
+        export TARGETDIR="$TMPDIR/dists"
+        mkdir -p $TARGETDIR
         export HOME=$TMPDIR
-       make prerelease GIT=echo
-       make release GIT=echo
-       make package
+       make prerelease GIT=echo TMP=$TARGETDIR
+       make release GIT=echo TMP=$TARGETDIR
+       make package TMP=$TARGETDIR
       '';
 
       installPhase = ''
         mkdir -p "$out/nix-support/"
        echo "cocci-dist-${version}" > "$out/nix-support/hydra-release-name"
-       cp $TMP/*.tgz "$out/"
+       cp $TMPDIR/dists/*.tgz "$out/"
        for file in $out/*.tgz; do
           echo "file binary-dist $file" >> $out/nix-support/hydra-build-products
        done
@@ -365,12 +540,15 @@ let
   basicAttrs = {
     inherit tarball;
     inherit build;
-# build_rse build_se build_null_12 build_null_12_np build_rse_np;
     inherit report;
     inherit dist;
   };
 
-  testAttrs = {
+  # artificial dependency on report to ensure that we are not going through
+  # an expensive regression test when there is already something wrong with
+  # the build process.
+  reportFirst = x : if report == null then x else x;
+  testAttrs = reportFirst {
     inherit regress;
     inherit test;
   };
index 9ae5a04..b70b837 100755 (executable)
@@ -1,12 +1,10 @@
-#!/bin/sh
+#! /bin/sh
 
 # fallback date (in RFC format)
 VERSION=`date "+%a, %d %b %Y %H:%M:%S %z"`
 
 # use the date information from git, if git is present
-which git &>/dev/null
-if [ $? -eq 0 ] && [ -d ".git" ]
-then
+if test -d ".git" && which git &>/dev/null; then
 VERSION=`git log -1 --date-order --date=rfc --pretty="format:%cd"`
 fi
 
index 8b91529..6abe800 100755 (executable)
@@ -1,3 +1,3 @@
-#!/bin/sh
+#! /bin/sh
 
 find `pwd`/* -name "*.[ch]" | glimpseindex -o -H . -F
index ea47a12..a555352 100644 (file)
@@ -1,12 +1,16 @@
-#!/bin/sh -e
+#! /bin/sh -e
 
 # generic wrapper script to invoke 'spatch' or 'spatch.opt'
 # it sets the python variables (if relevant)
-# and OCCINELLE_HOME
+# and COCCINELLE_HOME
 
 SHAREDIR="@prefix@/share/coccinelle"
 LIBDIR="@prefix@/lib"
 
+if test ! -d "$SHAREDIR"; then
+    SHAREDIR="$(pwd)"
+fi
+
 COCCINELLE_HOME="${COCCINELLE_HOME:=$SHAREDIR}"
 #echo setting COCCINELLE_HOME=${COCCINELLE_HOME:=$SHAREDIR}
 
@@ -16,12 +20,12 @@ fi
 
 if [ ! -r "${COCCINELLE_HOME}/standard.iso" ] ; then
   echo "There is no standard.iso in ${COCCINELLE_HOME}." 1>&2
-  echo "Are you sure you run a properly installed version of spatch ?\n" 1>&2
+  echo -n "Are you sure you run a properly installed version of spatch ?\n" 1>&2
 else
 
 export COCCINELLE_HOME
 
-export LD_LIBRARY_PATH="${LIBDIR}:$LD_LIBRARY_PATH"
+export LD_LIBRARY_PATH="${LIBDIR}:$LD_LIBRARY_PATH:${SHAREDIR}:${COCCINELLE_HOME}"
 export PYTHONPATH="${COCCINELLE_HOME}/python:$PYTHONPATH"
 
 # echo setting LD_LIBRARY_PATH="$LD_LIBRARY_PATH"
index 74fc281..2f673a2 100644 (file)
@@ -85,6 +85,7 @@ AC_DEFUN([AC_CHECK_COCCI_EXTPKG],
       [dnl  when explicitly requested the global version
         AC_MSG_ERROR([OCaml package $1 is not available but requested explicitly])
       ])
+      AC_MSG_NOTICE([OCaml package $1 is not available])
       AC_SUBST(AS_TR_SH([enable_$1]),[no])
     ])
   ])
@@ -110,6 +111,7 @@ AC_DEFUN([AC_CHECK_COCCI_EXTPKG],
   [dnl
     AC_SUBST(AS_TR_SH([FEATURE_$1]),[1])
     AC_SUBST(AS_TR_SH([FLAGS_$1]),['$([]AS_TR_SH([FLAGS_$1]))'])
+    AC_SUBST(AS_TR_SH([OPTFLAGS_$1]),['$([]AS_TR_SH([OPTFLAGS_$1]))'])
 
     dnl  distinguish global/local
     AS_IF([test "x$[]AS_TR_SH([enable_$1])" = xlocal],
@@ -167,12 +169,22 @@ AC_DEFUN([AC_COCCI_PYVER],
 [dnl
   AS_IF([test -z "$PYVER"],
   [dnl  PYVER not set before, determine it
+
+    dnl  first try the generic "python" executable or what the user configured
+    dnl  as commandline parameter
     AC_COCCI_TOOL([PYTHON],[python],[])
 
+    dnl  some fall-back alternatives in case the above did not find anything
+    AS_IF([test "x$PYTHON" = xno -a -z "$with_python"],
+    [dnl
+      AC_PATH_PROGS([PYTHON],[python python3 python3.2 python3.1 python2 python2.7 python2.6 python2.5])
+      AS_IF([test -z "$PYTHON"],[AC_SUBST([PYTHON],[no])])
+    ])
+
     AS_IF([test "x$PYTHON" = xno -a -n "$with_python" -a "x$with_python" != xyes],
     [dnl  python interpreter not found, but perhaps it was a version
-      AC_MSG_NOTICE([$1 is not a found as tool, therefore interpreted as version])
-      AC_SUBST([PYVER],["$1"])
+      AC_MSG_NOTICE([$with_python is not a found as tool, therefore interpreted as version])
+      AC_SUBST([PYVER],["$with_python"])
     ])
 
     AS_IF([test "x$PYTHON" != xno],
@@ -186,6 +198,10 @@ AC_DEFUN([AC_COCCI_PYVER],
   [dnl  PYVER set before
     AC_MSG_NOTICE([python version assumed to be $PYVER])
   ])
+
+  dnl  determine major version of pyver
+  AC_SUBST([PYVER_MAJOR],[${PYVER%%.*}])
+  AC_MSG_NOTICE([python major version: $PYVER_MAJOR])
 ])
 
 
@@ -251,18 +267,25 @@ AC_DEFUN([AC_COCCI_TOOL],
 [dnl
   AC_ARG_VAR([$1], [path to $2])
   AC_ARG_WITH([$2], [AS_HELP_STRING([--with-$2], [whether/which $2 to use (default: auto)])])
-  AC_SUBST([with_$1],["$with_[]AS_TR_SH([$2])"])
+  AC_SUBST([with_$1],["$with_[]AS_TR_SH([$2])"])  dnl sets with_$1
 
   dnl  explicit tool or command given
   AS_IF([test -n "$with_[]$1" -a "x$with_[]$1" != xno -a "x$with_[]$1" != xyes],
   [dnl  custom $with_$1 given
     AC_SUBST([$1], ["$with_[]$1"])
+  ],
+  [dnl  otherwise, use the default command name
+    AC_SUBST([$1], ["$2"])
   ])
 
   dnl  searches for the tool (result either empty or 'no' if not found)
-  AS_IF([test "x$with_$1" != xno],
+  AS_IF([test "x$with_$1" = xno],
+  [dnl  disabled
+    AC_MSG_NOTICE([$2 is disabled explicitly])
+    AC_SUBST([$1], [no])
+  ],
   [dnl  find the tool
-    AC_COCCI_FINDTOOL([$1],[$2])
+    AC_COCCI_FINDTOOL([$1],[[$]$1])
   ])
 
   AS_IF([test -z "[$]$1" -o "x[$]$1" = xno],
index dcd3313..0db1cf2 100755 (executable)
@@ -1,4 +1,6 @@
-#!/bin/sh -e
+#! /bin/sh -e
+
+set -e
 
 # If you don't have menhir installed, but you do have the generated files, then
 # this script fakes menhir by providing the generated files as the result of the
@@ -10,9 +12,9 @@ reqml=
 reqmli=
 
 for arg in "$@"; do
-  if test "x$STATE" == x0 -a "x$arg" == "x--base" -o "x$arg" == "x-b"; then
+  if test "x$STATE" = x0 -a "x$arg" = "x--base" -o "x$arg" = "x-b"; then
     STATE=1
-  elif test "x$STATE" == x1; then
+  elif test "x$STATE" = x1; then
     base="$arg"
     STATE=0
   else
@@ -21,7 +23,7 @@ for arg in "$@"; do
     extension="${filename##*.}"
 
     # assumes that all commandline parameters ending in .mly are files to be processed by menhir
-    if test "x$extension" == xmly; then
+    if test "x$extension" = xmly; then
       reqml="${basename}.ml"
       reqmli="${basename}.mli"
 
index 33cbb7d..1effb59 100755 (executable)
@@ -1,16 +1,18 @@
-#!/bin/sh -e
+#! /bin/sh -e
+
+set -e
 
 # If you don't have pdflatex installed, but do have the generated pdf files, then
 # this script provides those pdf files as a substitute for the pdflatex invocation.
 
 for arg in "$@"; do
-  basename="${arg%.*}"
-  extension="${arg##*.}"
+  base="${arg%.*}"
+  ext="${arg##*.}"
 
-  if test "x$extension" = xtex; then
-    if test -f "${basename}.pdf"; then
-      echo "fake-pdflatex.sh: ${basename}.pdf provided as substitute for: $@"
-      touch "${basename}.pdf"
+  if test "x$ext" = xtex; then
+    if test -f "${base}.pdf"; then
+      echo "fake-pdflatex.sh: ${base}.pdf provided as substitute for: $@"
+      touch "${base}.pdf"
       exit 1
     fi
   fi
index c0a3994..b087ba0 100755 (executable)
-#!/bin/sh -e
+#! /bin/sh -e
+
+set -e
 
 # This is a program that gives scripted replies
 # to queries that are normally handled by programs
 # such as pkg-config and ocamlfind. This program
 # can serve as a poor substitute.
 
-# the replies file contains sets of two lines. The
-# first line is an extended regex to match against
-# the command line. The second line is the reply to
-# print to stdout. Variables ${BASH_REMATCH[i]} may be
-# used to match against capture groups.
+# the replies file contains sets of three lines. The
+# first line is a pattern for grep. Grep matches
+# this pattern against our command line. If fails,
+# we skip to the next set of three lines.
+# The second line is a replacement pattern for sed (or empty),
+# which rewrites our command line, and stores the result
+# in $MATCH. The third line is evaluated and may use
+# $MATCH. If the execution succeeds, the script exists
+# with a zero exit code. Otherwise it repeats the process with
+# the next lines in the file.
 
 # the replies file assumes that the
 # libpcre and python libraries are installed, and
 # that none of the optional ocaml libraries are
 # installed.
 
+if test -n "${ZSH_VERSION}"; then
+  setopt BASH_REMATCH
+fi
+
+if test -z "${BASH_SOURCE}"; then
+  BASH_SOURCE=$0
+fi
+
 cmdline="$@"
-scriptdir=$(dirname "$BASH_SOURCE")
-responsefile="$scriptdir/replies.txt"
+scriptdir=$(dirname "${BASH_SOURCE}")
+responsefile="${scriptdir}/replies.txt"
 
 # learning mode
 # echo "$cmdline" >> /tmp/queries.txt
 
 # some helper functions callable from the replacement macros
-function ocamllibdir {
-  ocamlc -where &2>/dev/null
+ocamllibdir() {
+  ocamlc -where
 }
 
 # outputs with what prefix 'python' was configured
-function pythonprefix {
-  python -c "import sys; print(sys.prefix)" &2>/dev/null
+pythonprefix() {
+  python -c "import sys; print(sys.prefix)"
+}
+
+pythonexists() {
+  local version=$1
+  local prefix="$(pythonprefix)"
+  test $? = 0
+
+  if test ! -f "${prefix}/include/python${version}/Python.h"; then
+    echo "error: ${prefix}/include/python${version}/Python.h not found (a development version of python is not installed?)" 1>&2
+    false
+  fi
 }
 
 # outputs the "include" cflags for python
-function pythoncflags {
+pythoncflags() {
   local version=$1
   local prefix="$(pythonprefix)"
-  test $? == 0
+  test $? = 0
+
   echo "-I${prefix}/include/python${version}"
 }
 
 # outputs the "linker" flags for python
-function pythonlibs {
+pythonlibs() {
   local version=$1
   local prefix="$(pythonprefix)"
+  test $? = 0
 
   echo "-L${prefix}/lib -lpython${version}"
 }
 
 # succeeds only if "/usr/include/pcre.h" exists
-function checkpcre {
+checkpcre() {
   test -f /usr/include/pcre.h
 }
 
 # interate through pattern-response pairs
+found=
+response=
 while read pattern
 do
   # empty lines preceeding pattern
-  if test -z "$pattern"; then
+  if test -z "${pattern}"; then
     continue
   fi
 
   # response may be empty
+  read replace
   read response
 
-  if [[ $cmdline =~ $pattern ]]; then
-    if test -n "$response"; then
-      (eval "R=\"$response\""; test $? == 0; echo $R)
-      test $? == 0
-    fi
+  if echo "${cmdline}" | grep -qE "${pattern}"; then
+    found=1
+    break
+  fi
+done < "${responsefile}"
+
+if test -n "${found}"; then
+  MATCH=no
+  if test -n "${replace}"; then
+    MATCH="$(echo "$cmdline" | sed -r "${replace}")"
+  fi
 
-    exit 0
+  if test -n "${response}"; then
+    (eval "R=\"${response}\""; test $? = 0; if test -n "${R}"; then echo "${R}"; fi)
+    test $? = 0
   fi
-done < $responsefile
 
-# fallback case
-echo "fake-subst.sh: no substitution for: $cmdline" 1>&2
-exit 1
+  exit 0
+else
+  # fallback case
+  echo "fake-subst.sh: no substitution for: ${cmdline}" 1>&2
+  exit 1
+fi
diff --git a/setup/install-sh b/setup/install-sh
new file mode 100755 (executable)
index 0000000..7692392
--- /dev/null
@@ -0,0 +1,4 @@
+#! /bin/sh -e
+
+echo "error: no suitable install program found, therefore refusing to install $@" 1>&2
+exit 1
index d588316..8406cb2 100644 (file)
@@ -1,28 +1,60 @@
 ocamlfind query (unix|bigarray|num|dynlink|str|threads)
+
 $(ocamllibdir)
 
+
+
 ocamlfind query camlp4
+
 $(ocamllibdir)/camlp4
 
+
+
 pkg-config --atleast-pkgconfig-version
 
-pkg-config --exists --print-errors python
 
-pkg-config --print-errors python
 
-pkg-config --cflags python(-([0-9\.]+))?$
-$(pythoncflags "${BASH_REMATCH[2]}")
 
-pkg-config --libs python(-([0-9\.]+))?$
-$(pythonlibs "${BASH_REMATCH[2]}")
+pkg-config --exists --print-errors python(-([0-9\\.]+))?\$
+s,^pkg-config --exists --print-errors python(-([0-9\\.]+))?\$,\\2,
+$(pythonexists "${MATCH}")
+
+
+pkg-config --print-errors python(-([0-9\\.]+))?\$
+s,^pkg-config --print-errors python(-([0-9\\.]+))?\$,\\2,
+$(pythonexists "${MATCH}")
+
+
+
+pkg-config --cflags python(-([0-9\\.]+))?\$
+s,^pkg-config --cflags python(-([0-9\\.]+))?\$,\\2,
+$(pythoncflags "${MATCH}")
+
+
+
+pkg-config --libs python(-([0-9\\.]+))?\$
+s,^pkg-config --libs python(-([0-9\\.]+))?\$,\\2,
+$(pythonlibs "${MATCH}")
+
+
 
 pkg-config --exists --print-errors libpcre
+
 $(checkpcre)
 
+
+
 pkg-config --print-errors libpcre
+
 $(checkpcre)
 
+
+
 pkg-config --cflags libpcre
 
+
+
+
 pkg-config --libs libpcre
+
 -lpcre
index 146b8f2..597515a 100644 (file)
 //#define __declspec(x) 
 
 #define __page_aligned(x) 
+#define __aligned(x) 
 #define __vsyscall(x) 
 
 // ----------------------------------------------------------------------------
index 023d365..8a351be 100644 (file)
  *)
 
 
+# 0 "./testing.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./testing.ml"
 open Common
 open Sexplib
@@ -55,8 +82,7 @@ let testone prefix x compare_with_expected_flag =
       | Some (Some outfile) ->
           if List.length res > 1
           then pr2 ("note that not just " ^ cfile ^ " was involved");
-
-          let tmpfile = new_temp_file (Common.basename cfile) ".c" in
+          let tmpfile = sprintf "%s/%s" Filename.temp_dir_name (Common.basename cfile) in
           pr2 (sprintf "One file modified. Result is here: %s" tmpfile);
           Common.command2 ("mv "^outfile^" "^tmpfile);
           tmpfile
index 5fb1862..c76c8c3 100644 (file)
  *)
 
 
+# 0 "./testing.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./testing.mli"
 open Common
 
index 31bb7ad..b108f60 100644 (file)
  (empty.res Ok) (end_commas.res Ok) (endif.res Ok) (enum.res Ok)
  (exitc.res
   (Pb
-   "PROBLEM\n   exn = Yes_prepare_ocamlcocci.LinkFailure(\"/tmp/exitcd9b50a.cmxs\")\n"))
+   "PROBLEM\n   exn = Yes_prepare_ocamlcocci.LinkFailure(\"/tmp/exitc3a2c80.cmxs\")\n"))
  (exitp.res (Pb "PROBLEM\n   exn = Failure(\"no python\")\n")) (exp.res Ok)
  (expnest.res Ok) (expopt.res Ok) (expopt2.res Ok) (expopt3.res Ok)
  (expopt3_ver1.res Ok) (expopt3_ver2.res Ok)
  (extra.res
   (Pb
-   "PROBLEM\n   exn = Yes_prepare_ocamlcocci.LinkFailure(\"/tmp/extrac8550b.cmxs\")\n"))
+   "PROBLEM\n   exn = Yes_prepare_ocamlcocci.LinkFailure(\"/tmp/extra7f046a.cmxs\")\n"))
  (fields.res Ok) (fieldsmin.res Ok) (find_long.res Ok) (fix_flow_need.res Ok)
  (fn_todo.res Ok) (fnptr.res Ok) (fnret.res Ok) (fnty.res Ok) (four.res Ok)
  (foura.res Ok) (fp.res Ok) (fsh.res Ok) (fun.res Ok)
@@ -63,7 +63,7 @@
  (ifdefmeta4.res
   (Pb
    "PROBLEM\n   exn = Unix.Unix_error(20, \"stat\", \"tests/ifdefmeta4.cocci\")\n"))
- (ifend.res Ok) (ifields.res Ok) (ifzer.res Ok) (inc.res Ok)
+ (ifend.res Ok) (ifields.res Ok) (ifzer.res Ok) (ifzz.res Ok) (inc.res Ok)
  (incdir.res
   (Pb
    "INCORRECT:diff token: x VS 12\nFile \"tests/incdir.c\", line 4, column 6,  charpos = 46\n    around = 'x', whole content =   foo(x);\nFile \"tests/incdir.res\", line 4, column 6,  charpos = 46\n    around = '12', whole content =   foo(12);\n\n    diff (result(<) vs expected_result(>)) = \n    @@ -1,5 +1,5 @@\n     #include \"sub/incdir2.c\"\n     \n     int main () {\n    -  foo(x);\n    +  foo(12);\n     }\n"))
  (null_type.res Ok)
  (oddifdef.res
   (Pb
-   "INCORRECT:diff token: } VS #ifdef FOO\nFile <COCCIOUTPUTFILE>, line 10, column 0,  charpos = 104\n    around = '}', whole content = }\nFile \"tests/oddifdef.res\", line 9, column 0,  charpos = 103\n    around = '#ifdef FOO', whole content = #ifdef FOO\n\n    diff (result(<) vs expected_result(>)) = \n    @@ -6,7 +6,11 @@\n         )\n         a = 5;\n     \n    -\n    +#ifdef FOO\n    +  x = 0;\n    +#else\n    +  x = 0;\n    +#endif\n     }\n     \n     void two() {\n    @@ -17,7 +21,11 @@\n     #endif\n         a = 3;\n     \n    -\n    +#ifdef FOO\n    +  x = 0;\n    +#else\n    +  x = 0;\n    +#endif\n     }\n     \n     void three() {\n    @@ -28,5 +36,9 @@\n         meth=SSLv2_client_method();\n     #endif\n     \n    -\n    +#ifdef FOO\n    +  x = 0;\n    +#else\n    +  x = 0;\n    +#endif\n     }\n"))
+   "INCORRECT:diff token: #else\n VS x\nFile <COCCIOUTPUTFILE>, line 10, column 0,  charpos = 114\n    around = '#else\n', whole content = #else\nFile \"tests/oddifdef.res\", line 10, column 2,  charpos = 116\n    around = 'x', whole content =   x = 0;\n\n    diff (result(<) vs expected_result(>)) = \n    @@ -7,8 +7,9 @@\n         a = 5;\n     \n     #ifdef FOO\n    +  x = 0;\n     #else\n    -\n    +  x = 0;\n     #endif\n     }\n     \n    @@ -21,8 +22,9 @@\n         a = 3;\n     \n     #ifdef FOO\n    +  x = 0;\n     #else\n    -\n    +  x = 0;\n     #endif\n     }\n     \n    @@ -35,7 +37,8 @@\n     #endif\n     \n     #ifdef FOO\n    +  x = 0;\n     #else\n    -\n    +  x = 0;\n     #endif\n     }\n"))
  (of.res Ok) (oneline.res Ok) (opt.res Ok) (optional_qualifier.res Ok)
  (optional_storage.res Ok) (orexp.res Ok) (overshoot.res Ok) (param.res Ok)
  (param_end.res Ok) (param_ver1.res Ok) (parameters_dots.res Ok)
index 31bb7ad..b108f60 100644 (file)
  (empty.res Ok) (end_commas.res Ok) (endif.res Ok) (enum.res Ok)
  (exitc.res
   (Pb
-   "PROBLEM\n   exn = Yes_prepare_ocamlcocci.LinkFailure(\"/tmp/exitcd9b50a.cmxs\")\n"))
+   "PROBLEM\n   exn = Yes_prepare_ocamlcocci.LinkFailure(\"/tmp/exitc3a2c80.cmxs\")\n"))
  (exitp.res (Pb "PROBLEM\n   exn = Failure(\"no python\")\n")) (exp.res Ok)
  (expnest.res Ok) (expopt.res Ok) (expopt2.res Ok) (expopt3.res Ok)
  (expopt3_ver1.res Ok) (expopt3_ver2.res Ok)
  (extra.res
   (Pb
-   "PROBLEM\n   exn = Yes_prepare_ocamlcocci.LinkFailure(\"/tmp/extrac8550b.cmxs\")\n"))
+   "PROBLEM\n   exn = Yes_prepare_ocamlcocci.LinkFailure(\"/tmp/extra7f046a.cmxs\")\n"))
  (fields.res Ok) (fieldsmin.res Ok) (find_long.res Ok) (fix_flow_need.res Ok)
  (fn_todo.res Ok) (fnptr.res Ok) (fnret.res Ok) (fnty.res Ok) (four.res Ok)
  (foura.res Ok) (fp.res Ok) (fsh.res Ok) (fun.res Ok)
@@ -63,7 +63,7 @@
  (ifdefmeta4.res
   (Pb
    "PROBLEM\n   exn = Unix.Unix_error(20, \"stat\", \"tests/ifdefmeta4.cocci\")\n"))
- (ifend.res Ok) (ifields.res Ok) (ifzer.res Ok) (inc.res Ok)
+ (ifend.res Ok) (ifields.res Ok) (ifzer.res Ok) (ifzz.res Ok) (inc.res Ok)
  (incdir.res
   (Pb
    "INCORRECT:diff token: x VS 12\nFile \"tests/incdir.c\", line 4, column 6,  charpos = 46\n    around = 'x', whole content =   foo(x);\nFile \"tests/incdir.res\", line 4, column 6,  charpos = 46\n    around = '12', whole content =   foo(12);\n\n    diff (result(<) vs expected_result(>)) = \n    @@ -1,5 +1,5 @@\n     #include \"sub/incdir2.c\"\n     \n     int main () {\n    -  foo(x);\n    +  foo(12);\n     }\n"))
  (null_type.res Ok)
  (oddifdef.res
   (Pb
-   "INCORRECT:diff token: } VS #ifdef FOO\nFile <COCCIOUTPUTFILE>, line 10, column 0,  charpos = 104\n    around = '}', whole content = }\nFile \"tests/oddifdef.res\", line 9, column 0,  charpos = 103\n    around = '#ifdef FOO', whole content = #ifdef FOO\n\n    diff (result(<) vs expected_result(>)) = \n    @@ -6,7 +6,11 @@\n         )\n         a = 5;\n     \n    -\n    +#ifdef FOO\n    +  x = 0;\n    +#else\n    +  x = 0;\n    +#endif\n     }\n     \n     void two() {\n    @@ -17,7 +21,11 @@\n     #endif\n         a = 3;\n     \n    -\n    +#ifdef FOO\n    +  x = 0;\n    +#else\n    +  x = 0;\n    +#endif\n     }\n     \n     void three() {\n    @@ -28,5 +36,9 @@\n         meth=SSLv2_client_method();\n     #endif\n     \n    -\n    +#ifdef FOO\n    +  x = 0;\n    +#else\n    +  x = 0;\n    +#endif\n     }\n"))
+   "INCORRECT:diff token: #else\n VS x\nFile <COCCIOUTPUTFILE>, line 10, column 0,  charpos = 114\n    around = '#else\n', whole content = #else\nFile \"tests/oddifdef.res\", line 10, column 2,  charpos = 116\n    around = 'x', whole content =   x = 0;\n\n    diff (result(<) vs expected_result(>)) = \n    @@ -7,8 +7,9 @@\n         a = 5;\n     \n     #ifdef FOO\n    +  x = 0;\n     #else\n    -\n    +  x = 0;\n     #endif\n     }\n     \n    @@ -21,8 +22,9 @@\n         a = 3;\n     \n     #ifdef FOO\n    +  x = 0;\n     #else\n    -\n    +  x = 0;\n     #endif\n     }\n     \n    @@ -35,7 +37,8 @@\n     #endif\n     \n     #ifdef FOO\n    +  x = 0;\n     #else\n    -\n    +  x = 0;\n     #endif\n     }\n"))
  (of.res Ok) (oneline.res Ok) (opt.res Ok) (optional_qualifier.res Ok)
  (optional_storage.res Ok) (orexp.res Ok) (overshoot.res Ok) (param.res Ok)
  (param_end.res Ok) (param_ver1.res Ok) (parameters_dots.res Ok)
diff --git a/tests/ifzz.c b/tests/ifzz.c
new file mode 100644 (file)
index 0000000..e5b0483
--- /dev/null
@@ -0,0 +1,13 @@
+if 0
+char c;
+#endif
+
+int foo(void)
+{
+  int i = 1;
+
+#if 0
+  TRACE("\n");
+#endif
+  return i;
+}
diff --git a/tests/ifzz.cocci b/tests/ifzz.cocci
new file mode 100644 (file)
index 0000000..5757568
--- /dev/null
@@ -0,0 +1,3 @@
+@@ @@
+-int
++size_t
diff --git a/tests/ifzz.res b/tests/ifzz.res
new file mode 100644 (file)
index 0000000..4aa4883
--- /dev/null
@@ -0,0 +1,13 @@
+if 0
+char c;
+#endif
+
+size_t foo(void)
+{
+  size_t i = 1;
+
+#if 0
+  TRACE("\n");
+#endif
+  return i;
+}
index ebd459f..e86f2fb 100644 (file)
@@ -26,12 +26,15 @@ ifneq ($(MAKECMDGOALS),distclean)
 include ../Makefile.config
 endif
 
+OCAMLCFLAGS ?= -g -dtypes
+OPTFLAGS ?= -g -dtypes
+
 PROGS=spp gitgrep splitpatch extract_c_and_res #generate_dependencies
 
 all: $(SUBDIRS) $(PROGS)
 
-# for recursive make
-all.opt: $(PROGS)
+all.opt:
+       @$(MAKE) $(PROGS) BUILD_OPT=yes
 
 gitgrep: gitgrep.ml
        $(OCAMLOPT) -o gitgrep str.cmxa gitgrep.ml
@@ -61,8 +64,8 @@ INCLUDE=-I ../commons -I ../extra -I  ../parsing_c
 LIBS=../commons/commons.cma ../globals/globals.cma \
      ../parsing_c/parsing_c.cma ../extra/extra.cma
 
-OCAMLC_CMD=$(OCAMLC) -g -dtypes $(INCLUDE)
-OCAMLOPT_CMD=$(OCAMLOPT) $(OPTFLAGS) $(INCLUDE)
+OCAMLC_CMD=$(OCAMLC) -thread $(OCAMLCFLAGS) $(INCLUDE)
+OCAMLOPT_CMD=$(OCAMLOPT) -thread $(OPTFLAGS) $(INCLUDE)
 OCAMLDEP_CMD=$(OCAMLDEP) $(INCLUDE)
 OCAMLMKTOP_CMD=$(OCAMLMKTOP) -g -custom $(INCLUDE)
 OCAMLYACC_CMD=$(OCAMLYACC) -v
@@ -104,3 +107,5 @@ ifneq ($(MAKECMDGOALS),distclean)
 -include .depend
 endif
 endif
+
+include ../Makefile.common
index 623284d..7e161df 100644 (file)
  *)
 
 
+# 0 "./alloc_free.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./alloc_free.ml"
 (* The following finds out for each file, how it does deallocation for each
 allocator *)
@@ -194,7 +221,7 @@ let _ =
   then
     begin
       let o = open_out (Printf.sprintf "%s/files" !dir) in
-      Printf.fprintf o "#!/bin/sh\n\n";
+      Printf.fprintf o "#! /bin/sh\n\n";
       sedify o !gen !dir l;
       sedify_ors o !gen !dir l;
       Printf.fprintf o "\nwait\n/bin/rm tmp*out\n";
index a9d8325..be852a1 100644 (file)
  *)
 
 
+# 0 "./bridge.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./bridge.ml"
 let drop_spaces s =
   String.concat "" (Str.split (Str.regexp "[ ]+") s)
index c1781ba..fe86b91 100644 (file)
  *)
 
 
+# 0 "./dir_stats.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./dir_stats.ml"
 (* for each marked thing, how often does it occur and in what files and
 directories *)
index 3bd1728..8c6bcb8 100644 (file)
  *)
 
 
+# 0 "./dumper.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./dumper.ml"
 (* Dump an OCaml value into a printable string.
  * By Richard W.M. Jones (rich@annexia.org).
index b639ec2..62d9f02 100644 (file)
  *)
 
 
+# 0 "./dumper.mli"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./dumper.mli"
 (* Dump an OCaml value into a printable string.
  * By Richard W.M. Jones (rich@annexia.org).
index 21bcc09..def4627 100644 (file)
  *)
 
 
+# 0 "./extract_c_and_res.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./extract_c_and_res.ml"
 open Common
 
index 82cd19c..5c23907 100644 (file)
  *)
 
 
+# 0 "./generate_dependencies.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./generate_dependencies.ml"
 open Common
 
index 69656a1..b4044f9 100644 (file)
  *)
 
 
+# 0 "./gitgrep.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./gitgrep.ml"
 (* adjust as convenient *)
 let prefix = "/tmp/"
index 01d5f70..244d515 100644 (file)
  *)
 
 
+# 0 "./gitsort.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./gitsort.ml"
 (* sort a list of git codes such that the most recent comes first *)
 
index 49f3ab0..d43f7dc 100644 (file)
  *)
 
 
+# 0 "./licensify.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./licensify.ml"
 let lines =
 ["Copyright 2012, INRIA";
index 5c0601a..9cbf295 100644 (file)
  *)
 
 
+# 0 "./process_isoprofile.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./process_isoprofile.ml"
 (* This is for processing information created with the -profile_iso option.
 Runs are assumed separated with a line beginning with =.
index 7774e4d..20352fa 100644 (file)
  *)
 
 
+# 0 "./splitpatch.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./splitpatch.ml"
 (* split patch per file *)
 
index c3af3ae..61ffcbc 100644 (file)
  *)
 
 
+# 0 "./spp.ml"
+(*
+ * Copyright 2012, INRIA
+ * Julia Lawall, Gilles Muller
+ * Copyright 2010-2011, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
+ * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
+ * This file is part of Coccinelle.
+ *
+ * Coccinelle is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, according to version 2 of the License.
+ *
+ * Coccinelle is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The authors reserve the right to distribute this or future versions of
+ * Coccinelle under other licenses.
+ *)
+
+
 # 0 "./spp.ml"
 open Common
 
diff --git a/version b/version
index 4a40da8..18fbab6 100644 (file)
--- a/version
+++ b/version
@@ -1 +1 @@
-1.0.0-rc12
\ No newline at end of file
+1.0.0-rc13
\ No newline at end of file
index 89fab3f..a5969ce 100644 (file)
@@ -1 +1,2 @@
 let version_date = "@CONFVERSION@"
+let configure_flags = "@CONFIGURE_FLAGS@"